1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=generic -march=x86 -post-RA-scheduler=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; rdar://7226797 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; LLVM should omit the testl and use the flags result from the orl. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or: 7*9880d681SAndroid Build Coastguard Workerdefine void @or(float* %A, i32 %IA, i32 %N) nounwind { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %0 = ptrtoint float* %A to i32 ; <i32> [#uses=1] 10*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, 3 ; <i32> [#uses=1] 11*9880d681SAndroid Build Coastguard Worker %2 = xor i32 %IA, 1 ; <i32> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker; CHECK: orl %e 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 14*9880d681SAndroid Build Coastguard Worker %3 = or i32 %2, %1 ; <i32> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker br i1 %4, label %return, label %bb 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 19*9880d681SAndroid Build Coastguard Worker store float 0.000000e+00, float* %A, align 4 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor: 26*9880d681SAndroid Build Coastguard Workerdefine void @xor(float* %A, i32 %IA, i32 %N) nounwind { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker %0 = ptrtoint float* %A to i32 ; <i32> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, 3 ; <i32> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker; CHECK: xorl $1, %e 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 32*9880d681SAndroid Build Coastguard Worker %2 = xor i32 %IA, 1 ; <i32> [#uses=1] 33*9880d681SAndroid Build Coastguard Worker %3 = xor i32 %2, %1 ; <i32> [#uses=1] 34*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker br i1 %4, label %return, label %bb 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 38*9880d681SAndroid Build Coastguard Worker store float 0.000000e+00, float* %A, align 4 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and: 45*9880d681SAndroid Build Coastguard Workerdefine void @and(float* %A, i32 %IA, i32 %N, i8* %p) nounwind { 46*9880d681SAndroid Build Coastguard Workerentry: 47*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %p 48*9880d681SAndroid Build Coastguard Worker %0 = ptrtoint float* %A to i32 ; <i32> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, 3 ; <i32> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker %2 = xor i32 %IA, 1 ; <i32> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker; CHECK: andl $3, % 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movb % 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 54*9880d681SAndroid Build Coastguard Worker %3 = and i32 %2, %1 ; <i32> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker %t = trunc i32 %3 to i8 56*9880d681SAndroid Build Coastguard Worker store i8 %t, i8* %p 57*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1] 58*9880d681SAndroid Build Coastguard Worker br i1 %4, label %return, label %bb 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 61*9880d681SAndroid Build Coastguard Worker store float 0.000000e+00, float* null, align 4 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Just like @and, but without the trunc+store. This should use a testb 69*9880d681SAndroid Build Coastguard Worker; instead of an andl. 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test: 71*9880d681SAndroid Build Coastguard Workerdefine void @test(float* %A, i32 %IA, i32 %N, i8* %p) nounwind { 72*9880d681SAndroid Build Coastguard Workerentry: 73*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %p 74*9880d681SAndroid Build Coastguard Worker %0 = ptrtoint float* %A to i32 ; <i32> [#uses=1] 75*9880d681SAndroid Build Coastguard Worker %1 = and i32 %0, 3 ; <i32> [#uses=1] 76*9880d681SAndroid Build Coastguard Worker %2 = xor i32 %IA, 1 ; <i32> [#uses=1] 77*9880d681SAndroid Build Coastguard Worker; CHECK: testb $3, % 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 79*9880d681SAndroid Build Coastguard Worker %3 = and i32 %2, %1 ; <i32> [#uses=1] 80*9880d681SAndroid Build Coastguard Worker %4 = icmp eq i32 %3, 0 ; <i1> [#uses=1] 81*9880d681SAndroid Build Coastguard Worker br i1 %4, label %return, label %bb 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 84*9880d681SAndroid Build Coastguard Worker store float 0.000000e+00, float* null, align 4 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 88*9880d681SAndroid Build Coastguard Worker ret void 89*9880d681SAndroid Build Coastguard Worker} 90