1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; Tests to make sure elimination of casts is working correctly 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker@inbuf = external global [32832 x i8] ; <[32832 x i8]*> [#uses=1] 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A 11*9880d681SAndroid Build Coastguard Worker; 12*9880d681SAndroid Build Coastguard Worker %c1 = bitcast i32 %A to i32 ; <i32> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker %c2 = bitcast i32 %c1 to i32 ; <i32> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker ret i32 %c2 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine i64 @test2(i8 %A) { 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RET:%.*]] = zext i8 %A to i64 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[RET]] 21*9880d681SAndroid Build Coastguard Worker; 22*9880d681SAndroid Build Coastguard Worker %c1 = zext i8 %A to i16 ; <i16> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker %c2 = zext i16 %c1 to i32 ; <i32> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker %Ret = zext i32 %c2 to i64 ; <i64> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker ret i64 %Ret 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; This function should just use bitwise AND 29*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64 %A) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C2:%.*]] = and i64 %A, 255 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[C2]] 33*9880d681SAndroid Build Coastguard Worker; 34*9880d681SAndroid Build Coastguard Worker %c1 = trunc i64 %A to i8 ; <i8> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker %c2 = zext i8 %c1 to i64 ; <i64> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker ret i64 %c2 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %A, i32 %B) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 %A, %B 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RESULT:%.*]] = zext i1 [[COND]] to i32 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[RESULT]] 44*9880d681SAndroid Build Coastguard Worker; 45*9880d681SAndroid Build Coastguard Worker %COND = icmp slt i32 %A, %B ; <i1> [#uses=1] 46*9880d681SAndroid Build Coastguard Worker ; Booleans are unsigned integrals 47*9880d681SAndroid Build Coastguard Worker %c = zext i1 %COND to i8 ; <i8> [#uses=1] 48*9880d681SAndroid Build Coastguard Worker ; for the cast elim purpose 49*9880d681SAndroid Build Coastguard Worker %result = zext i8 %c to i32 ; <i32> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker ret i32 %result 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i1 %B) { 54*9880d681SAndroid Build Coastguard Worker ; This cast should get folded into 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RESULT:%.*]] = zext i1 %B to i32 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[RESULT]] 58*9880d681SAndroid Build Coastguard Worker; 59*9880d681SAndroid Build Coastguard Worker %c = zext i1 %B to i8 ; <i8> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker ; this cast 61*9880d681SAndroid Build Coastguard Worker %result = zext i8 %c to i32 ; <i32> [#uses=1] 62*9880d681SAndroid Build Coastguard Worker ret i32 %result 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i64 %A) { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C1:%.*]] = trunc i64 %A to i32 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C1]] 69*9880d681SAndroid Build Coastguard Worker; 70*9880d681SAndroid Build Coastguard Worker %c1 = trunc i64 %A to i32 ; <i32> [#uses=1] 71*9880d681SAndroid Build Coastguard Worker %res = bitcast i32 %c1 to i32 ; <i32> [#uses=1] 72*9880d681SAndroid Build Coastguard Worker ret i32 %res 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine i64 @test7(i1 %A) { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = zext i1 %A to i64 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[RES]] 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker %c1 = zext i1 %A to i32 ; <i32> [#uses=1] 81*9880d681SAndroid Build Coastguard Worker %res = sext i32 %c1 to i64 ; <i64> [#uses=1] 82*9880d681SAndroid Build Coastguard Worker ret i64 %res 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine i64 @test8(i8 %A) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C1:%.*]] = sext i8 %A to i64 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[C1]] 89*9880d681SAndroid Build Coastguard Worker; 90*9880d681SAndroid Build Coastguard Worker %c1 = sext i8 %A to i64 ; <i64> [#uses=1] 91*9880d681SAndroid Build Coastguard Worker %res = bitcast i64 %c1 to i64 ; <i64> [#uses=1] 92*9880d681SAndroid Build Coastguard Worker ret i64 %res 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine i16 @test9(i16 %A) { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 %A 98*9880d681SAndroid Build Coastguard Worker; 99*9880d681SAndroid Build Coastguard Worker %c1 = sext i16 %A to i32 ; <i32> [#uses=1] 100*9880d681SAndroid Build Coastguard Worker %c2 = trunc i32 %c1 to i16 ; <i16> [#uses=1] 101*9880d681SAndroid Build Coastguard Worker ret i16 %c2 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine i16 @test10(i16 %A) { 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 %A 107*9880d681SAndroid Build Coastguard Worker; 108*9880d681SAndroid Build Coastguard Worker %c1 = sext i16 %A to i32 ; <i32> [#uses=1] 109*9880d681SAndroid Build Coastguard Worker %c2 = trunc i32 %c1 to i16 ; <i16> [#uses=1] 110*9880d681SAndroid Build Coastguard Worker ret i16 %c2 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdeclare void @varargs(i32, ...) 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine void @test11(i32* %P) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void (i32, ...) @varargs(i32 5, i32* %P) 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 119*9880d681SAndroid Build Coastguard Worker; 120*9880d681SAndroid Build Coastguard Worker %c = bitcast i32* %P to i16* ; <i16*> [#uses=1] 121*9880d681SAndroid Build Coastguard Worker call void (i32, ...) @varargs( i32 5, i16* %c ) 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...) 126*9880d681SAndroid Build Coastguard Workerdefine void @test_invoke_vararg_cast(i32* %a, i32* %b) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_invoke_vararg_cast( 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: invoke void (i32, ...) @varargs(i32 1, i32* %b, i32* %a) 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: to label %invoke.cont unwind label %lpad 131*9880d681SAndroid Build Coastguard Worker; CHECK: invoke.cont: 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 133*9880d681SAndroid Build Coastguard Worker; CHECK: lpad: 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 135*9880d681SAndroid Build Coastguard Worker; 136*9880d681SAndroid Build Coastguard Workerentry: 137*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32* %b to i8* 138*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32* %a to i64* 139*9880d681SAndroid Build Coastguard Worker invoke void (i32, ...) @varargs(i32 1, i8* %0, i64* %1) 140*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerinvoke.cont: ; preds = %entry 143*9880d681SAndroid Build Coastguard Worker ret void 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerlpad: ; preds = %entry 146*9880d681SAndroid Build Coastguard Worker %2 = landingpad { i8*, i32 } 147*9880d681SAndroid Build Coastguard Worker cleanup 148*9880d681SAndroid Build Coastguard Worker ret void 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i8* @test13(i64 %A) { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = getelementptr [32832 x i8], [32832 x i8]* @inbuf, i64 0, i64 %A 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8* [[C]] 155*9880d681SAndroid Build Coastguard Worker; 156*9880d681SAndroid Build Coastguard Worker %c = getelementptr [0 x i8], [0 x i8]* bitcast ([32832 x i8]* @inbuf to [0 x i8]*), i64 0, i64 %A ; <i8*> [#uses=1] 157*9880d681SAndroid Build Coastguard Worker ret i8* %c 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i8 %A) { 161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[X:%.*]] = icmp sgt i8 %A, -1 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[X]] 164*9880d681SAndroid Build Coastguard Worker; 165*9880d681SAndroid Build Coastguard Worker %c = bitcast i8 %A to i8 ; <i8> [#uses=1] 166*9880d681SAndroid Build Coastguard Worker %X = icmp ult i8 %c, -128 ; <i1> [#uses=1] 167*9880d681SAndroid Build Coastguard Worker ret i1 %X 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; This just won't occur when there's no difference between ubyte and sbyte 172*9880d681SAndroid Build Coastguard Worker;bool %test15(ubyte %A) { 173*9880d681SAndroid Build Coastguard Worker; %c = cast ubyte %A to sbyte 174*9880d681SAndroid Build Coastguard Worker; %X = setlt sbyte %c, 0 ; setgt %A, 127 175*9880d681SAndroid Build Coastguard Worker; ret bool %X 176*9880d681SAndroid Build Coastguard Worker;} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdefine i1 @test16(i32* %P) { 179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp ne i32* %P, null 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[C]] 182*9880d681SAndroid Build Coastguard Worker; 183*9880d681SAndroid Build Coastguard Worker %c = icmp ne i32* %P, null ; <i1> [#uses=1] 184*9880d681SAndroid Build Coastguard Worker ret i1 %c 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine i16 @test17(i1 %tmp3) { 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T86:%.*]] = zext i1 %tmp3 to i16 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[T86]] 191*9880d681SAndroid Build Coastguard Worker; 192*9880d681SAndroid Build Coastguard Worker %c = zext i1 %tmp3 to i32 ; <i32> [#uses=1] 193*9880d681SAndroid Build Coastguard Worker %t86 = trunc i32 %c to i16 ; <i16> [#uses=1] 194*9880d681SAndroid Build Coastguard Worker ret i16 %t86 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine i16 @test18(i8 %tmp3) { 198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T86:%.*]] = sext i8 %tmp3 to i16 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[T86]] 201*9880d681SAndroid Build Coastguard Worker; 202*9880d681SAndroid Build Coastguard Worker %c = sext i8 %tmp3 to i32 ; <i32> [#uses=1] 203*9880d681SAndroid Build Coastguard Worker %t86 = trunc i32 %c to i16 ; <i16> [#uses=1] 204*9880d681SAndroid Build Coastguard Worker ret i16 %t86 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdefine i1 @test19(i32 %X) { 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = icmp slt i32 %X, 12345 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[Z]] 211*9880d681SAndroid Build Coastguard Worker; 212*9880d681SAndroid Build Coastguard Worker %c = sext i32 %X to i64 213*9880d681SAndroid Build Coastguard Worker %Z = icmp slt i64 %c, 12345 214*9880d681SAndroid Build Coastguard Worker ret i1 %Z 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @test19vec(<2 x i32> %X) { 218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19vec( 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = icmp slt <2 x i32> %X, <i32 12345, i32 2147483647> 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[Z]] 221*9880d681SAndroid Build Coastguard Worker; 222*9880d681SAndroid Build Coastguard Worker %c = sext <2 x i32> %X to <2 x i64> 223*9880d681SAndroid Build Coastguard Worker %Z = icmp slt <2 x i64> %c, <i64 12345, i64 2147483647> 224*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %Z 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerdefine <3 x i1> @test19vec2(<3 x i1> %X) { 228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19vec2( 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMPEQ:%.*]] = xor <3 x i1> %X, <i1 true, i1 true, i1 true> 230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i1> [[CMPEQ]] 231*9880d681SAndroid Build Coastguard Worker; 232*9880d681SAndroid Build Coastguard Worker %sext = sext <3 x i1> %X to <3 x i32> 233*9880d681SAndroid Build Coastguard Worker %cmpeq = icmp eq <3 x i32> %sext, zeroinitializer 234*9880d681SAndroid Build Coastguard Worker ret <3 x i1> %cmpeq 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerdefine i1 @test20(i1 %B) { 238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 240*9880d681SAndroid Build Coastguard Worker; 241*9880d681SAndroid Build Coastguard Worker %c = zext i1 %B to i32 ; <i32> [#uses=1] 242*9880d681SAndroid Build Coastguard Worker %D = icmp slt i32 %c, -1 ; <i1> [#uses=1] 243*9880d681SAndroid Build Coastguard Worker ;; false 244*9880d681SAndroid Build Coastguard Worker ret i1 %D 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdefine i32 @test21(i32 %X) { 248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C21:%.*]] = and i32 %X, 255 250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C21]] 251*9880d681SAndroid Build Coastguard Worker; 252*9880d681SAndroid Build Coastguard Worker %c1 = trunc i32 %X to i8 ; <i8> [#uses=1] 253*9880d681SAndroid Build Coastguard Worker ;; sext -> zext -> and -> nop 254*9880d681SAndroid Build Coastguard Worker %c2 = sext i8 %c1 to i32 ; <i32> [#uses=1] 255*9880d681SAndroid Build Coastguard Worker %RV = and i32 %c2, 255 ; <i32> [#uses=1] 256*9880d681SAndroid Build Coastguard Worker ret i32 %RV 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdefine i32 @test22(i32 %X) { 260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22( 261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = shl i32 %X, 24 262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SEXT]] 263*9880d681SAndroid Build Coastguard Worker; 264*9880d681SAndroid Build Coastguard Worker %c1 = trunc i32 %X to i8 ; <i8> [#uses=1] 265*9880d681SAndroid Build Coastguard Worker ;; sext -> zext -> and -> nop 266*9880d681SAndroid Build Coastguard Worker %c2 = sext i8 %c1 to i32 ; <i32> [#uses=1] 267*9880d681SAndroid Build Coastguard Worker %RV = shl i32 %c2, 24 ; <i32> [#uses=1] 268*9880d681SAndroid Build Coastguard Worker ret i32 %RV 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workerdefine i32 @test23(i32 %X) { 272*9880d681SAndroid Build Coastguard Worker ;; Turn into an AND even though X 273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23( 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C2:%.*]] = and i32 %X, 65535 275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C2]] 276*9880d681SAndroid Build Coastguard Worker; 277*9880d681SAndroid Build Coastguard Worker %c1 = trunc i32 %X to i16 ; <i16> [#uses=1] 278*9880d681SAndroid Build Coastguard Worker ;; and Z are signed. 279*9880d681SAndroid Build Coastguard Worker %c2 = zext i16 %c1 to i32 ; <i32> [#uses=1] 280*9880d681SAndroid Build Coastguard Worker ret i32 %c2 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdefine i1 @test24(i1 %C) { 284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24( 285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 286*9880d681SAndroid Build Coastguard Worker; 287*9880d681SAndroid Build Coastguard Worker %X = select i1 %C, i32 14, i32 1234 ; <i32> [#uses=1] 288*9880d681SAndroid Build Coastguard Worker ;; Fold cast into select 289*9880d681SAndroid Build Coastguard Worker %c = icmp ne i32 %X, 0 ; <i1> [#uses=1] 290*9880d681SAndroid Build Coastguard Worker ret i1 %c 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Workerdefine i32 @test26(float %F) { 294*9880d681SAndroid Build Coastguard Worker ;; no need to cast from float->double. 295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26( 296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = fptosi float %F to i32 297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[D]] 298*9880d681SAndroid Build Coastguard Worker; 299*9880d681SAndroid Build Coastguard Worker %c = fpext float %F to double ; <double> [#uses=1] 300*9880d681SAndroid Build Coastguard Worker %D = fptosi double %c to i32 ; <i32> [#uses=1] 301*9880d681SAndroid Build Coastguard Worker ret i32 %D 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerdefine [4 x float]* @test27([9 x [4 x float]]* %A) { 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27( 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [9 x [4 x float]], [9 x [4 x float]]* %A, i64 0, i64 0 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret [4 x float]* [[C]] 308*9880d681SAndroid Build Coastguard Worker; 309*9880d681SAndroid Build Coastguard Worker %c = bitcast [9 x [4 x float]]* %A to [4 x float]* ; <[4 x float]*> [#uses=1] 310*9880d681SAndroid Build Coastguard Worker ret [4 x float]* %c 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerdefine float* @test28([4 x float]* %A) { 314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28( 315*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [4 x float], [4 x float]* %A, i64 0, i64 0 316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float* [[C]] 317*9880d681SAndroid Build Coastguard Worker; 318*9880d681SAndroid Build Coastguard Worker %c = bitcast [4 x float]* %A to float* ; <float*> [#uses=1] 319*9880d681SAndroid Build Coastguard Worker ret float* %c 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Workerdefine i32 @test29(i32 %c1, i32 %c2) { 323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29( 324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = or i32 %c2, %c1 325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP10:%.*]] = and i32 [[TMP2]], 255 326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP10]] 327*9880d681SAndroid Build Coastguard Worker; 328*9880d681SAndroid Build Coastguard Worker %tmp1 = trunc i32 %c1 to i8 ; <i8> [#uses=1] 329*9880d681SAndroid Build Coastguard Worker %tmp4.mask = trunc i32 %c2 to i8 ; <i8> [#uses=1] 330*9880d681SAndroid Build Coastguard Worker %tmp = or i8 %tmp4.mask, %tmp1 ; <i8> [#uses=1] 331*9880d681SAndroid Build Coastguard Worker %tmp10 = zext i8 %tmp to i32 ; <i32> [#uses=1] 332*9880d681SAndroid Build Coastguard Worker ret i32 %tmp10 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerdefine i32 @test30(i32 %c1) { 336*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30( 337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C3:%.*]] = and i32 %c1, 255 338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C4:%.*]] = xor i32 [[C3]], 1 339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[C4]] 340*9880d681SAndroid Build Coastguard Worker; 341*9880d681SAndroid Build Coastguard Worker %c2 = trunc i32 %c1 to i8 ; <i8> [#uses=1] 342*9880d681SAndroid Build Coastguard Worker %c3 = xor i8 %c2, 1 ; <i8> [#uses=1] 343*9880d681SAndroid Build Coastguard Worker %c4 = zext i8 %c3 to i32 ; <i32> [#uses=1] 344*9880d681SAndroid Build Coastguard Worker ret i32 %c4 345*9880d681SAndroid Build Coastguard Worker} 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerdefine i1 @test31(i64 %A) { 348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31( 349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i64 %A, 42 350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = icmp eq i64 [[C]], 10 351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[D]] 352*9880d681SAndroid Build Coastguard Worker; 353*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i32 ; <i32> [#uses=1] 354*9880d681SAndroid Build Coastguard Worker %C = and i32 %B, 42 ; <i32> [#uses=1] 355*9880d681SAndroid Build Coastguard Worker %D = icmp eq i32 %C, 10 ; <i1> [#uses=1] 356*9880d681SAndroid Build Coastguard Worker ret i1 %D 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Workerdefine i32 @test33(i32 %c1) { 360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33( 361*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %c1 362*9880d681SAndroid Build Coastguard Worker; 363*9880d681SAndroid Build Coastguard Worker %x = bitcast i32 %c1 to float ; <float> [#uses=1] 364*9880d681SAndroid Build Coastguard Worker %y = bitcast float %x to i32 ; <i32> [#uses=1] 365*9880d681SAndroid Build Coastguard Worker ret i32 %y 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Workerdefine i16 @test34(i16 %a) { 369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34( 370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP21:%.*]] = lshr i16 %a, 8 371*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[TMP21]] 372*9880d681SAndroid Build Coastguard Worker; 373*9880d681SAndroid Build Coastguard Worker %c1 = zext i16 %a to i32 ; <i32> [#uses=1] 374*9880d681SAndroid Build Coastguard Worker %tmp21 = lshr i32 %c1, 8 ; <i32> [#uses=1] 375*9880d681SAndroid Build Coastguard Worker %c2 = trunc i32 %tmp21 to i16 ; <i16> [#uses=1] 376*9880d681SAndroid Build Coastguard Worker ret i16 %c2 377*9880d681SAndroid Build Coastguard Worker} 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerdefine i16 @test35(i16 %a) { 380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test35( 381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = lshr i16 %a, 8 382*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[TMP2]] 383*9880d681SAndroid Build Coastguard Worker; 384*9880d681SAndroid Build Coastguard Worker %c1 = bitcast i16 %a to i16 ; <i16> [#uses=1] 385*9880d681SAndroid Build Coastguard Worker %tmp2 = lshr i16 %c1, 8 ; <i16> [#uses=1] 386*9880d681SAndroid Build Coastguard Worker %c2 = bitcast i16 %tmp2 to i16 ; <i16> [#uses=1] 387*9880d681SAndroid Build Coastguard Worker ret i16 %c2 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker; icmp sgt i32 %a, -1 391*9880d681SAndroid Build Coastguard Worker; rdar://6480391 392*9880d681SAndroid Build Coastguard Workerdefine i1 @test36(i32 %a) { 393*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test36( 394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = icmp sgt i32 %a, -1 395*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[D]] 396*9880d681SAndroid Build Coastguard Worker; 397*9880d681SAndroid Build Coastguard Worker %b = lshr i32 %a, 31 398*9880d681SAndroid Build Coastguard Worker %c = trunc i32 %b to i8 399*9880d681SAndroid Build Coastguard Worker %d = icmp eq i8 %c, 0 400*9880d681SAndroid Build Coastguard Worker ret i1 %d 401*9880d681SAndroid Build Coastguard Worker} 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Worker; ret i1 false 404*9880d681SAndroid Build Coastguard Workerdefine i1 @test37(i32 %a) { 405*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test37( 406*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 407*9880d681SAndroid Build Coastguard Worker; 408*9880d681SAndroid Build Coastguard Worker %b = lshr i32 %a, 31 409*9880d681SAndroid Build Coastguard Worker %c = or i32 %b, 512 410*9880d681SAndroid Build Coastguard Worker %d = trunc i32 %c to i8 411*9880d681SAndroid Build Coastguard Worker %e = icmp eq i8 %d, 11 412*9880d681SAndroid Build Coastguard Worker ret i1 %e 413*9880d681SAndroid Build Coastguard Worker} 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Workerdefine i64 @test38(i32 %a) { 416*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test38( 417*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 %a, -2 418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i64 419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[TMP2]] 420*9880d681SAndroid Build Coastguard Worker; 421*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %a, -2 422*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i8 423*9880d681SAndroid Build Coastguard Worker %3 = xor i8 %2, 1 424*9880d681SAndroid Build Coastguard Worker %4 = zext i8 %3 to i64 425*9880d681SAndroid Build Coastguard Worker ret i64 %4 426*9880d681SAndroid Build Coastguard Worker} 427*9880d681SAndroid Build Coastguard Worker 428*9880d681SAndroid Build Coastguard Workerdefine i16 @test39(i16 %a) { 429*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test39( 430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_UPGRD_32:%.*]] = call i16 @llvm.bswap.i16(i16 %a) 431*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[TMP_UPGRD_32]] 432*9880d681SAndroid Build Coastguard Worker; 433*9880d681SAndroid Build Coastguard Worker %tmp = zext i16 %a to i32 434*9880d681SAndroid Build Coastguard Worker %tmp21 = lshr i32 %tmp, 8 435*9880d681SAndroid Build Coastguard Worker %tmp5 = shl i32 %tmp, 8 436*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.32 = or i32 %tmp21, %tmp5 437*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.3 = trunc i32 %tmp.upgrd.32 to i16 438*9880d681SAndroid Build Coastguard Worker ret i16 %tmp.upgrd.3 439*9880d681SAndroid Build Coastguard Worker} 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Workerdefine i16 @test40(i16 %a) { 442*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test40( 443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP21:%.*]] = lshr i16 %a, 9 444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP5:%.*]] = shl i16 %a, 8 445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP_UPGRD_32:%.*]] = or i16 [[TMP21]], [[TMP5]] 446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[TMP_UPGRD_32]] 447*9880d681SAndroid Build Coastguard Worker; 448*9880d681SAndroid Build Coastguard Worker %tmp = zext i16 %a to i32 449*9880d681SAndroid Build Coastguard Worker %tmp21 = lshr i32 %tmp, 9 450*9880d681SAndroid Build Coastguard Worker %tmp5 = shl i32 %tmp, 8 451*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.32 = or i32 %tmp21, %tmp5 452*9880d681SAndroid Build Coastguard Worker %tmp.upgrd.3 = trunc i32 %tmp.upgrd.32 to i16 453*9880d681SAndroid Build Coastguard Worker ret i16 %tmp.upgrd.3 454*9880d681SAndroid Build Coastguard Worker} 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Worker; PR1263 457*9880d681SAndroid Build Coastguard Workerdefine i32* @test41(i32* %tmp1) { 458*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41( 459*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32* %tmp1 460*9880d681SAndroid Build Coastguard Worker; 461*9880d681SAndroid Build Coastguard Worker %tmp64 = bitcast i32* %tmp1 to { i32 }* 462*9880d681SAndroid Build Coastguard Worker %tmp65 = getelementptr { i32 }, { i32 }* %tmp64, i32 0, i32 0 463*9880d681SAndroid Build Coastguard Worker ret i32* %tmp65 464*9880d681SAndroid Build Coastguard Worker} 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Workerdefine i32 addrspace(1)* @test41_addrspacecast_smaller(i32* %tmp1) { 467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41_addrspacecast_smaller( 468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP65:%.*]] = addrspacecast i32* %tmp1 to i32 addrspace(1)* 469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 addrspace(1)* [[TMP65]] 470*9880d681SAndroid Build Coastguard Worker; 471*9880d681SAndroid Build Coastguard Worker %tmp64 = addrspacecast i32* %tmp1 to { i32 } addrspace(1)* 472*9880d681SAndroid Build Coastguard Worker %tmp65 = getelementptr { i32 }, { i32 } addrspace(1)* %tmp64, i32 0, i32 0 473*9880d681SAndroid Build Coastguard Worker ret i32 addrspace(1)* %tmp65 474*9880d681SAndroid Build Coastguard Worker} 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Workerdefine i32* @test41_addrspacecast_larger(i32 addrspace(1)* %tmp1) { 477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41_addrspacecast_larger( 478*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP65:%.*]] = addrspacecast i32 addrspace(1)* %tmp1 to i32* 479*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32* [[TMP65]] 480*9880d681SAndroid Build Coastguard Worker; 481*9880d681SAndroid Build Coastguard Worker %tmp64 = addrspacecast i32 addrspace(1)* %tmp1 to { i32 }* 482*9880d681SAndroid Build Coastguard Worker %tmp65 = getelementptr { i32 }, { i32 }* %tmp64, i32 0, i32 0 483*9880d681SAndroid Build Coastguard Worker ret i32* %tmp65 484*9880d681SAndroid Build Coastguard Worker} 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Workerdefine i32 @test42(i32 %X) { 487*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42( 488*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = and i32 %X, 255 489*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[Z]] 490*9880d681SAndroid Build Coastguard Worker; 491*9880d681SAndroid Build Coastguard Worker %Y = trunc i32 %X to i8 ; <i8> [#uses=1] 492*9880d681SAndroid Build Coastguard Worker %Z = zext i8 %Y to i32 ; <i32> [#uses=1] 493*9880d681SAndroid Build Coastguard Worker ret i32 %Z 494*9880d681SAndroid Build Coastguard Worker} 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard Worker; rdar://6598839 497*9880d681SAndroid Build Coastguard Workerdefine zeroext i64 @test43(i8 zeroext %on_off) nounwind readonly { 498*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test43( 499*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = zext i8 %on_off to i64 500*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = add nsw i64 [[A]], -1 501*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[B]] 502*9880d681SAndroid Build Coastguard Worker; 503*9880d681SAndroid Build Coastguard Worker %A = zext i8 %on_off to i32 504*9880d681SAndroid Build Coastguard Worker %B = add i32 %A, -1 505*9880d681SAndroid Build Coastguard Worker %C = sext i32 %B to i64 506*9880d681SAndroid Build Coastguard Worker ret i64 %C ;; Should be (add (zext i8 -> i64), -1) 507*9880d681SAndroid Build Coastguard Worker} 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Workerdefine i64 @test44(i8 %T) { 510*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test44( 511*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = zext i8 %T to i64 512*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = or i64 [[A]], 1234 513*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[B]] 514*9880d681SAndroid Build Coastguard Worker; 515*9880d681SAndroid Build Coastguard Worker %A = zext i8 %T to i16 516*9880d681SAndroid Build Coastguard Worker %B = or i16 %A, 1234 517*9880d681SAndroid Build Coastguard Worker %C = zext i16 %B to i64 518*9880d681SAndroid Build Coastguard Worker ret i64 %C 519*9880d681SAndroid Build Coastguard Worker} 520*9880d681SAndroid Build Coastguard Worker 521*9880d681SAndroid Build Coastguard Workerdefine i64 @test45(i8 %A, i64 %Q) { 522*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test45( 523*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = sext i8 %A to i64 524*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = or i64 [[B]], %Q 525*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = and i64 [[C]], 4294967295 526*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[E]] 527*9880d681SAndroid Build Coastguard Worker; 528*9880d681SAndroid Build Coastguard Worker %D = trunc i64 %Q to i32 ;; should be removed 529*9880d681SAndroid Build Coastguard Worker %B = sext i8 %A to i32 530*9880d681SAndroid Build Coastguard Worker %C = or i32 %B, %D 531*9880d681SAndroid Build Coastguard Worker %E = zext i32 %C to i64 532*9880d681SAndroid Build Coastguard Worker ret i64 %E 533*9880d681SAndroid Build Coastguard Worker} 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker 536*9880d681SAndroid Build Coastguard Workerdefine i64 @test46(i64 %A) { 537*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test46( 538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = shl i64 %A, 8 539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = and i64 [[C]], 10752 540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[D]] 541*9880d681SAndroid Build Coastguard Worker; 542*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i32 543*9880d681SAndroid Build Coastguard Worker %C = and i32 %B, 42 544*9880d681SAndroid Build Coastguard Worker %D = shl i32 %C, 8 545*9880d681SAndroid Build Coastguard Worker %E = zext i32 %D to i64 546*9880d681SAndroid Build Coastguard Worker ret i64 %E 547*9880d681SAndroid Build Coastguard Worker} 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Workerdefine i64 @test47(i8 %A) { 550*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test47( 551*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = sext i8 %A to i64 552*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i64 [[B]], 4294967253 553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = or i64 [[C]], 42 554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[E]] 555*9880d681SAndroid Build Coastguard Worker; 556*9880d681SAndroid Build Coastguard Worker %B = sext i8 %A to i32 557*9880d681SAndroid Build Coastguard Worker %C = or i32 %B, 42 558*9880d681SAndroid Build Coastguard Worker %E = zext i32 %C to i64 559*9880d681SAndroid Build Coastguard Worker ret i64 %E 560*9880d681SAndroid Build Coastguard Worker} 561*9880d681SAndroid Build Coastguard Worker 562*9880d681SAndroid Build Coastguard Workerdefine i64 @test48(i8 %A1, i8 %a2) { 563*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test48( 564*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z2:%.*]] = zext i8 %A1 to i32 565*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = shl nuw nsw i32 [[Z2]], 8 566*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i32 [[C]], [[Z2]] 567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = zext i32 [[D]] to i64 568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[E]] 569*9880d681SAndroid Build Coastguard Worker; 570*9880d681SAndroid Build Coastguard Worker %Z1 = zext i8 %a2 to i32 571*9880d681SAndroid Build Coastguard Worker %Z2 = zext i8 %A1 to i32 572*9880d681SAndroid Build Coastguard Worker %C = shl i32 %Z2, 8 573*9880d681SAndroid Build Coastguard Worker %D = or i32 %C, %Z2 574*9880d681SAndroid Build Coastguard Worker %E = zext i32 %D to i64 575*9880d681SAndroid Build Coastguard Worker ret i64 %E 576*9880d681SAndroid Build Coastguard Worker} 577*9880d681SAndroid Build Coastguard Worker 578*9880d681SAndroid Build Coastguard Workerdefine i64 @test49(i64 %A) { 579*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test49( 580*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = shl i64 %A, 32 581*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = ashr exact i64 [[C]], 32 582*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i64 [[SEXT]], 1 583*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[D]] 584*9880d681SAndroid Build Coastguard Worker; 585*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i32 586*9880d681SAndroid Build Coastguard Worker %C = or i32 %B, 1 587*9880d681SAndroid Build Coastguard Worker %D = sext i32 %C to i64 588*9880d681SAndroid Build Coastguard Worker ret i64 %D 589*9880d681SAndroid Build Coastguard Worker} 590*9880d681SAndroid Build Coastguard Worker 591*9880d681SAndroid Build Coastguard Workerdefine i64 @test50(i64 %A) { 592*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test50( 593*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = lshr i64 %A, 2 594*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = shl i64 [[A]], 32 595*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = add i64 [[D]], -4294967296 596*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = ashr exact i64 [[SEXT]], 32 597*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[E]] 598*9880d681SAndroid Build Coastguard Worker; 599*9880d681SAndroid Build Coastguard Worker %a = lshr i64 %A, 2 600*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %a to i32 601*9880d681SAndroid Build Coastguard Worker %D = add i32 %B, -1 602*9880d681SAndroid Build Coastguard Worker %E = sext i32 %D to i64 603*9880d681SAndroid Build Coastguard Worker ret i64 %E 604*9880d681SAndroid Build Coastguard Worker; lshr+shl will be handled by DAGCombine. 605*9880d681SAndroid Build Coastguard Worker} 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Workerdefine i64 @test51(i64 %A, i1 %cond) { 608*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test51( 609*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i64 %A, 4294967294 610*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i64 %A, 1 611*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = select i1 %cond, i64 [[C]], i64 [[D]] 612*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = shl i64 [[E]], 32 613*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[F:%.*]] = ashr exact i64 [[SEXT]], 32 614*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[F]] 615*9880d681SAndroid Build Coastguard Worker; 616*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i32 617*9880d681SAndroid Build Coastguard Worker %C = and i32 %B, -2 618*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, 1 619*9880d681SAndroid Build Coastguard Worker %E = select i1 %cond, i32 %C, i32 %D 620*9880d681SAndroid Build Coastguard Worker %F = sext i32 %E to i64 621*9880d681SAndroid Build Coastguard Worker ret i64 %F 622*9880d681SAndroid Build Coastguard Worker} 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Workerdefine i32 @test52(i64 %A) { 625*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test52( 626*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = trunc i64 %A to i32 627*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i32 [[B]], 7224 628*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i32 [[C]], 32962 629*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[D]] 630*9880d681SAndroid Build Coastguard Worker; 631*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i16 632*9880d681SAndroid Build Coastguard Worker %C = or i16 %B, -32574 633*9880d681SAndroid Build Coastguard Worker %D = and i16 %C, -25350 634*9880d681SAndroid Build Coastguard Worker %E = zext i16 %D to i32 635*9880d681SAndroid Build Coastguard Worker ret i32 %E 636*9880d681SAndroid Build Coastguard Worker} 637*9880d681SAndroid Build Coastguard Worker 638*9880d681SAndroid Build Coastguard Workerdefine i64 @test53(i32 %A) { 639*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test53( 640*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = zext i32 %A to i64 641*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i64 [[B]], 7224 642*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i64 [[C]], 32962 643*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[D]] 644*9880d681SAndroid Build Coastguard Worker; 645*9880d681SAndroid Build Coastguard Worker %B = trunc i32 %A to i16 646*9880d681SAndroid Build Coastguard Worker %C = or i16 %B, -32574 647*9880d681SAndroid Build Coastguard Worker %D = and i16 %C, -25350 648*9880d681SAndroid Build Coastguard Worker %E = zext i16 %D to i64 649*9880d681SAndroid Build Coastguard Worker ret i64 %E 650*9880d681SAndroid Build Coastguard Worker} 651*9880d681SAndroid Build Coastguard Worker 652*9880d681SAndroid Build Coastguard Workerdefine i32 @test54(i64 %A) { 653*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test54( 654*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = trunc i64 %A to i32 655*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i32 [[B]], 7224 656*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i32 [[C]], -32574 657*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[D]] 658*9880d681SAndroid Build Coastguard Worker; 659*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i16 660*9880d681SAndroid Build Coastguard Worker %C = or i16 %B, -32574 661*9880d681SAndroid Build Coastguard Worker %D = and i16 %C, -25350 662*9880d681SAndroid Build Coastguard Worker %E = sext i16 %D to i32 663*9880d681SAndroid Build Coastguard Worker ret i32 %E 664*9880d681SAndroid Build Coastguard Worker} 665*9880d681SAndroid Build Coastguard Worker 666*9880d681SAndroid Build Coastguard Workerdefine i64 @test55(i32 %A) { 667*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test55( 668*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = zext i32 %A to i64 669*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = and i64 [[B]], 7224 670*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = or i64 [[C]], -32574 671*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[D]] 672*9880d681SAndroid Build Coastguard Worker; 673*9880d681SAndroid Build Coastguard Worker %B = trunc i32 %A to i16 674*9880d681SAndroid Build Coastguard Worker %C = or i16 %B, -32574 675*9880d681SAndroid Build Coastguard Worker %D = and i16 %C, -25350 676*9880d681SAndroid Build Coastguard Worker %E = sext i16 %D to i64 677*9880d681SAndroid Build Coastguard Worker ret i64 %E 678*9880d681SAndroid Build Coastguard Worker} 679*9880d681SAndroid Build Coastguard Worker 680*9880d681SAndroid Build Coastguard Workerdefine i64 @test56(i16 %A) nounwind { 681*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test56( 682*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP353:%.*]] = sext i16 %A to i64 683*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP354:%.*]] = lshr i64 [[TMP353]], 5 684*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP355:%.*]] = and i64 [[TMP354]], 134217727 685*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[TMP355]] 686*9880d681SAndroid Build Coastguard Worker; 687*9880d681SAndroid Build Coastguard Worker %tmp353 = sext i16 %A to i32 688*9880d681SAndroid Build Coastguard Worker %tmp354 = lshr i32 %tmp353, 5 689*9880d681SAndroid Build Coastguard Worker %tmp355 = zext i32 %tmp354 to i64 690*9880d681SAndroid Build Coastguard Worker ret i64 %tmp355 691*9880d681SAndroid Build Coastguard Worker} 692*9880d681SAndroid Build Coastguard Worker 693*9880d681SAndroid Build Coastguard Workerdefine i64 @test57(i64 %A) nounwind { 694*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test57( 695*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = lshr i64 %A, 8 696*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = and i64 [[C]], 16777215 697*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[E]] 698*9880d681SAndroid Build Coastguard Worker; 699*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i32 700*9880d681SAndroid Build Coastguard Worker %C = lshr i32 %B, 8 701*9880d681SAndroid Build Coastguard Worker %E = zext i32 %C to i64 702*9880d681SAndroid Build Coastguard Worker ret i64 %E 703*9880d681SAndroid Build Coastguard Worker} 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Workerdefine i64 @test58(i64 %A) nounwind { 706*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test58( 707*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = lshr i64 %A, 8 708*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = and i64 [[C]], 16777087 709*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = or i64 [[D]], 128 710*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[E]] 711*9880d681SAndroid Build Coastguard Worker; 712*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i32 713*9880d681SAndroid Build Coastguard Worker %C = lshr i32 %B, 8 714*9880d681SAndroid Build Coastguard Worker %D = or i32 %C, 128 715*9880d681SAndroid Build Coastguard Worker %E = zext i32 %D to i64 716*9880d681SAndroid Build Coastguard Worker ret i64 %E 717*9880d681SAndroid Build Coastguard Worker 718*9880d681SAndroid Build Coastguard Worker} 719*9880d681SAndroid Build Coastguard Worker 720*9880d681SAndroid Build Coastguard Workerdefine i64 @test59(i8 %A, i8 %B) nounwind { 721*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test59( 722*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = zext i8 %A to i64 723*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = shl nuw nsw i64 [[C]], 4 724*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = and i64 [[D]], 48 725*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[F:%.*]] = zext i8 %B to i64 726*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[G:%.*]] = lshr i64 [[F]], 4 727*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[H:%.*]] = or i64 [[G]], [[E]] 728*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[H]] 729*9880d681SAndroid Build Coastguard Worker; 730*9880d681SAndroid Build Coastguard Worker %C = zext i8 %A to i32 731*9880d681SAndroid Build Coastguard Worker %D = shl i32 %C, 4 732*9880d681SAndroid Build Coastguard Worker %E = and i32 %D, 48 733*9880d681SAndroid Build Coastguard Worker %F = zext i8 %B to i32 734*9880d681SAndroid Build Coastguard Worker %G = lshr i32 %F, 4 735*9880d681SAndroid Build Coastguard Worker %H = or i32 %G, %E 736*9880d681SAndroid Build Coastguard Worker %I = zext i32 %H to i64 737*9880d681SAndroid Build Coastguard Worker ret i64 %I 738*9880d681SAndroid Build Coastguard Worker} 739*9880d681SAndroid Build Coastguard Worker 740*9880d681SAndroid Build Coastguard Workerdefine <3 x i32> @test60(<4 x i32> %call4) nounwind { 741*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test60( 742*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> %call4, <4 x i32> undef, <3 x i32> <i32 0, i32 1, i32 2> 743*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <3 x i32> [[TMP10]] 744*9880d681SAndroid Build Coastguard Worker; 745*9880d681SAndroid Build Coastguard Worker %tmp11 = bitcast <4 x i32> %call4 to i128 746*9880d681SAndroid Build Coastguard Worker %tmp9 = trunc i128 %tmp11 to i96 747*9880d681SAndroid Build Coastguard Worker %tmp10 = bitcast i96 %tmp9 to <3 x i32> 748*9880d681SAndroid Build Coastguard Worker ret <3 x i32> %tmp10 749*9880d681SAndroid Build Coastguard Worker 750*9880d681SAndroid Build Coastguard Worker} 751*9880d681SAndroid Build Coastguard Worker 752*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test61(<3 x i32> %call4) nounwind { 753*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test61( 754*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <3 x i32> %call4, <3 x i32> <i32 0, i32 undef, i32 undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 755*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[TMP10]] 756*9880d681SAndroid Build Coastguard Worker; 757*9880d681SAndroid Build Coastguard Worker %tmp11 = bitcast <3 x i32> %call4 to i96 758*9880d681SAndroid Build Coastguard Worker %tmp9 = zext i96 %tmp11 to i128 759*9880d681SAndroid Build Coastguard Worker %tmp10 = bitcast i128 %tmp9 to <4 x i32> 760*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp10 761*9880d681SAndroid Build Coastguard Worker} 762*9880d681SAndroid Build Coastguard Worker 763*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test62(<3 x float> %call4) nounwind { 764*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test62( 765*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = bitcast <3 x float> %call4 to <3 x i32> 766*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> <i32 0, i32 undef, i32 undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 767*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x i32> [[TMP10]] 768*9880d681SAndroid Build Coastguard Worker; 769*9880d681SAndroid Build Coastguard Worker %tmp11 = bitcast <3 x float> %call4 to i96 770*9880d681SAndroid Build Coastguard Worker %tmp9 = zext i96 %tmp11 to i128 771*9880d681SAndroid Build Coastguard Worker %tmp10 = bitcast i128 %tmp9 to <4 x i32> 772*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp10 773*9880d681SAndroid Build Coastguard Worker} 774*9880d681SAndroid Build Coastguard Worker 775*9880d681SAndroid Build Coastguard Worker; PR7311 - Don't create invalid IR on scalar->vector cast. 776*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test63(i64 %tmp8) nounwind { 777*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test63( 778*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: 779*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = bitcast i64 %tmp8 to <2 x i32> 780*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[VCVT_I:%.*]] = uitofp <2 x i32> [[A]] to <2 x float> 781*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x float> [[VCVT_I]] 782*9880d681SAndroid Build Coastguard Worker; 783*9880d681SAndroid Build Coastguard Workerentry: 784*9880d681SAndroid Build Coastguard Worker %a = bitcast i64 %tmp8 to <2 x i32> 785*9880d681SAndroid Build Coastguard Worker %vcvt.i = uitofp <2 x i32> %a to <2 x float> 786*9880d681SAndroid Build Coastguard Worker ret <2 x float> %vcvt.i 787*9880d681SAndroid Build Coastguard Worker} 788*9880d681SAndroid Build Coastguard Worker 789*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test64(<4 x float> %c) nounwind { 790*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test64( 791*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x float> %c 792*9880d681SAndroid Build Coastguard Worker; 793*9880d681SAndroid Build Coastguard Worker %t0 = bitcast <4 x float> %c to <4 x i32> 794*9880d681SAndroid Build Coastguard Worker %t1 = bitcast <4 x i32> %t0 to <4 x float> 795*9880d681SAndroid Build Coastguard Worker ret <4 x float> %t1 796*9880d681SAndroid Build Coastguard Worker} 797*9880d681SAndroid Build Coastguard Worker 798*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test65(<4 x float> %c) nounwind { 799*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test65( 800*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x float> %c 801*9880d681SAndroid Build Coastguard Worker; 802*9880d681SAndroid Build Coastguard Worker %t0 = bitcast <4 x float> %c to <2 x double> 803*9880d681SAndroid Build Coastguard Worker %t1 = bitcast <2 x double> %t0 to <4 x float> 804*9880d681SAndroid Build Coastguard Worker ret <4 x float> %t1 805*9880d681SAndroid Build Coastguard Worker} 806*9880d681SAndroid Build Coastguard Worker 807*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test66(<2 x float> %c) nounwind { 808*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test66( 809*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x float> %c 810*9880d681SAndroid Build Coastguard Worker; 811*9880d681SAndroid Build Coastguard Worker %t0 = bitcast <2 x float> %c to double 812*9880d681SAndroid Build Coastguard Worker %t1 = bitcast double %t0 to <2 x float> 813*9880d681SAndroid Build Coastguard Worker ret <2 x float> %t1 814*9880d681SAndroid Build Coastguard Worker} 815*9880d681SAndroid Build Coastguard Worker 816*9880d681SAndroid Build Coastguard Workerdefine float @test2c() { 817*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2c( 818*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float -1.000000e+00 819*9880d681SAndroid Build Coastguard Worker; 820*9880d681SAndroid Build Coastguard Worker ret float extractelement (<2 x float> bitcast (double bitcast (<2 x float> <float -1.000000e+00, float -1.000000e+00> to double) to <2 x float>), i32 0) 821*9880d681SAndroid Build Coastguard Worker} 822*9880d681SAndroid Build Coastguard Worker 823*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mmx(<2 x i32> %c) nounwind { 824*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_mmx( 825*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = bitcast <2 x i32> %c to i64 826*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[C]] 827*9880d681SAndroid Build Coastguard Worker; 828*9880d681SAndroid Build Coastguard Worker %A = bitcast <2 x i32> %c to x86_mmx 829*9880d681SAndroid Build Coastguard Worker %B = bitcast x86_mmx %A to <2 x i32> 830*9880d681SAndroid Build Coastguard Worker %C = bitcast <2 x i32> %B to i64 831*9880d681SAndroid Build Coastguard Worker ret i64 %C 832*9880d681SAndroid Build Coastguard Worker} 833*9880d681SAndroid Build Coastguard Worker 834*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mmx_const(<2 x i32> %c) nounwind { 835*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_mmx_const( 836*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 0 837*9880d681SAndroid Build Coastguard Worker; 838*9880d681SAndroid Build Coastguard Worker %A = bitcast <2 x i32> zeroinitializer to x86_mmx 839*9880d681SAndroid Build Coastguard Worker %B = bitcast x86_mmx %A to <2 x i32> 840*9880d681SAndroid Build Coastguard Worker %C = bitcast <2 x i32> %B to i64 841*9880d681SAndroid Build Coastguard Worker ret i64 %C 842*9880d681SAndroid Build Coastguard Worker} 843*9880d681SAndroid Build Coastguard Worker 844*9880d681SAndroid Build Coastguard Worker; PR12514 845*9880d681SAndroid Build Coastguard Workerdefine i1 @test67(i1 %a, i32 %b) { 846*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test67( 847*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 848*9880d681SAndroid Build Coastguard Worker; 849*9880d681SAndroid Build Coastguard Worker %tmp2 = zext i1 %a to i32 850*9880d681SAndroid Build Coastguard Worker %conv6 = xor i32 %tmp2, 1 851*9880d681SAndroid Build Coastguard Worker %and = and i32 %b, %conv6 852*9880d681SAndroid Build Coastguard Worker %sext = shl nuw nsw i32 %and, 24 853*9880d681SAndroid Build Coastguard Worker %neg.i = xor i32 %sext, -16777216 854*9880d681SAndroid Build Coastguard Worker %conv.i.i = ashr exact i32 %neg.i, 24 855*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %conv.i.i to i8 856*9880d681SAndroid Build Coastguard Worker %tobool.i = icmp eq i8 %trunc, 0 857*9880d681SAndroid Build Coastguard Worker ret i1 %tobool.i 858*9880d681SAndroid Build Coastguard Worker} 859*9880d681SAndroid Build Coastguard Worker 860*9880d681SAndroid Build Coastguard Worker%s = type { i32, i32, i16 } 861*9880d681SAndroid Build Coastguard Worker 862*9880d681SAndroid Build Coastguard Workerdefine %s @test68(%s *%p, i64 %i) { 863*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68( 864*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr %s, %s* %p, i64 %i 865*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s* [[PP1]], align 4 866*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 867*9880d681SAndroid Build Coastguard Worker; 868*9880d681SAndroid Build Coastguard Worker %o = mul i64 %i, 12 869*9880d681SAndroid Build Coastguard Worker %q = bitcast %s* %p to i8* 870*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %o 871*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to %s* 872*9880d681SAndroid Build Coastguard Worker %l = load %s, %s* %r 873*9880d681SAndroid Build Coastguard Worker ret %s %l 874*9880d681SAndroid Build Coastguard Worker} 875*9880d681SAndroid Build Coastguard Worker 876*9880d681SAndroid Build Coastguard Worker; addrspacecasts should be eliminated. 877*9880d681SAndroid Build Coastguard Workerdefine %s @test68_addrspacecast(%s* %p, i64 %i) { 878*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68_addrspacecast( 879*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr %s, %s* %p, i64 %i 880*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s* [[PP1]], align 4 881*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 882*9880d681SAndroid Build Coastguard Worker; 883*9880d681SAndroid Build Coastguard Worker %o = mul i64 %i, 12 884*9880d681SAndroid Build Coastguard Worker %q = addrspacecast %s* %p to i8 addrspace(2)* 885*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8 addrspace(2)* %q, i64 %o 886*9880d681SAndroid Build Coastguard Worker %r = addrspacecast i8 addrspace(2)* %pp to %s* 887*9880d681SAndroid Build Coastguard Worker %l = load %s, %s* %r 888*9880d681SAndroid Build Coastguard Worker ret %s %l 889*9880d681SAndroid Build Coastguard Worker} 890*9880d681SAndroid Build Coastguard Worker 891*9880d681SAndroid Build Coastguard Workerdefine %s @test68_addrspacecast_2(%s* %p, i64 %i) { 892*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68_addrspacecast_2( 893*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr %s, %s* %p, i64 %i 894*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = addrspacecast %s* [[PP1]] to %s addrspace(1)* 895*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s addrspace(1)* [[R]], align 4 896*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 897*9880d681SAndroid Build Coastguard Worker; 898*9880d681SAndroid Build Coastguard Worker %o = mul i64 %i, 12 899*9880d681SAndroid Build Coastguard Worker %q = addrspacecast %s* %p to i8 addrspace(2)* 900*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8 addrspace(2)* %q, i64 %o 901*9880d681SAndroid Build Coastguard Worker %r = addrspacecast i8 addrspace(2)* %pp to %s addrspace(1)* 902*9880d681SAndroid Build Coastguard Worker %l = load %s, %s addrspace(1)* %r 903*9880d681SAndroid Build Coastguard Worker ret %s %l 904*9880d681SAndroid Build Coastguard Worker} 905*9880d681SAndroid Build Coastguard Worker 906*9880d681SAndroid Build Coastguard Workerdefine %s @test68_as1(%s addrspace(1)* %p, i32 %i) { 907*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test68_as1( 908*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr %s, %s addrspace(1)* %p, i32 %i 909*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s addrspace(1)* [[PP1]], align 4 910*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 911*9880d681SAndroid Build Coastguard Worker; 912*9880d681SAndroid Build Coastguard Worker %o = mul i32 %i, 12 913*9880d681SAndroid Build Coastguard Worker %q = bitcast %s addrspace(1)* %p to i8 addrspace(1)* 914*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8 addrspace(1)* %q, i32 %o 915*9880d681SAndroid Build Coastguard Worker %r = bitcast i8 addrspace(1)* %pp to %s addrspace(1)* 916*9880d681SAndroid Build Coastguard Worker %l = load %s, %s addrspace(1)* %r 917*9880d681SAndroid Build Coastguard Worker ret %s %l 918*9880d681SAndroid Build Coastguard Worker} 919*9880d681SAndroid Build Coastguard Worker 920*9880d681SAndroid Build Coastguard Workerdefine double @test69(double *%p, i64 %i) { 921*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test69( 922*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr inbounds double, double* %p, i64 %i 923*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double* [[PP1]], align 8 924*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 925*9880d681SAndroid Build Coastguard Worker; 926*9880d681SAndroid Build Coastguard Worker %o = shl nsw i64 %i, 3 927*9880d681SAndroid Build Coastguard Worker %q = bitcast double* %p to i8* 928*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %o 929*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to double* 930*9880d681SAndroid Build Coastguard Worker %l = load double, double* %r 931*9880d681SAndroid Build Coastguard Worker ret double %l 932*9880d681SAndroid Build Coastguard Worker} 933*9880d681SAndroid Build Coastguard Worker 934*9880d681SAndroid Build Coastguard Workerdefine %s @test70(%s *%p, i64 %i) { 935*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test70( 936*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[O:%.*]] = mul nsw i64 %i, 3 937*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr inbounds %s, %s* %p, i64 [[O]] 938*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s* [[PP1]], align 4 939*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 940*9880d681SAndroid Build Coastguard Worker; 941*9880d681SAndroid Build Coastguard Worker %o = mul nsw i64 %i, 36 942*9880d681SAndroid Build Coastguard Worker %q = bitcast %s* %p to i8* 943*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %o 944*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to %s* 945*9880d681SAndroid Build Coastguard Worker %l = load %s, %s* %r 946*9880d681SAndroid Build Coastguard Worker ret %s %l 947*9880d681SAndroid Build Coastguard Worker} 948*9880d681SAndroid Build Coastguard Worker 949*9880d681SAndroid Build Coastguard Workerdefine double @test71(double *%p, i64 %i) { 950*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test71( 951*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[O:%.*]] = shl i64 %i, 2 952*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr double, double* %p, i64 [[O]] 953*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double* [[PP1]], align 8 954*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 955*9880d681SAndroid Build Coastguard Worker; 956*9880d681SAndroid Build Coastguard Worker %o = shl i64 %i, 5 957*9880d681SAndroid Build Coastguard Worker %q = bitcast double* %p to i8* 958*9880d681SAndroid Build Coastguard Worker %pp = getelementptr i8, i8* %q, i64 %o 959*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to double* 960*9880d681SAndroid Build Coastguard Worker %l = load double, double* %r 961*9880d681SAndroid Build Coastguard Worker ret double %l 962*9880d681SAndroid Build Coastguard Worker} 963*9880d681SAndroid Build Coastguard Worker 964*9880d681SAndroid Build Coastguard Workerdefine double @test72(double *%p, i32 %i) { 965*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test72( 966*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[O:%.*]] = sext i32 %i to i64 967*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr inbounds double, double* %p, i64 [[O]] 968*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double* [[PP1]], align 8 969*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 970*9880d681SAndroid Build Coastguard Worker; 971*9880d681SAndroid Build Coastguard Worker %so = shl nsw i32 %i, 3 972*9880d681SAndroid Build Coastguard Worker %o = sext i32 %so to i64 973*9880d681SAndroid Build Coastguard Worker %q = bitcast double* %p to i8* 974*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %o 975*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to double* 976*9880d681SAndroid Build Coastguard Worker %l = load double, double* %r 977*9880d681SAndroid Build Coastguard Worker ret double %l 978*9880d681SAndroid Build Coastguard Worker} 979*9880d681SAndroid Build Coastguard Worker 980*9880d681SAndroid Build Coastguard Workerdefine double @test73(double *%p, i128 %i) { 981*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test73( 982*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[O:%.*]] = trunc i128 %i to i64 983*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr double, double* %p, i64 [[O]] 984*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double* [[PP1]], align 8 985*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 986*9880d681SAndroid Build Coastguard Worker; 987*9880d681SAndroid Build Coastguard Worker %lo = shl nsw i128 %i, 3 988*9880d681SAndroid Build Coastguard Worker %o = trunc i128 %lo to i64 989*9880d681SAndroid Build Coastguard Worker %q = bitcast double* %p to i8* 990*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %o 991*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to double* 992*9880d681SAndroid Build Coastguard Worker %l = load double, double* %r 993*9880d681SAndroid Build Coastguard Worker ret double %l 994*9880d681SAndroid Build Coastguard Worker} 995*9880d681SAndroid Build Coastguard Worker 996*9880d681SAndroid Build Coastguard Workerdefine double @test74(double *%p, i64 %i) { 997*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test74( 998*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr inbounds double, double* %p, i64 %i 999*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double* [[PP1]], align 8 1000*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 1001*9880d681SAndroid Build Coastguard Worker; 1002*9880d681SAndroid Build Coastguard Worker %q = bitcast double* %p to i64* 1003*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i64, i64* %q, i64 %i 1004*9880d681SAndroid Build Coastguard Worker %r = bitcast i64* %pp to double* 1005*9880d681SAndroid Build Coastguard Worker %l = load double, double* %r 1006*9880d681SAndroid Build Coastguard Worker ret double %l 1007*9880d681SAndroid Build Coastguard Worker} 1008*9880d681SAndroid Build Coastguard Worker 1009*9880d681SAndroid Build Coastguard Workerdefine i32* @test75(i32* %p, i32 %x) { 1010*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test75( 1011*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = shl i32 %x, 3 1012*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Z:%.*]] = sext i32 [[Y]] to i64 1013*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Q:%.*]] = bitcast i32* %p to i8* 1014*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = getelementptr i8, i8* [[Q]], i64 [[Z]] 1015*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[S:%.*]] = bitcast i8* [[R]] to i32* 1016*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32* [[S]] 1017*9880d681SAndroid Build Coastguard Worker; 1018*9880d681SAndroid Build Coastguard Worker %y = shl i32 %x, 3 1019*9880d681SAndroid Build Coastguard Worker %z = sext i32 %y to i64 1020*9880d681SAndroid Build Coastguard Worker %q = bitcast i32* %p to i8* 1021*9880d681SAndroid Build Coastguard Worker %r = getelementptr i8, i8* %q, i64 %z 1022*9880d681SAndroid Build Coastguard Worker %s = bitcast i8* %r to i32* 1023*9880d681SAndroid Build Coastguard Worker ret i32* %s 1024*9880d681SAndroid Build Coastguard Worker} 1025*9880d681SAndroid Build Coastguard Worker 1026*9880d681SAndroid Build Coastguard Workerdefine %s @test76(%s *%p, i64 %i, i64 %j) { 1027*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test76( 1028*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[O2:%.*]] = mul i64 %i, %j 1029*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr %s, %s* %p, i64 [[O2]] 1030*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s* [[PP1]], align 4 1031*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 1032*9880d681SAndroid Build Coastguard Worker; 1033*9880d681SAndroid Build Coastguard Worker %o = mul i64 %i, 12 1034*9880d681SAndroid Build Coastguard Worker %o2 = mul nsw i64 %o, %j 1035*9880d681SAndroid Build Coastguard Worker %q = bitcast %s* %p to i8* 1036*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %o2 1037*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to %s* 1038*9880d681SAndroid Build Coastguard Worker %l = load %s, %s* %r 1039*9880d681SAndroid Build Coastguard Worker ret %s %l 1040*9880d681SAndroid Build Coastguard Worker} 1041*9880d681SAndroid Build Coastguard Worker 1042*9880d681SAndroid Build Coastguard Workerdefine %s @test77(%s *%p, i64 %i, i64 %j) { 1043*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test77( 1044*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[O:%.*]] = mul nsw i64 %i, 3 1045*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[O2:%.*]] = mul nsw i64 [[O]], %j 1046*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr inbounds %s, %s* %p, i64 [[O2]] 1047*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s* [[PP1]], align 4 1048*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 1049*9880d681SAndroid Build Coastguard Worker; 1050*9880d681SAndroid Build Coastguard Worker %o = mul nsw i64 %i, 36 1051*9880d681SAndroid Build Coastguard Worker %o2 = mul nsw i64 %o, %j 1052*9880d681SAndroid Build Coastguard Worker %q = bitcast %s* %p to i8* 1053*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %o2 1054*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to %s* 1055*9880d681SAndroid Build Coastguard Worker %l = load %s, %s* %r 1056*9880d681SAndroid Build Coastguard Worker ret %s %l 1057*9880d681SAndroid Build Coastguard Worker} 1058*9880d681SAndroid Build Coastguard Worker 1059*9880d681SAndroid Build Coastguard Workerdefine %s @test78(%s *%p, i64 %i, i64 %j, i32 %k, i32 %l, i128 %m, i128 %n) { 1060*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test78( 1061*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = mul nsw i32 %k, 3 1062*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = mul nsw i32 [[A]], %l 1063*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = sext i32 [[B]] to i128 1064*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[D:%.*]] = mul nsw i128 [[C]], %m 1065*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = mul i128 [[D]], %n 1066*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[F:%.*]] = trunc i128 [[E]] to i64 1067*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[G:%.*]] = mul i64 [[F]], %i 1068*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[H:%.*]] = mul i64 [[G]], %j 1069*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr %s, %s* %p, i64 [[H]] 1070*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LOAD:%.*]] = load %s, %s* [[PP1]], align 4 1071*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[LOAD]] 1072*9880d681SAndroid Build Coastguard Worker; 1073*9880d681SAndroid Build Coastguard Worker %a = mul nsw i32 %k, 36 1074*9880d681SAndroid Build Coastguard Worker %b = mul nsw i32 %a, %l 1075*9880d681SAndroid Build Coastguard Worker %c = sext i32 %b to i128 1076*9880d681SAndroid Build Coastguard Worker %d = mul nsw i128 %c, %m 1077*9880d681SAndroid Build Coastguard Worker %e = mul i128 %d, %n 1078*9880d681SAndroid Build Coastguard Worker %f = trunc i128 %e to i64 1079*9880d681SAndroid Build Coastguard Worker %g = mul nsw i64 %f, %i 1080*9880d681SAndroid Build Coastguard Worker %h = mul nsw i64 %g, %j 1081*9880d681SAndroid Build Coastguard Worker %q = bitcast %s* %p to i8* 1082*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i64 %h 1083*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to %s* 1084*9880d681SAndroid Build Coastguard Worker %load = load %s, %s* %r 1085*9880d681SAndroid Build Coastguard Worker ret %s %load 1086*9880d681SAndroid Build Coastguard Worker} 1087*9880d681SAndroid Build Coastguard Worker 1088*9880d681SAndroid Build Coastguard Workerdefine %s @test79(%s *%p, i64 %i, i32 %j) { 1089*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test79( 1090*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = mul nsw i64 %i, 36 1091*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B:%.*]] = trunc i64 [[A]] to i32 1092*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = mul i32 [[B]], %j 1093*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Q:%.*]] = bitcast %s* %p to i8* 1094*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[C]] to i64 1095*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP:%.*]] = getelementptr inbounds i8, i8* [[Q]], i64 [[TMP1]] 1096*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = bitcast i8* [[PP]] to %s* 1097*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load %s, %s* [[R]], align 4 1098*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %s [[L]] 1099*9880d681SAndroid Build Coastguard Worker; 1100*9880d681SAndroid Build Coastguard Worker %a = mul nsw i64 %i, 36 1101*9880d681SAndroid Build Coastguard Worker %b = trunc i64 %a to i32 1102*9880d681SAndroid Build Coastguard Worker %c = mul i32 %b, %j 1103*9880d681SAndroid Build Coastguard Worker %q = bitcast %s* %p to i8* 1104*9880d681SAndroid Build Coastguard Worker %pp = getelementptr inbounds i8, i8* %q, i32 %c 1105*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to %s* 1106*9880d681SAndroid Build Coastguard Worker %l = load %s, %s* %r 1107*9880d681SAndroid Build Coastguard Worker ret %s %l 1108*9880d681SAndroid Build Coastguard Worker} 1109*9880d681SAndroid Build Coastguard Worker 1110*9880d681SAndroid Build Coastguard Workerdefine double @test80([100 x double]* %p, i32 %i) { 1111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80( 1112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = sext i32 %i to i64 1113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr [100 x double], [100 x double]* %p, i64 0, i64 [[TMP1]] 1114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double* [[PP1]], align 8 1115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 1116*9880d681SAndroid Build Coastguard Worker; 1117*9880d681SAndroid Build Coastguard Worker %tmp = shl nsw i32 %i, 3 1118*9880d681SAndroid Build Coastguard Worker %q = bitcast [100 x double]* %p to i8* 1119*9880d681SAndroid Build Coastguard Worker %pp = getelementptr i8, i8* %q, i32 %tmp 1120*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to double* 1121*9880d681SAndroid Build Coastguard Worker %l = load double, double* %r 1122*9880d681SAndroid Build Coastguard Worker ret double %l 1123*9880d681SAndroid Build Coastguard Worker} 1124*9880d681SAndroid Build Coastguard Worker 1125*9880d681SAndroid Build Coastguard Workerdefine double @test80_addrspacecast([100 x double] addrspace(1)* %p, i32 %i) { 1126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80_addrspacecast( 1127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr [100 x double], [100 x double] addrspace(1)* %p, i32 0, i32 %i 1128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double addrspace(1)* [[PP1]], align 8 1129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 1130*9880d681SAndroid Build Coastguard Worker; 1131*9880d681SAndroid Build Coastguard Worker %tmp = shl nsw i32 %i, 3 1132*9880d681SAndroid Build Coastguard Worker %q = addrspacecast [100 x double] addrspace(1)* %p to i8 addrspace(2)* 1133*9880d681SAndroid Build Coastguard Worker %pp = getelementptr i8, i8 addrspace(2)* %q, i32 %tmp 1134*9880d681SAndroid Build Coastguard Worker %r = addrspacecast i8 addrspace(2)* %pp to double addrspace(1)* 1135*9880d681SAndroid Build Coastguard Worker %l = load double, double addrspace(1)* %r 1136*9880d681SAndroid Build Coastguard Worker ret double %l 1137*9880d681SAndroid Build Coastguard Worker} 1138*9880d681SAndroid Build Coastguard Worker 1139*9880d681SAndroid Build Coastguard Workerdefine double @test80_addrspacecast_2([100 x double] addrspace(1)* %p, i32 %i) { 1140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80_addrspacecast_2( 1141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr [100 x double], [100 x double] addrspace(1)* %p, i32 0, i32 %i 1142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = addrspacecast double addrspace(1)* [[PP1]] to double addrspace(3)* 1143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double addrspace(3)* [[R]], align 8 1144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 1145*9880d681SAndroid Build Coastguard Worker; 1146*9880d681SAndroid Build Coastguard Worker %tmp = shl nsw i32 %i, 3 1147*9880d681SAndroid Build Coastguard Worker %q = addrspacecast [100 x double] addrspace(1)* %p to i8 addrspace(2)* 1148*9880d681SAndroid Build Coastguard Worker %pp = getelementptr i8, i8 addrspace(2)* %q, i32 %tmp 1149*9880d681SAndroid Build Coastguard Worker %r = addrspacecast i8 addrspace(2)* %pp to double addrspace(3)* 1150*9880d681SAndroid Build Coastguard Worker %l = load double, double addrspace(3)* %r 1151*9880d681SAndroid Build Coastguard Worker ret double %l 1152*9880d681SAndroid Build Coastguard Worker} 1153*9880d681SAndroid Build Coastguard Worker 1154*9880d681SAndroid Build Coastguard Workerdefine double @test80_as1([100 x double] addrspace(1)* %p, i16 %i) { 1155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test80_as1( 1156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = sext i16 %i to i32 1157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP1:%.*]] = getelementptr [100 x double], [100 x double] addrspace(1)* %p, i32 0, i32 [[TMP1]] 1158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double addrspace(1)* [[PP1]], align 8 1159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 1160*9880d681SAndroid Build Coastguard Worker; 1161*9880d681SAndroid Build Coastguard Worker %tmp = shl nsw i16 %i, 3 1162*9880d681SAndroid Build Coastguard Worker %q = bitcast [100 x double] addrspace(1)* %p to i8 addrspace(1)* 1163*9880d681SAndroid Build Coastguard Worker %pp = getelementptr i8, i8 addrspace(1)* %q, i16 %tmp 1164*9880d681SAndroid Build Coastguard Worker %r = bitcast i8 addrspace(1)* %pp to double addrspace(1)* 1165*9880d681SAndroid Build Coastguard Worker %l = load double, double addrspace(1)* %r 1166*9880d681SAndroid Build Coastguard Worker ret double %l 1167*9880d681SAndroid Build Coastguard Worker} 1168*9880d681SAndroid Build Coastguard Worker 1169*9880d681SAndroid Build Coastguard Workerdefine double @test81(double *%p, float %f) { 1170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test81( 1171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[I:%.*]] = fptosi float %f to i64 1172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Q:%.*]] = bitcast double* %p to i8* 1173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[PP:%.*]] = getelementptr i8, i8* [[Q]], i64 [[I]] 1174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[R:%.*]] = bitcast i8* [[PP]] to double* 1175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = load double, double* [[R]], align 8 1176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double [[L]] 1177*9880d681SAndroid Build Coastguard Worker; 1178*9880d681SAndroid Build Coastguard Worker %i = fptosi float %f to i64 1179*9880d681SAndroid Build Coastguard Worker %q = bitcast double* %p to i8* 1180*9880d681SAndroid Build Coastguard Worker %pp = getelementptr i8, i8* %q, i64 %i 1181*9880d681SAndroid Build Coastguard Worker %r = bitcast i8* %pp to double* 1182*9880d681SAndroid Build Coastguard Worker %l = load double, double* %r 1183*9880d681SAndroid Build Coastguard Worker ret double %l 1184*9880d681SAndroid Build Coastguard Worker} 1185*9880d681SAndroid Build Coastguard Worker 1186*9880d681SAndroid Build Coastguard Workerdefine i64 @test82(i64 %A) nounwind { 1187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test82( 1188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shl i64 %A, 1 1189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[E:%.*]] = and i64 [[TMP1]], 4294966784 1190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[E]] 1191*9880d681SAndroid Build Coastguard Worker; 1192*9880d681SAndroid Build Coastguard Worker %B = trunc i64 %A to i32 1193*9880d681SAndroid Build Coastguard Worker %C = lshr i32 %B, 8 1194*9880d681SAndroid Build Coastguard Worker %D = shl i32 %C, 9 1195*9880d681SAndroid Build Coastguard Worker %E = zext i32 %D to i64 1196*9880d681SAndroid Build Coastguard Worker ret i64 %E 1197*9880d681SAndroid Build Coastguard Worker} 1198*9880d681SAndroid Build Coastguard Worker 1199*9880d681SAndroid Build Coastguard Worker; PR15959 1200*9880d681SAndroid Build Coastguard Workerdefine i64 @test83(i16 %a, i64 %k) { 1201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test83( 1202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CONV:%.*]] = sext i16 %a to i32 1203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SUB:%.*]] = add i64 %k, 4294967295 1204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SH_PROM:%.*]] = trunc i64 [[SUB]] to i32 1205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[CONV]], [[SH_PROM]] 1206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SH_PROM1:%.*]] = zext i32 [[SHL]] to i64 1207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[SH_PROM1]] 1208*9880d681SAndroid Build Coastguard Worker; 1209*9880d681SAndroid Build Coastguard Worker %conv = sext i16 %a to i32 1210*9880d681SAndroid Build Coastguard Worker %sub = add nsw i64 %k, -1 1211*9880d681SAndroid Build Coastguard Worker %sh_prom = trunc i64 %sub to i32 1212*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %conv, %sh_prom 1213*9880d681SAndroid Build Coastguard Worker %sh_prom1 = zext i32 %shl to i64 1214*9880d681SAndroid Build Coastguard Worker ret i64 %sh_prom1 1215*9880d681SAndroid Build Coastguard Worker} 1216*9880d681SAndroid Build Coastguard Worker 1217*9880d681SAndroid Build Coastguard Workerdefine i8 @test84(i32 %a) { 1218*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test84( 1219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 %a, 2130706432 1220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHR:%.*]] = lshr exact i32 [[ADD]], 23 1221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8 1222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[TRUNC]] 1223*9880d681SAndroid Build Coastguard Worker; 1224*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %a, -16777216 1225*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i32 %add, 23 1226*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %shr to i8 1227*9880d681SAndroid Build Coastguard Worker ret i8 %trunc 1228*9880d681SAndroid Build Coastguard Worker} 1229*9880d681SAndroid Build Coastguard Worker 1230*9880d681SAndroid Build Coastguard Workerdefine i8 @test85(i32 %a) { 1231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test85( 1232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 %a, 2130706432 1233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHR:%.*]] = lshr exact i32 [[ADD]], 23 1234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[SHR]] to i8 1235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 [[TRUNC]] 1236*9880d681SAndroid Build Coastguard Worker; 1237*9880d681SAndroid Build Coastguard Worker %add = add nuw i32 %a, -16777216 1238*9880d681SAndroid Build Coastguard Worker %shr = lshr exact i32 %add, 23 1239*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %shr to i8 1240*9880d681SAndroid Build Coastguard Worker ret i8 %trunc 1241*9880d681SAndroid Build Coastguard Worker} 1242*9880d681SAndroid Build Coastguard Worker 1243*9880d681SAndroid Build Coastguard Workerdefine i16 @test86(i16 %v) { 1244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test86( 1245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[S1:%.*]] = ashr i16 %v, 4 1246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[S1]] 1247*9880d681SAndroid Build Coastguard Worker; 1248*9880d681SAndroid Build Coastguard Worker %a = sext i16 %v to i32 1249*9880d681SAndroid Build Coastguard Worker %s = ashr i32 %a, 4 1250*9880d681SAndroid Build Coastguard Worker %t = trunc i32 %s to i16 1251*9880d681SAndroid Build Coastguard Worker ret i16 %t 1252*9880d681SAndroid Build Coastguard Worker} 1253*9880d681SAndroid Build Coastguard Worker 1254*9880d681SAndroid Build Coastguard Workerdefine i16 @test87(i16 %v) { 1255*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test87( 1256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A1:%.*]] = ashr i16 %v, 12 1257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[A1]] 1258*9880d681SAndroid Build Coastguard Worker; 1259*9880d681SAndroid Build Coastguard Worker %c = sext i16 %v to i32 1260*9880d681SAndroid Build Coastguard Worker %m = mul nsw i32 %c, 16 1261*9880d681SAndroid Build Coastguard Worker %a = ashr i32 %m, 16 1262*9880d681SAndroid Build Coastguard Worker %t = trunc i32 %a to i16 1263*9880d681SAndroid Build Coastguard Worker ret i16 %t 1264*9880d681SAndroid Build Coastguard Worker} 1265*9880d681SAndroid Build Coastguard Worker 1266*9880d681SAndroid Build Coastguard Worker; Do not optimize to ashr i16 (shift by 18) 1267*9880d681SAndroid Build Coastguard Workerdefine i16 @test88(i16 %v) { 1268*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test88( 1269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A:%.*]] = sext i16 %v to i32 1270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[S:%.*]] = ashr i32 [[A]], 18 1271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T:%.*]] = trunc i32 [[S]] to i16 1272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[T]] 1273*9880d681SAndroid Build Coastguard Worker; 1274*9880d681SAndroid Build Coastguard Worker %a = sext i16 %v to i32 1275*9880d681SAndroid Build Coastguard Worker %s = ashr i32 %a, 18 1276*9880d681SAndroid Build Coastguard Worker %t = trunc i32 %s to i16 1277*9880d681SAndroid Build Coastguard Worker ret i16 %t 1278*9880d681SAndroid Build Coastguard Worker} 1279*9880d681SAndroid Build Coastguard Worker 1280*9880d681SAndroid Build Coastguard Worker; Overflow on a float to int or int to float conversion is undefined (PR21130). 1281*9880d681SAndroid Build Coastguard Worker 1282*9880d681SAndroid Build Coastguard Workerdefine i8 @overflow_fptosi() { 1283*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_fptosi( 1284*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 undef 1285*9880d681SAndroid Build Coastguard Worker; 1286*9880d681SAndroid Build Coastguard Worker %i = fptosi double 1.56e+02 to i8 1287*9880d681SAndroid Build Coastguard Worker ret i8 %i 1288*9880d681SAndroid Build Coastguard Worker} 1289*9880d681SAndroid Build Coastguard Worker 1290*9880d681SAndroid Build Coastguard Workerdefine i8 @overflow_fptoui() { 1291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_fptoui( 1292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 undef 1293*9880d681SAndroid Build Coastguard Worker; 1294*9880d681SAndroid Build Coastguard Worker %i = fptoui double 2.56e+02 to i8 1295*9880d681SAndroid Build Coastguard Worker ret i8 %i 1296*9880d681SAndroid Build Coastguard Worker} 1297*9880d681SAndroid Build Coastguard Worker 1298*9880d681SAndroid Build Coastguard Worker; The maximum float is approximately 2 ** 128 which is 3.4E38. 1299*9880d681SAndroid Build Coastguard Worker; The constant below is 4E38. Use a 130 bit integer to hold that 1300*9880d681SAndroid Build Coastguard Worker; number; 129-bits for the value + 1 bit for the sign. 1301*9880d681SAndroid Build Coastguard Workerdefine float @overflow_uitofp() { 1302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_uitofp( 1303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float undef 1304*9880d681SAndroid Build Coastguard Worker; 1305*9880d681SAndroid Build Coastguard Worker %i = uitofp i130 400000000000000000000000000000000000000 to float 1306*9880d681SAndroid Build Coastguard Worker ret float %i 1307*9880d681SAndroid Build Coastguard Worker} 1308*9880d681SAndroid Build Coastguard Worker 1309*9880d681SAndroid Build Coastguard Workerdefine float @overflow_sitofp() { 1310*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @overflow_sitofp( 1311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float undef 1312*9880d681SAndroid Build Coastguard Worker; 1313*9880d681SAndroid Build Coastguard Worker %i = sitofp i130 400000000000000000000000000000000000000 to float 1314*9880d681SAndroid Build Coastguard Worker ret float %i 1315*9880d681SAndroid Build Coastguard Worker} 1316*9880d681SAndroid Build Coastguard Worker 1317*9880d681SAndroid Build Coastguard Workerdefine i32 @PR21388(i32* %v) { 1318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR21388( 1319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i32* %v, null 1320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[ICMP]] to i32 1321*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SEXT]] 1322*9880d681SAndroid Build Coastguard Worker; 1323*9880d681SAndroid Build Coastguard Worker %icmp = icmp slt i32* %v, null 1324*9880d681SAndroid Build Coastguard Worker %sext = sext i1 %icmp to i32 1325*9880d681SAndroid Build Coastguard Worker ret i32 %sext 1326*9880d681SAndroid Build Coastguard Worker} 1327*9880d681SAndroid Build Coastguard Worker 1328*9880d681SAndroid Build Coastguard Workerdefine float @sitofp_zext(i16 %a) { 1329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sitofp_zext( 1330*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SITOFP:%.*]] = uitofp i16 %a to float 1331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float [[SITOFP]] 1332*9880d681SAndroid Build Coastguard Worker; 1333*9880d681SAndroid Build Coastguard Worker %zext = zext i16 %a to i32 1334*9880d681SAndroid Build Coastguard Worker %sitofp = sitofp i32 %zext to float 1335*9880d681SAndroid Build Coastguard Worker ret float %sitofp 1336*9880d681SAndroid Build Coastguard Worker} 1337*9880d681SAndroid Build Coastguard Worker 1338*9880d681SAndroid Build Coastguard Workerdefine i1 @PR23309(i32 %A, i32 %B) { 1339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR23309( 1340*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SUB:%.*]] = sub i32 %A, %B 1341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[SUB]], 1 1342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRUNC:%.*]] = icmp ne i32 [[TMP1]], 0 1343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TRUNC]] 1344*9880d681SAndroid Build Coastguard Worker; 1345*9880d681SAndroid Build Coastguard Worker %add = add i32 %A, -4 1346*9880d681SAndroid Build Coastguard Worker %sub = sub nsw i32 %add, %B 1347*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %sub to i1 1348*9880d681SAndroid Build Coastguard Worker ret i1 %trunc 1349*9880d681SAndroid Build Coastguard Worker} 1350*9880d681SAndroid Build Coastguard Worker 1351*9880d681SAndroid Build Coastguard Workerdefine i1 @PR23309v2(i32 %A, i32 %B) { 1352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR23309v2( 1353*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SUB:%.*]] = add i32 %A, %B 1354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[SUB]], 1 1355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TRUNC:%.*]] = icmp ne i32 [[TMP1]], 0 1356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TRUNC]] 1357*9880d681SAndroid Build Coastguard Worker; 1358*9880d681SAndroid Build Coastguard Worker %add = add i32 %A, -4 1359*9880d681SAndroid Build Coastguard Worker %sub = add nuw i32 %add, %B 1360*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %sub to i1 1361*9880d681SAndroid Build Coastguard Worker ret i1 %trunc 1362*9880d681SAndroid Build Coastguard Worker} 1363*9880d681SAndroid Build Coastguard Worker 1364*9880d681SAndroid Build Coastguard Workerdefine i16 @PR24763(i8 %V) { 1365*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR24763( 1366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[L:%.*]] = ashr i8 %V, 1 1367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[T:%.*]] = sext i8 [[L]] to i16 1368*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 [[T]] 1369*9880d681SAndroid Build Coastguard Worker; 1370*9880d681SAndroid Build Coastguard Worker %conv = sext i8 %V to i32 1371*9880d681SAndroid Build Coastguard Worker %l = lshr i32 %conv, 1 1372*9880d681SAndroid Build Coastguard Worker %t = trunc i32 %l to i16 1373*9880d681SAndroid Build Coastguard Worker ret i16 %t 1374*9880d681SAndroid Build Coastguard Worker} 1375