1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-darwin -mcpu=generic | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; XFAIL: * 3*9880d681SAndroid Build Coastguard Worker; rdar:15661073 simple example of redundant adds 4*9880d681SAndroid Build Coastguard Worker; 5*9880d681SAndroid Build Coastguard Worker; MachineCSE should coalesce trivial subregister copies. 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Worker; The extra movl+addl should be removed during MachineCSE. 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: redundantadd 9*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq 10*9880d681SAndroid Build Coastguard Worker; CHECK: movq 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl 12*9880d681SAndroid Build Coastguard Worker; CHECK: addl 13*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: addl 14*9880d681SAndroid Build Coastguard Worker; CHECK: ret 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i64 @redundantadd(i64* %a0, i64* %a1) { 17*9880d681SAndroid Build Coastguard Workerentry: 18*9880d681SAndroid Build Coastguard Worker %tmp8 = load i64, i64* %a0, align 8 19*9880d681SAndroid Build Coastguard Worker %tmp12 = load i64, i64* %a1, align 8 20*9880d681SAndroid Build Coastguard Worker %tmp13 = icmp ult i64 %tmp12, -281474976710656 21*9880d681SAndroid Build Coastguard Worker br i1 %tmp13, label %exit1, label %body 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerexit1: 24*9880d681SAndroid Build Coastguard Worker unreachable 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerbody: 27*9880d681SAndroid Build Coastguard Worker %tmp14 = trunc i64 %tmp8 to i32 28*9880d681SAndroid Build Coastguard Worker %tmp15 = trunc i64 %tmp12 to i32 29*9880d681SAndroid Build Coastguard Worker %tmp16 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %tmp14, i32 %tmp15) 30*9880d681SAndroid Build Coastguard Worker %tmp17 = extractvalue { i32, i1 } %tmp16, 1 31*9880d681SAndroid Build Coastguard Worker br i1 %tmp17, label %exit2, label %return 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerexit2: 34*9880d681SAndroid Build Coastguard Worker unreachable 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerreturn: 37*9880d681SAndroid Build Coastguard Worker %tmp18 = add i64 %tmp12, %tmp8 38*9880d681SAndroid Build Coastguard Worker %tmp19 = and i64 %tmp18, 4294967295 39*9880d681SAndroid Build Coastguard Worker %tmp20 = or i64 %tmp19, -281474976710656 40*9880d681SAndroid Build Coastguard Worker ret i64 %tmp20 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) 44