1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Reuse the flags value from the add instructions instead of emitting separate 5*9880d681SAndroid Build Coastguard Worker; testl instructions. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Use the flags on the add. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: addl 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test 12*9880d681SAndroid Build Coastguard Worker; CHECK: cmovnsl 13*9880d681SAndroid Build Coastguard Worker; CHECK: ret 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32* %x, i32 %y, i32 %a, i32 %b) nounwind { 16*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %x, align 4 ; <i32> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker %tmp4 = add i32 %tmp2, %y ; <i32> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker %tmp5 = icmp slt i32 %tmp4, 0 ; <i1> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker %tmp.0 = select i1 %tmp5, i32 %a, i32 %b ; <i32> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.0 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32) 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Don't use the flags result of the and here, since the and has no 26*9880d681SAndroid Build Coastguard Worker; other use. A simple test is better. 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 29*9880d681SAndroid Build Coastguard Worker; CHECK: testb $16, {{%dil|%cl}} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32 %x) nounwind { 32*9880d681SAndroid Build Coastguard Worker %y = and i32 %x, 16 33*9880d681SAndroid Build Coastguard Worker %t = icmp eq i32 %y, 0 34*9880d681SAndroid Build Coastguard Worker br i1 %t, label %true, label %false 35*9880d681SAndroid Build Coastguard Workertrue: 36*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %x) 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Workerfalse: 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; Do use the flags result of the and here, since the and has another use. 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 45*9880d681SAndroid Build Coastguard Worker; CHECK: andl $16, %e 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jne 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32 %x) nounwind { 49*9880d681SAndroid Build Coastguard Worker %y = and i32 %x, 16 50*9880d681SAndroid Build Coastguard Worker %t = icmp eq i32 %y, 0 51*9880d681SAndroid Build Coastguard Worker br i1 %t, label %true, label %false 52*9880d681SAndroid Build Coastguard Workertrue: 53*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %y) 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Workerfalse: 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58