1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=generic -mtriple=i686-unknown-unknown < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workerdefine i64 @test1(i32 %xx, i32 %test) nounwind { 3*9880d681SAndroid Build Coastguard Worker %conv = zext i32 %xx to i64 4*9880d681SAndroid Build Coastguard Worker %and = and i32 %test, 7 5*9880d681SAndroid Build Coastguard Worker %sh_prom = zext i32 %and to i64 6*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %conv, %sh_prom 7*9880d681SAndroid Build Coastguard Worker ret i64 %shl 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 9*9880d681SAndroid Build Coastguard Worker; CHECK: shll %cl, %eax 10*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %edx 11*9880d681SAndroid Build Coastguard Worker; CHECK: xorb $31 12*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %cl, %edx 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i64 @test2(i64 %xx, i32 %test) nounwind { 16*9880d681SAndroid Build Coastguard Worker %and = and i32 %test, 7 17*9880d681SAndroid Build Coastguard Worker %sh_prom = zext i32 %and to i64 18*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %xx, %sh_prom 19*9880d681SAndroid Build Coastguard Worker ret i64 %shl 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: shll %cl, %esi 22*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %edx 23*9880d681SAndroid Build Coastguard Worker; CHECK: xorb $31 24*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %cl, %edx 25*9880d681SAndroid Build Coastguard Worker; CHECK: orl %esi, %edx 26*9880d681SAndroid Build Coastguard Worker; CHECK: shll %cl, %eax 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64 %xx, i32 %test) nounwind { 30*9880d681SAndroid Build Coastguard Worker %and = and i32 %test, 7 31*9880d681SAndroid Build Coastguard Worker %sh_prom = zext i32 %and to i64 32*9880d681SAndroid Build Coastguard Worker %shr = lshr i64 %xx, %sh_prom 33*9880d681SAndroid Build Coastguard Worker ret i64 %shr 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 35*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %cl, %esi 36*9880d681SAndroid Build Coastguard Worker; CHECK: leal (%edx,%edx), %eax 37*9880d681SAndroid Build Coastguard Worker; CHECK: xorb $31, %cl 38*9880d681SAndroid Build Coastguard Worker; CHECK: shll %cl, %eax 39*9880d681SAndroid Build Coastguard Worker; CHECK: orl %esi, %eax 40*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %cl, %edx 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine i64 @test4(i64 %xx, i32 %test) nounwind { 44*9880d681SAndroid Build Coastguard Worker %and = and i32 %test, 7 45*9880d681SAndroid Build Coastguard Worker %sh_prom = zext i32 %and to i64 46*9880d681SAndroid Build Coastguard Worker %shr = ashr i64 %xx, %sh_prom 47*9880d681SAndroid Build Coastguard Worker ret i64 %shr 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 49*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %cl, %esi 50*9880d681SAndroid Build Coastguard Worker; CHECK: leal (%edx,%edx), %eax 51*9880d681SAndroid Build Coastguard Worker; CHECK: xorb $31, %cl 52*9880d681SAndroid Build Coastguard Worker; CHECK: shll %cl, %eax 53*9880d681SAndroid Build Coastguard Worker; CHECK: orl %esi, %eax 54*9880d681SAndroid Build Coastguard Worker; CHECK: sarl %cl, %edx 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; PR14668 58*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) { 59*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i64> %A, %B 60*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %shl 61*9880d681SAndroid Build Coastguard Worker; CHECK: test5 62*9880d681SAndroid Build Coastguard Worker; CHECK: shl 63*9880d681SAndroid Build Coastguard Worker; CHECK: shldl 64*9880d681SAndroid Build Coastguard Worker; CHECK: shl 65*9880d681SAndroid Build Coastguard Worker; CHECK: shldl 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; PR16108 69*9880d681SAndroid Build Coastguard Workerdefine i32 @test6() { 70*9880d681SAndroid Build Coastguard Worker %x = alloca i32, align 4 71*9880d681SAndroid Build Coastguard Worker %t = alloca i64, align 8 72*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %x, align 4 73*9880d681SAndroid Build Coastguard Worker store i64 1, i64* %t, align 8 ;; DEAD 74*9880d681SAndroid Build Coastguard Worker %load = load i32, i32* %x, align 4 75*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %load, 8 76*9880d681SAndroid Build Coastguard Worker %add = add i32 %shl, -224 77*9880d681SAndroid Build Coastguard Worker %sh_prom = zext i32 %add to i64 78*9880d681SAndroid Build Coastguard Worker %shl1 = shl i64 1, %sh_prom 79*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i64 %shl1, 4294967296 80*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 83*9880d681SAndroid Build Coastguard Worker ret i32 1 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry 86*9880d681SAndroid Build Coastguard Worker ret i32 0 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: andb $31 90*9880d681SAndroid Build Coastguard Worker; CHECK: sete 91*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl 92*9880d681SAndroid Build Coastguard Worker; CHECK: xorl $1 93*9880d681SAndroid Build Coastguard Worker; CHECK: orl 94*9880d681SAndroid Build Coastguard Worker} 95