1*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 6*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @llvm.bswap.i32(i32 %i) 7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %i) { 8*9880d681SAndroid Build Coastguard Worker %tmp1 = lshr i32 %i, 24 9*9880d681SAndroid Build Coastguard Worker %tmp3 = lshr i32 %i, 8 10*9880d681SAndroid Build Coastguard Worker %tmp4 = and i32 %tmp3, 65280 11*9880d681SAndroid Build Coastguard Worker %tmp5 = or i32 %tmp1, %tmp4 12*9880d681SAndroid Build Coastguard Worker %tmp7 = shl i32 %i, 8 13*9880d681SAndroid Build Coastguard Worker %tmp8 = and i32 %tmp7, 16711680 14*9880d681SAndroid Build Coastguard Worker %tmp9 = or i32 %tmp5, %tmp8 15*9880d681SAndroid Build Coastguard Worker %tmp11 = shl i32 %i, 24 16*9880d681SAndroid Build Coastguard Worker %tmp12 = or i32 %tmp9, %tmp11 17*9880d681SAndroid Build Coastguard Worker ret i32 %tmp12 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 21*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @llvm.bswap.i32(i32 %arg) 22*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %arg) { 23*9880d681SAndroid Build Coastguard Worker %tmp2 = shl i32 %arg, 24 24*9880d681SAndroid Build Coastguard Worker %tmp4 = shl i32 %arg, 8 25*9880d681SAndroid Build Coastguard Worker %tmp5 = and i32 %tmp4, 16711680 26*9880d681SAndroid Build Coastguard Worker %tmp6 = or i32 %tmp2, %tmp5 27*9880d681SAndroid Build Coastguard Worker %tmp8 = lshr i32 %arg, 8 28*9880d681SAndroid Build Coastguard Worker %tmp9 = and i32 %tmp8, 65280 29*9880d681SAndroid Build Coastguard Worker %tmp10 = or i32 %tmp6, %tmp9 30*9880d681SAndroid Build Coastguard Worker %tmp12 = lshr i32 %arg, 24 31*9880d681SAndroid Build Coastguard Worker %tmp14 = or i32 %tmp10, %tmp12 32*9880d681SAndroid Build Coastguard Worker ret i32 %tmp14 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 36*9880d681SAndroid Build Coastguard Worker; CHECK: call i16 @llvm.bswap.i16(i16 %s) 37*9880d681SAndroid Build Coastguard Workerdefine i16 @test3(i16 %s) { 38*9880d681SAndroid Build Coastguard Worker %tmp2 = lshr i16 %s, 8 39*9880d681SAndroid Build Coastguard Worker %tmp4 = shl i16 %s, 8 40*9880d681SAndroid Build Coastguard Worker %tmp5 = or i16 %tmp2, %tmp4 41*9880d681SAndroid Build Coastguard Worker ret i16 %tmp5 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 45*9880d681SAndroid Build Coastguard Worker; CHECK: call i16 @llvm.bswap.i16(i16 %s) 46*9880d681SAndroid Build Coastguard Workerdefine i16 @test4(i16 %s) { 47*9880d681SAndroid Build Coastguard Worker %tmp2 = lshr i16 %s, 8 48*9880d681SAndroid Build Coastguard Worker %tmp4 = shl i16 %s, 8 49*9880d681SAndroid Build Coastguard Worker %tmp5 = or i16 %tmp4, %tmp2 50*9880d681SAndroid Build Coastguard Worker ret i16 %tmp5 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 54*9880d681SAndroid Build Coastguard Worker; CHECK: call i16 @llvm.bswap.i16(i16 %a) 55*9880d681SAndroid Build Coastguard Workerdefine i16 @test5(i16 %a) { 56*9880d681SAndroid Build Coastguard Worker %tmp = zext i16 %a to i32 57*9880d681SAndroid Build Coastguard Worker %tmp1 = and i32 %tmp, 65280 58*9880d681SAndroid Build Coastguard Worker %tmp2 = ashr i32 %tmp1, 8 59*9880d681SAndroid Build Coastguard Worker %tmp2.upgrd.1 = trunc i32 %tmp2 to i16 60*9880d681SAndroid Build Coastguard Worker %tmp4 = and i32 %tmp, 255 61*9880d681SAndroid Build Coastguard Worker %tmp5 = shl i32 %tmp4, 8 62*9880d681SAndroid Build Coastguard Worker %tmp5.upgrd.2 = trunc i32 %tmp5 to i16 63*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.3 = or i16 %tmp2.upgrd.1, %tmp5.upgrd.2 64*9880d681SAndroid Build Coastguard Worker %tmp6 = bitcast i16 %tmp.upgrd.3 to i16 65*9880d681SAndroid Build Coastguard Worker %tmp6.upgrd.4 = zext i16 %tmp6 to i32 66*9880d681SAndroid Build Coastguard Worker %retval = trunc i32 %tmp6.upgrd.4 to i16 67*9880d681SAndroid Build Coastguard Worker ret i16 %retval 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; PR2842 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6 72*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @llvm.bswap.i32(i32 %x) 73*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %x) nounwind readnone { 74*9880d681SAndroid Build Coastguard Worker %tmp = shl i32 %x, 16 75*9880d681SAndroid Build Coastguard Worker %x.mask = and i32 %x, 65280 76*9880d681SAndroid Build Coastguard Worker %tmp1 = lshr i32 %x, 16 77*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %tmp1, 255 78*9880d681SAndroid Build Coastguard Worker %tmp3 = or i32 %x.mask, %tmp 79*9880d681SAndroid Build Coastguard Worker %tmp4 = or i32 %tmp3, %tmp2 80*9880d681SAndroid Build Coastguard Worker %tmp5 = shl i32 %tmp4, 8 81*9880d681SAndroid Build Coastguard Worker %tmp6 = lshr i32 %x, 24 82*9880d681SAndroid Build Coastguard Worker %tmp7 = or i32 %tmp5, %tmp6 83*9880d681SAndroid Build Coastguard Worker ret i32 %tmp7 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; PR23863 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7 88*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @llvm.bswap.i32(i32 %x) 89*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %x) { 90*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 16 91*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %x, 16 92*9880d681SAndroid Build Coastguard Worker %or = or i32 %shl, %shr 93*9880d681SAndroid Build Coastguard Worker %and2 = shl i32 %or, 8 94*9880d681SAndroid Build Coastguard Worker %shl3 = and i32 %and2, -16711936 95*9880d681SAndroid Build Coastguard Worker %and4 = lshr i32 %or, 8 96*9880d681SAndroid Build Coastguard Worker %shr5 = and i32 %and4, 16711935 97*9880d681SAndroid Build Coastguard Worker %or6 = or i32 %shl3, %shr5 98*9880d681SAndroid Build Coastguard Worker ret i32 %or6 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8 102*9880d681SAndroid Build Coastguard Worker; CHECK: call i16 @llvm.bswap.i16(i16 %a) 103*9880d681SAndroid Build Coastguard Workerdefine i16 @test8(i16 %a) { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %a to i32 106*9880d681SAndroid Build Coastguard Worker %shr = lshr i16 %a, 8 107*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %conv, 8 108*9880d681SAndroid Build Coastguard Worker %conv1 = zext i16 %shr to i32 109*9880d681SAndroid Build Coastguard Worker %or = or i32 %conv1, %shl 110*9880d681SAndroid Build Coastguard Worker %conv2 = trunc i32 %or to i16 111*9880d681SAndroid Build Coastguard Worker ret i16 %conv2 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9 115*9880d681SAndroid Build Coastguard Worker; CHECK: call i16 @llvm.bswap.i16(i16 %a) 116*9880d681SAndroid Build Coastguard Workerdefine i16 @test9(i16 %a) { 117*9880d681SAndroid Build Coastguard Workerentry: 118*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %a to i32 119*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %conv, 8 120*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %conv, 8 121*9880d681SAndroid Build Coastguard Worker %or = or i32 %shr, %shl 122*9880d681SAndroid Build Coastguard Worker %conv2 = trunc i32 %or to i16 123*9880d681SAndroid Build Coastguard Worker ret i16 %conv2 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10 127*9880d681SAndroid Build Coastguard Worker; CHECK: trunc i32 %a to i16 128*9880d681SAndroid Build Coastguard Worker; CHECK: call i16 @llvm.bswap.i16(i16 %trunc) 129*9880d681SAndroid Build Coastguard Workerdefine i16 @test10(i32 %a) { 130*9880d681SAndroid Build Coastguard Worker %shr1 = lshr i32 %a, 8 131*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %shr1, 255 132*9880d681SAndroid Build Coastguard Worker %and2 = shl i32 %a, 8 133*9880d681SAndroid Build Coastguard Worker %shl1 = and i32 %and2, 65280 134*9880d681SAndroid Build Coastguard Worker %or = or i32 %and1, %shl1 135*9880d681SAndroid Build Coastguard Worker %conv = trunc i32 %or to i16 136*9880d681SAndroid Build Coastguard Worker ret i16 %conv 137*9880d681SAndroid Build Coastguard Worker} 138