1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s -check-prefix=X32 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse2 | FileCheck %s -check-prefix=X64 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+sse2 | FileCheck %s -check-prefix=X64 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Though it is undefined, we want xor undef,undef to produce zero. 6*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test1() nounwind { 7*9880d681SAndroid Build Coastguard Worker %tmp = xor <4 x i32> undef, undef 8*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test1: 11*9880d681SAndroid Build Coastguard Worker; X32: xorps %xmm0, %xmm0 12*9880d681SAndroid Build Coastguard Worker; X32: ret 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; Though it is undefined, we want xor undef,undef to produce zero. 16*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() nounwind{ 17*9880d681SAndroid Build Coastguard Worker %tmp = xor i32 undef, undef 18*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 19*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test2: 20*9880d681SAndroid Build Coastguard Worker; X32: xorl %eax, %eax 21*9880d681SAndroid Build Coastguard Worker; X32: ret 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %a, i32 %b) nounwind { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker %tmp1not = xor i32 %b, -2 27*9880d681SAndroid Build Coastguard Worker %tmp3 = and i32 %tmp1not, %a 28*9880d681SAndroid Build Coastguard Worker %tmp4 = lshr i32 %tmp3, 1 29*9880d681SAndroid Build Coastguard Worker ret i32 %tmp4 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test3: 32*9880d681SAndroid Build Coastguard Worker; X64: notl 33*9880d681SAndroid Build Coastguard Worker; X64: andl 34*9880d681SAndroid Build Coastguard Worker; X64: shrl 35*9880d681SAndroid Build Coastguard Worker; X64: ret 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test3: 38*9880d681SAndroid Build Coastguard Worker; X32: movl 8(%esp), %eax 39*9880d681SAndroid Build Coastguard Worker; X32: notl %eax 40*9880d681SAndroid Build Coastguard Worker; X32: andl 4(%esp), %eax 41*9880d681SAndroid Build Coastguard Worker; X32: shrl %eax 42*9880d681SAndroid Build Coastguard Worker; X32: ret 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %a, i32 %b) nounwind { 46*9880d681SAndroid Build Coastguard Workerentry: 47*9880d681SAndroid Build Coastguard Worker br label %bb 48*9880d681SAndroid Build Coastguard Workerbb: 49*9880d681SAndroid Build Coastguard Worker %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ] 50*9880d681SAndroid Build Coastguard Worker %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ] 51*9880d681SAndroid Build Coastguard Worker %tmp3 = xor i32 %a_addr.0, %b_addr.0 52*9880d681SAndroid Build Coastguard Worker %tmp4not = xor i32 %tmp3, 2147483647 53*9880d681SAndroid Build Coastguard Worker %tmp6 = and i32 %tmp4not, %b_addr.0 54*9880d681SAndroid Build Coastguard Worker %tmp8 = shl i32 %tmp6, 1 55*9880d681SAndroid Build Coastguard Worker %tmp10 = icmp eq i32 %tmp8, 0 56*9880d681SAndroid Build Coastguard Worker br i1 %tmp10, label %bb12, label %bb 57*9880d681SAndroid Build Coastguard Workerbb12: 58*9880d681SAndroid Build Coastguard Worker ret i32 %tmp3 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test4: 61*9880d681SAndroid Build Coastguard Worker; X64: notl [[REG:%[a-z]+]] 62*9880d681SAndroid Build Coastguard Worker; X64: andl {{.*}}[[REG]] 63*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test4: 64*9880d681SAndroid Build Coastguard Worker; X32: notl [[REG:%[a-z]+]] 65*9880d681SAndroid Build Coastguard Worker; X32: andl {{.*}}[[REG]] 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine i16 @test5(i16 %a, i16 %b) nounwind { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker br label %bb 71*9880d681SAndroid Build Coastguard Workerbb: 72*9880d681SAndroid Build Coastguard Worker %b_addr.0 = phi i16 [ %b, %entry ], [ %tmp8, %bb ] 73*9880d681SAndroid Build Coastguard Worker %a_addr.0 = phi i16 [ %a, %entry ], [ %tmp3, %bb ] 74*9880d681SAndroid Build Coastguard Worker %tmp3 = xor i16 %a_addr.0, %b_addr.0 75*9880d681SAndroid Build Coastguard Worker %tmp4not = xor i16 %tmp3, 32767 76*9880d681SAndroid Build Coastguard Worker %tmp6 = and i16 %tmp4not, %b_addr.0 77*9880d681SAndroid Build Coastguard Worker %tmp8 = shl i16 %tmp6, 1 78*9880d681SAndroid Build Coastguard Worker %tmp10 = icmp eq i16 %tmp8, 0 79*9880d681SAndroid Build Coastguard Worker br i1 %tmp10, label %bb12, label %bb 80*9880d681SAndroid Build Coastguard Workerbb12: 81*9880d681SAndroid Build Coastguard Worker ret i16 %tmp3 82*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test5: 83*9880d681SAndroid Build Coastguard Worker; X64: notl [[REG:%[a-z]+]] 84*9880d681SAndroid Build Coastguard Worker; X64: andl {{.*}}[[REG]] 85*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test5: 86*9880d681SAndroid Build Coastguard Worker; X32: notl [[REG:%[a-z]+]] 87*9880d681SAndroid Build Coastguard Worker; X32: andl {{.*}}[[REG]] 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine i8 @test6(i8 %a, i8 %b) nounwind { 91*9880d681SAndroid Build Coastguard Workerentry: 92*9880d681SAndroid Build Coastguard Worker br label %bb 93*9880d681SAndroid Build Coastguard Workerbb: 94*9880d681SAndroid Build Coastguard Worker %b_addr.0 = phi i8 [ %b, %entry ], [ %tmp8, %bb ] 95*9880d681SAndroid Build Coastguard Worker %a_addr.0 = phi i8 [ %a, %entry ], [ %tmp3, %bb ] 96*9880d681SAndroid Build Coastguard Worker %tmp3 = xor i8 %a_addr.0, %b_addr.0 97*9880d681SAndroid Build Coastguard Worker %tmp4not = xor i8 %tmp3, 127 98*9880d681SAndroid Build Coastguard Worker %tmp6 = and i8 %tmp4not, %b_addr.0 99*9880d681SAndroid Build Coastguard Worker %tmp8 = shl i8 %tmp6, 1 100*9880d681SAndroid Build Coastguard Worker %tmp10 = icmp eq i8 %tmp8, 0 101*9880d681SAndroid Build Coastguard Worker br i1 %tmp10, label %bb12, label %bb 102*9880d681SAndroid Build Coastguard Workerbb12: 103*9880d681SAndroid Build Coastguard Worker ret i8 %tmp3 104*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test6: 105*9880d681SAndroid Build Coastguard Worker; X64: notb [[REG:%[a-z]+]] 106*9880d681SAndroid Build Coastguard Worker; X64: andb {{.*}}[[REG]] 107*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test6: 108*9880d681SAndroid Build Coastguard Worker; X32: notb [[REG:%[a-z]+]] 109*9880d681SAndroid Build Coastguard Worker; X32: andb {{.*}}[[REG]] 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %a, i32 %b) nounwind { 113*9880d681SAndroid Build Coastguard Workerentry: 114*9880d681SAndroid Build Coastguard Worker br label %bb 115*9880d681SAndroid Build Coastguard Workerbb: 116*9880d681SAndroid Build Coastguard Worker %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ] 117*9880d681SAndroid Build Coastguard Worker %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ] 118*9880d681SAndroid Build Coastguard Worker %tmp3 = xor i32 %a_addr.0, %b_addr.0 119*9880d681SAndroid Build Coastguard Worker %tmp4not = xor i32 %tmp3, 2147483646 120*9880d681SAndroid Build Coastguard Worker %tmp6 = and i32 %tmp4not, %b_addr.0 121*9880d681SAndroid Build Coastguard Worker %tmp8 = shl i32 %tmp6, 1 122*9880d681SAndroid Build Coastguard Worker %tmp10 = icmp eq i32 %tmp8, 0 123*9880d681SAndroid Build Coastguard Worker br i1 %tmp10, label %bb12, label %bb 124*9880d681SAndroid Build Coastguard Workerbb12: 125*9880d681SAndroid Build Coastguard Worker ret i32 %tmp3 126*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test7: 127*9880d681SAndroid Build Coastguard Worker; X64: xorl $2147483646, [[REG:%[a-z]+]] 128*9880d681SAndroid Build Coastguard Worker; X64: andl {{.*}}[[REG]] 129*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test7: 130*9880d681SAndroid Build Coastguard Worker; X32: xorl $2147483646, [[REG:%[a-z]+]] 131*9880d681SAndroid Build Coastguard Worker; X32: andl {{.*}}[[REG]] 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %a) nounwind { 135*9880d681SAndroid Build Coastguard Worker; rdar://7553032 136*9880d681SAndroid Build Coastguard Workerentry: 137*9880d681SAndroid Build Coastguard Worker %t1 = sub i32 0, %a 138*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t1, -1 139*9880d681SAndroid Build Coastguard Worker ret i32 %t2 140*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test8: 141*9880d681SAndroid Build Coastguard Worker; X64: notl {{%eax|%edi|%ecx}} 142*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test8: 143*9880d681SAndroid Build Coastguard Worker; X32: notl %eax 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %a) nounwind { 147*9880d681SAndroid Build Coastguard Worker %1 = and i32 %a, 4096 148*9880d681SAndroid Build Coastguard Worker %2 = xor i32 %1, 4096 149*9880d681SAndroid Build Coastguard Worker ret i32 %2 150*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test9: 151*9880d681SAndroid Build Coastguard Worker; X64: notl [[REG:%[a-z]+]] 152*9880d681SAndroid Build Coastguard Worker; X64: andl {{.*}}[[REG:%[a-z]+]] 153*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test9: 154*9880d681SAndroid Build Coastguard Worker; X32: notl [[REG:%[a-z]+]] 155*9880d681SAndroid Build Coastguard Worker; X32: andl {{.*}}[[REG:%[a-z]+]] 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; PR15948 159*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test10(<4 x i32> %a) nounwind { 160*9880d681SAndroid Build Coastguard Worker %1 = and <4 x i32> %a, <i32 4096, i32 4096, i32 4096, i32 4096> 161*9880d681SAndroid Build Coastguard Worker %2 = xor <4 x i32> %1, <i32 4096, i32 4096, i32 4096, i32 4096> 162*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 163*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test10: 164*9880d681SAndroid Build Coastguard Worker; X64: andnps 165*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test10: 166*9880d681SAndroid Build Coastguard Worker; X32: andnps 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdefine i32 @PR17487(i1 %tobool) { 170*9880d681SAndroid Build Coastguard Worker %tmp = insertelement <2 x i1> undef, i1 %tobool, i32 1 171*9880d681SAndroid Build Coastguard Worker %tmp1 = zext <2 x i1> %tmp to <2 x i64> 172*9880d681SAndroid Build Coastguard Worker %tmp2 = xor <2 x i64> %tmp1, <i64 1, i64 1> 173*9880d681SAndroid Build Coastguard Worker %tmp3 = extractelement <2 x i64> %tmp2, i32 1 174*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 0, %tmp3 175*9880d681SAndroid Build Coastguard Worker %cmp6 = icmp ne i64 %add, 1 176*9880d681SAndroid Build Coastguard Worker %conv7 = zext i1 %cmp6 to i32 177*9880d681SAndroid Build Coastguard Worker ret i32 %conv7 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; X64-LABEL: PR17487: 180*9880d681SAndroid Build Coastguard Worker; X64: andn 181*9880d681SAndroid Build Coastguard Worker; X32-LABEL: PR17487: 182*9880d681SAndroid Build Coastguard Worker; X32: andn 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %b) { 186*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %b 187*9880d681SAndroid Build Coastguard Worker %neg = xor i32 %shl, -1 188*9880d681SAndroid Build Coastguard Worker ret i32 %neg 189*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test11: 190*9880d681SAndroid Build Coastguard Worker; X64: movl $-2, %[[REG:.*]] 191*9880d681SAndroid Build Coastguard Worker; X64: roll %{{.*}}, %[[REG]] 192*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test11: 193*9880d681SAndroid Build Coastguard Worker; X32: movl $-2, %[[REG:.*]] 194*9880d681SAndroid Build Coastguard Worker; X32: roll %{{.*}}, %[[REG]] 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker%struct.ref_s = type { %union.v, i16, i16 } 198*9880d681SAndroid Build Coastguard Worker%union.v = type { i64 } 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Workerdefine %struct.ref_s* @test12(%struct.ref_s* %op, i64 %osbot, i64 %intval) { 201*9880d681SAndroid Build Coastguard Worker %neg = shl i64 %intval, 32 202*9880d681SAndroid Build Coastguard Worker %sext = xor i64 %neg, -4294967296 203*9880d681SAndroid Build Coastguard Worker %idx.ext = ashr exact i64 %sext, 32 204*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds %struct.ref_s, %struct.ref_s* %op, i64 %idx.ext 205*9880d681SAndroid Build Coastguard Worker ret %struct.ref_s* %add.ptr 206*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test12: 207*9880d681SAndroid Build Coastguard Worker; X64: shlq $32, %[[REG:.*]] 208*9880d681SAndroid Build Coastguard Worker; X64-NOT: not 209*9880d681SAndroid Build Coastguard Worker; X64: sarq $28, %[[REG]] 210*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test12: 211*9880d681SAndroid Build Coastguard Worker; X32: leal 212*9880d681SAndroid Build Coastguard Worker; X32-NOT: not 213*9880d681SAndroid Build Coastguard Worker; X32: shll $2, %eax 214*9880d681SAndroid Build Coastguard Worker} 215