1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instsimplify -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a, i8 %b) 5*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.usub.with.overflow.i8(i8 %a, i8 %b) 6*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.ssub.with.overflow.i8(i8 %a, i8 %b) 7*9880d681SAndroid Build Coastguard Workerdeclare {i8, i1} @llvm.umul.with.overflow.i8(i8 %a, i8 %b) 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine i1 @test_uadd1() { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_uadd1( 11*9880d681SAndroid Build Coastguard Worker %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 3) 12*9880d681SAndroid Build Coastguard Worker %overflow = extractvalue {i8, i1} %x, 1 13*9880d681SAndroid Build Coastguard Worker ret i1 %overflow 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine i8 @test_uadd2() { 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_uadd2( 19*9880d681SAndroid Build Coastguard Worker %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 44) 20*9880d681SAndroid Build Coastguard Worker %result = extractvalue {i8, i1} %x, 0 21*9880d681SAndroid Build Coastguard Worker ret i8 %result 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8 42 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine {i8, i1} @test_usub1(i8 %V) { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_usub1( 27*9880d681SAndroid Build Coastguard Worker %x = call {i8, i1} @llvm.usub.with.overflow.i8(i8 %V, i8 %V) 28*9880d681SAndroid Build Coastguard Worker ret {i8, i1} %x 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret { i8, i1 } zeroinitializer 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine {i8, i1} @test_ssub1(i8 %V) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_ssub1( 34*9880d681SAndroid Build Coastguard Worker %x = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 %V, i8 %V) 35*9880d681SAndroid Build Coastguard Worker ret {i8, i1} %x 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret { i8, i1 } zeroinitializer 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine {i8, i1} @test_umul1(i8 %V) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_umul1( 41*9880d681SAndroid Build Coastguard Worker %x = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %V, i8 0) 42*9880d681SAndroid Build Coastguard Worker ret {i8, i1} %x 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret { i8, i1 } zeroinitializer 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdeclare i256 @llvm.cttz.i256(i256 %src, i1 %is_zero_undef) 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i256 @test_cttz() { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_cttz( 50*9880d681SAndroid Build Coastguard Worker %x = call i256 @llvm.cttz.i256(i256 10, i1 false) 51*9880d681SAndroid Build Coastguard Worker ret i256 %x 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i256 1 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdeclare i256 @llvm.ctpop.i256(i256 %src) 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i256 @test_ctpop() { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_ctpop( 59*9880d681SAndroid Build Coastguard Worker %x = call i256 @llvm.ctpop.i256(i256 10) 60*9880d681SAndroid Build Coastguard Worker ret i256 %x 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i256 2 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; Test a non-intrinsic that we know about as a library call. 65*9880d681SAndroid Build Coastguard Workerdeclare float @fabs(float %x) 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine float @test_fabs_libcall() { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_fabs_libcall( 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker %x = call float @fabs(float -42.0) 71*9880d681SAndroid Build Coastguard Worker; This is still a real function call, so instsimplify won't nuke it -- other 72*9880d681SAndroid Build Coastguard Worker; passes have to do that. 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @fabs 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker ret float %x 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 4.2{{0+}}e+01 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) nounwind readnone 81*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.floor.f32(float) nounwind readnone 82*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.ceil.f32(float) nounwind readnone 83*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.trunc.f32(float) nounwind readnone 84*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.rint.f32(float) nounwind readnone 85*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nearbyint.f32(float) nounwind readnone 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; Test idempotent intrinsics 88*9880d681SAndroid Build Coastguard Workerdefine float @test_idempotence(float %a) { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_idempotence( 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; CHECK: fabs 92*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 93*9880d681SAndroid Build Coastguard Worker %a0 = call float @llvm.fabs.f32(float %a) 94*9880d681SAndroid Build Coastguard Worker %a1 = call float @llvm.fabs.f32(float %a0) 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; CHECK: floor 97*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: floor 98*9880d681SAndroid Build Coastguard Worker %b0 = call float @llvm.floor.f32(float %a) 99*9880d681SAndroid Build Coastguard Worker %b1 = call float @llvm.floor.f32(float %b0) 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; CHECK: ceil 102*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ceil 103*9880d681SAndroid Build Coastguard Worker %c0 = call float @llvm.ceil.f32(float %a) 104*9880d681SAndroid Build Coastguard Worker %c1 = call float @llvm.ceil.f32(float %c0) 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; CHECK: trunc 107*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: trunc 108*9880d681SAndroid Build Coastguard Worker %d0 = call float @llvm.trunc.f32(float %a) 109*9880d681SAndroid Build Coastguard Worker %d1 = call float @llvm.trunc.f32(float %d0) 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; CHECK: rint 112*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rint 113*9880d681SAndroid Build Coastguard Worker %e0 = call float @llvm.rint.f32(float %a) 114*9880d681SAndroid Build Coastguard Worker %e1 = call float @llvm.rint.f32(float %e0) 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; CHECK: nearbyint 117*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: nearbyint 118*9880d681SAndroid Build Coastguard Worker %f0 = call float @llvm.nearbyint.f32(float %a) 119*9880d681SAndroid Build Coastguard Worker %f1 = call float @llvm.nearbyint.f32(float %f0) 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker %r0 = fadd float %a1, %b1 122*9880d681SAndroid Build Coastguard Worker %r1 = fadd float %r0, %c1 123*9880d681SAndroid Build Coastguard Worker %r2 = fadd float %r1, %d1 124*9880d681SAndroid Build Coastguard Worker %r3 = fadd float %r2, %e1 125*9880d681SAndroid Build Coastguard Worker %r4 = fadd float %r3, %f1 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker ret float %r4 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdefine i8* @operator_new() { 131*9880d681SAndroid Build Coastguard Workerentry: 132*9880d681SAndroid Build Coastguard Worker %call = tail call noalias i8* @_Znwm(i64 8) 133*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8* %call, null 134*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %cast.end, label %cast.notnull 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workercast.notnull: ; preds = %entry 137*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i8, i8* %call, i64 4 138*9880d681SAndroid Build Coastguard Worker br label %cast.end 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workercast.end: ; preds = %cast.notnull, %entry 141*9880d681SAndroid Build Coastguard Worker %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ] 142*9880d681SAndroid Build Coastguard Worker ret i8* %cast.result 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @operator_new 145*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 false, label %cast.end, label %cast.notnull 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdeclare nonnull noalias i8* @_Znwm(i64) 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker%"struct.std::nothrow_t" = type { i8 } 151*9880d681SAndroid Build Coastguard Worker@_ZSt7nothrow = external global %"struct.std::nothrow_t" 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerdefine i8* @operator_new_nothrow_t() { 154*9880d681SAndroid Build Coastguard Workerentry: 155*9880d681SAndroid Build Coastguard Worker %call = tail call noalias i8* @_ZnamRKSt9nothrow_t(i64 8, %"struct.std::nothrow_t"* @_ZSt7nothrow) 156*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8* %call, null 157*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %cast.end, label %cast.notnull 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workercast.notnull: ; preds = %entry 160*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i8, i8* %call, i64 4 161*9880d681SAndroid Build Coastguard Worker br label %cast.end 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workercast.end: ; preds = %cast.notnull, %entry 164*9880d681SAndroid Build Coastguard Worker %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ] 165*9880d681SAndroid Build Coastguard Worker ret i8* %cast.result 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @operator_new_nothrow_t 168*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp, label %cast.end, label %cast.notnull 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdeclare i8* @_ZnamRKSt9nothrow_t(i64, %"struct.std::nothrow_t"*) nounwind 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine i8* @malloc_can_return_null() { 174*9880d681SAndroid Build Coastguard Workerentry: 175*9880d681SAndroid Build Coastguard Worker %call = tail call noalias i8* @malloc(i64 8) 176*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8* %call, null 177*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %cast.end, label %cast.notnull 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workercast.notnull: ; preds = %entry 180*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i8, i8* %call, i64 4 181*9880d681SAndroid Build Coastguard Worker br label %cast.end 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workercast.end: ; preds = %cast.notnull, %entry 184*9880d681SAndroid Build Coastguard Worker %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ] 185*9880d681SAndroid Build Coastguard Worker ret i8* %cast.result 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @malloc_can_return_null 188*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp, label %cast.end, label %cast.notnull 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerdefine i32 @call_null() { 192*9880d681SAndroid Build Coastguard Workerentry: 193*9880d681SAndroid Build Coastguard Worker %call = call i32 null() 194*9880d681SAndroid Build Coastguard Worker ret i32 %call 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @call_null( 197*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdefine i32 @call_undef() { 200*9880d681SAndroid Build Coastguard Workerentry: 201*9880d681SAndroid Build Coastguard Worker %call = call i32 undef() 202*9880d681SAndroid Build Coastguard Worker ret i32 %call 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @call_undef( 205*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker@GV = private constant [8 x i32] [i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49] 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @partial_masked_load() { 210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @partial_masked_load( 211*9880d681SAndroid Build Coastguard Worker; CHECK: ret <8 x i32> <i32 undef, i32 undef, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47> 212*9880d681SAndroid Build Coastguard Worker %masked.load = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* bitcast (i32* getelementptr ([8 x i32], [8 x i32]* @GV, i64 0, i64 -2) to <8 x i32>*), i32 4, <8 x i1> <i1 false, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef) 213*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %masked.load 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @masked_load_undef_mask(<8 x i32>* %V) { 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_load_undef_mask( 218*9880d681SAndroid Build Coastguard Worker; CHECK: ret <8 x i32> <i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0> 219*9880d681SAndroid Build Coastguard Worker %masked.load = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* %V, i32 4, <8 x i1> undef, <8 x i32> <i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0>) 220*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %masked.load 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @malloc(i64) 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerdeclare <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>*, i32, <8 x i1>, <8 x i32>) 226