1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" 4*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; These tests are extracted from bitcast.ll. 7*9880d681SAndroid Build Coastguard Worker; Verify that they also work correctly on big-endian targets. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine float @test2(<2 x float> %A, <2 x i32> %B) { 10*9880d681SAndroid Build Coastguard Worker %tmp28 = bitcast <2 x float> %A to i64 ; <i64> [#uses=2] 11*9880d681SAndroid Build Coastguard Worker %tmp23 = trunc i64 %tmp28 to i32 ; <i32> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker %tmp24 = bitcast i32 %tmp23 to float ; <float> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker %tmp = bitcast <2 x i32> %B to i64 15*9880d681SAndroid Build Coastguard Worker %tmp2 = trunc i64 %tmp to i32 ; <i32> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker %tmp4 = bitcast i32 %tmp2 to float ; <float> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker %add = fadd float %tmp24, %tmp4 19*9880d681SAndroid Build Coastguard Worker ret float %add 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp24 = extractelement <2 x float> %A, i32 1 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast <2 x i32> %B to <2 x float> 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp4 = extractelement <2 x float> {{.*}}, i32 1 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %add = fadd float %tmp24, %tmp4 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %add 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine float @test3(<2 x float> %A, <2 x i64> %B) { 30*9880d681SAndroid Build Coastguard Worker %tmp28 = bitcast <2 x float> %A to i64 31*9880d681SAndroid Build Coastguard Worker %tmp29 = lshr i64 %tmp28, 32 32*9880d681SAndroid Build Coastguard Worker %tmp23 = trunc i64 %tmp29 to i32 33*9880d681SAndroid Build Coastguard Worker %tmp24 = bitcast i32 %tmp23 to float 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker %tmp = bitcast <2 x i64> %B to i128 36*9880d681SAndroid Build Coastguard Worker %tmp1 = lshr i128 %tmp, 64 37*9880d681SAndroid Build Coastguard Worker %tmp2 = trunc i128 %tmp1 to i32 38*9880d681SAndroid Build Coastguard Worker %tmp4 = bitcast i32 %tmp2 to float 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker %add = fadd float %tmp24, %tmp4 41*9880d681SAndroid Build Coastguard Worker ret float %add 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp24 = extractelement <2 x float> %A, i32 0 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast <2 x i64> %B to <4 x float> 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp4 = extractelement <4 x float> {{.*}}, i32 1 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %add = fadd float %tmp24, %tmp4 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %add 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test4(i32 %A, i32 %B){ 52*9880d681SAndroid Build Coastguard Worker %tmp38 = zext i32 %A to i64 53*9880d681SAndroid Build Coastguard Worker %tmp32 = zext i32 %B to i64 54*9880d681SAndroid Build Coastguard Worker %tmp33 = shl i64 %tmp32, 32 55*9880d681SAndroid Build Coastguard Worker %ins35 = or i64 %tmp33, %tmp38 56*9880d681SAndroid Build Coastguard Worker %tmp43 = bitcast i64 %ins35 to <2 x i32> 57*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp43 58*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: @test4( 59*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: insertelement <2 x i32> undef, i32 %B, i32 0 60*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: insertelement <2 x i32> {{.*}}, i32 %A, i32 1 61*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret <2 x i32> 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test5(float %A, float %B) { 66*9880d681SAndroid Build Coastguard Worker %tmp37 = bitcast float %A to i32 67*9880d681SAndroid Build Coastguard Worker %tmp38 = zext i32 %tmp37 to i64 68*9880d681SAndroid Build Coastguard Worker %tmp31 = bitcast float %B to i32 69*9880d681SAndroid Build Coastguard Worker %tmp32 = zext i32 %tmp31 to i64 70*9880d681SAndroid Build Coastguard Worker %tmp33 = shl i64 %tmp32, 32 71*9880d681SAndroid Build Coastguard Worker %ins35 = or i64 %tmp33, %tmp38 72*9880d681SAndroid Build Coastguard Worker %tmp43 = bitcast i64 %ins35 to <2 x float> 73*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp43 74*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: @test5( 75*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: insertelement <2 x float> undef, float %B, i32 0 76*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: insertelement <2 x float> {{.*}}, float %A, i32 1 77*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret <2 x float> 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test6(float %A){ 81*9880d681SAndroid Build Coastguard Worker %tmp23 = bitcast float %A to i32 ; <i32> [#uses=1] 82*9880d681SAndroid Build Coastguard Worker %tmp24 = zext i32 %tmp23 to i64 ; <i64> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker %tmp25 = shl i64 %tmp24, 32 ; <i64> [#uses=1] 84*9880d681SAndroid Build Coastguard Worker %mask20 = or i64 %tmp25, 1109917696 ; <i64> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker %tmp35 = bitcast i64 %mask20 to <2 x float> ; <<2 x float>> [#uses=1] 86*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp35 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: insertelement <2 x float> undef, float %A, i32 0 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: insertelement <2 x float> {{.*}}, float 4.200000e+01, i32 1 90*9880d681SAndroid Build Coastguard Worker; CHECK: ret 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; Verify that 'xor' of vector and constant is done as a vector bitwise op before the bitcast. 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @xor_bitcast_vec_to_vec(<1 x i64> %a) { 96*9880d681SAndroid Build Coastguard Worker %t1 = bitcast <1 x i64> %a to <2 x i32> 97*9880d681SAndroid Build Coastguard Worker %t2 = xor <2 x i32> <i32 1, i32 2>, %t1 98*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %t2 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xor_bitcast_vec_to_vec( 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t21 = xor <1 x i64> %a, <i64 4294967298> 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t2 = bitcast <1 x i64> %t21 to <2 x i32> 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i32> %t2 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; Verify that 'and' of integer and constant is done as a vector bitwise op before the bitcast. 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine i64 @and_bitcast_vec_to_int(<2 x i32> %a) { 109*9880d681SAndroid Build Coastguard Worker %t1 = bitcast <2 x i32> %a to i64 110*9880d681SAndroid Build Coastguard Worker %t2 = and i64 %t1, 3 111*9880d681SAndroid Build Coastguard Worker ret i64 %t2 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @and_bitcast_vec_to_int( 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t21 = and <2 x i32> %a, <i32 0, i32 3> 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t2 = bitcast <2 x i32> %t21 to i64 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %t2 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; Verify that 'or' of vector and constant is done as an integer bitwise op before the bitcast. 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @or_bitcast_int_to_vec(i64 %a) { 122*9880d681SAndroid Build Coastguard Worker %t1 = bitcast i64 %a to <2 x i32> 123*9880d681SAndroid Build Coastguard Worker %t2 = or <2 x i32> %t1, <i32 1, i32 2> 124*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %t2 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @or_bitcast_int_to_vec( 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t21 = or i64 %a, 4294967298 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %t2 = bitcast i64 %t21 to <2 x i32> 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i32> %t2 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132