1*8468e674SAndrey Tretyakov; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV 2*8468e674SAndrey Tretyakov 3*8468e674SAndrey Tretyakov; CHECK-SPIRV-NOT: OpCapability ExpectAssumeKHR 4*8468e674SAndrey Tretyakov; CHECK-SPIRV-NOT: OpExtension "SPV_KHR_expect_assume" 5*8468e674SAndrey Tretyakov; CHECK-SPIRV: OpFunction 6*8468e674SAndrey Tretyakov; CHECK-SPIRV-NOT: %[[#]] = OpExpectKHR %[[#]] %[[#]] %[[#]] 7*8468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#RES1:]] = OpSConvert %[[#]] %[[#]] 8*8468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpINotEqual %[[#]] %[[#RES1]] %[[#]] 9*8468e674SAndrey Tretyakov 10*8468e674SAndrey Tretyakov; CHECK-SPIRV: OpFunction 11*8468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#RES2:]] = OpSConvert %[[#]] %[[#]] 12*8468e674SAndrey Tretyakov; CHECK-SPIRV-NOT: %[[#]] = OpExpectKHR %[[#]] %[[#]] %[[#]] 13*8468e674SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpINotEqual %[[#]] %[[#RES2]] %[[#]] 14*8468e674SAndrey Tretyakov 15*8468e674SAndrey Tretyakov%"class._ZTSZ4mainE3$_0.anon" = type { i8 } 16*8468e674SAndrey Tretyakov 17*8468e674SAndrey Tretyakovdefine spir_kernel void @_ZTSZ4mainE15kernel_function() { 18*8468e674SAndrey Tretyakoventry: 19*8468e674SAndrey Tretyakov %0 = alloca %"class._ZTSZ4mainE3$_0.anon", align 1 20*8468e674SAndrey Tretyakov %1 = bitcast %"class._ZTSZ4mainE3$_0.anon"* %0 to i8* 21*8468e674SAndrey Tretyakov call void @llvm.lifetime.start.p0i8(i64 1, i8* %1) 22*8468e674SAndrey Tretyakov %2 = addrspacecast %"class._ZTSZ4mainE3$_0.anon"* %0 to %"class._ZTSZ4mainE3$_0.anon" addrspace(4)* 23*8468e674SAndrey Tretyakov call spir_func void @"_ZZ4mainENK3$_0clEv"(%"class._ZTSZ4mainE3$_0.anon" addrspace(4)* %2) 24*8468e674SAndrey Tretyakov %3 = bitcast %"class._ZTSZ4mainE3$_0.anon"* %0 to i8* 25*8468e674SAndrey Tretyakov call void @llvm.lifetime.end.p0i8(i64 1, i8* %3) 26*8468e674SAndrey Tretyakov ret void 27*8468e674SAndrey Tretyakov} 28*8468e674SAndrey Tretyakov 29*8468e674SAndrey Tretyakovdeclare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) 30*8468e674SAndrey Tretyakov 31*8468e674SAndrey Tretyakovdefine internal spir_func void @"_ZZ4mainENK3$_0clEv"(%"class._ZTSZ4mainE3$_0.anon" addrspace(4)* %this) align 2 { 32*8468e674SAndrey Tretyakoventry: 33*8468e674SAndrey Tretyakov %this.addr = alloca %"class._ZTSZ4mainE3$_0.anon" addrspace(4)*, align 8 34*8468e674SAndrey Tretyakov %a = alloca i32, align 4 35*8468e674SAndrey Tretyakov %b = alloca i32, align 4 36*8468e674SAndrey Tretyakov store %"class._ZTSZ4mainE3$_0.anon" addrspace(4)* %this, %"class._ZTSZ4mainE3$_0.anon" addrspace(4)** %this.addr, align 8 37*8468e674SAndrey Tretyakov %this1 = load %"class._ZTSZ4mainE3$_0.anon" addrspace(4)*, %"class._ZTSZ4mainE3$_0.anon" addrspace(4)** %this.addr, align 8 38*8468e674SAndrey Tretyakov %0 = bitcast i32* %a to i8* 39*8468e674SAndrey Tretyakov call void @llvm.lifetime.start.p0i8(i64 4, i8* %0) 40*8468e674SAndrey Tretyakov %call = call spir_func i32 @_Z12expect_consti(i32 1) 41*8468e674SAndrey Tretyakov store i32 %call, i32* %a, align 4 42*8468e674SAndrey Tretyakov %1 = bitcast i32* %b to i8* 43*8468e674SAndrey Tretyakov call void @llvm.lifetime.start.p0i8(i64 4, i8* %1) 44*8468e674SAndrey Tretyakov %call2 = call spir_func i32 @_Z10expect_funi(i32 2) 45*8468e674SAndrey Tretyakov store i32 %call2, i32* %b, align 4 46*8468e674SAndrey Tretyakov %2 = bitcast i32* %b to i8* 47*8468e674SAndrey Tretyakov call void @llvm.lifetime.end.p0i8(i64 4, i8* %2) 48*8468e674SAndrey Tretyakov %3 = bitcast i32* %a to i8* 49*8468e674SAndrey Tretyakov call void @llvm.lifetime.end.p0i8(i64 4, i8* %3) 50*8468e674SAndrey Tretyakov ret void 51*8468e674SAndrey Tretyakov} 52*8468e674SAndrey Tretyakov 53*8468e674SAndrey Tretyakovdeclare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) 54*8468e674SAndrey Tretyakov 55*8468e674SAndrey Tretyakovdefine spir_func i32 @_Z12expect_consti(i32 %x) { 56*8468e674SAndrey Tretyakoventry: 57*8468e674SAndrey Tretyakov %retval = alloca i32, align 4 58*8468e674SAndrey Tretyakov %x.addr = alloca i32, align 4 59*8468e674SAndrey Tretyakov store i32 %x, i32* %x.addr, align 4 60*8468e674SAndrey Tretyakov %0 = load i32, i32* %x.addr, align 4 61*8468e674SAndrey Tretyakov %conv = sext i32 %0 to i64 62*8468e674SAndrey Tretyakov %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1) 63*8468e674SAndrey Tretyakov %tobool = icmp ne i64 %expval, 0 64*8468e674SAndrey Tretyakov br i1 %tobool, label %if.then, label %if.end 65*8468e674SAndrey Tretyakov 66*8468e674SAndrey Tretyakovif.then: ; preds = %entry 67*8468e674SAndrey Tretyakov store i32 0, i32* %retval, align 4 68*8468e674SAndrey Tretyakov br label %return 69*8468e674SAndrey Tretyakov 70*8468e674SAndrey Tretyakovif.end: ; preds = %entry 71*8468e674SAndrey Tretyakov %1 = load i32, i32* %x.addr, align 4 72*8468e674SAndrey Tretyakov store i32 %1, i32* %retval, align 4 73*8468e674SAndrey Tretyakov br label %return 74*8468e674SAndrey Tretyakov 75*8468e674SAndrey Tretyakovreturn: ; preds = %if.end, %if.then 76*8468e674SAndrey Tretyakov %2 = load i32, i32* %retval, align 4 77*8468e674SAndrey Tretyakov ret i32 %2 78*8468e674SAndrey Tretyakov} 79*8468e674SAndrey Tretyakov 80*8468e674SAndrey Tretyakovdefine spir_func i32 @_Z10expect_funi(i32 %x) { 81*8468e674SAndrey Tretyakoventry: 82*8468e674SAndrey Tretyakov %retval = alloca i32, align 4 83*8468e674SAndrey Tretyakov %x.addr = alloca i32, align 4 84*8468e674SAndrey Tretyakov store i32 %x, i32* %x.addr, align 4 85*8468e674SAndrey Tretyakov %0 = load i32, i32* %x.addr, align 4 86*8468e674SAndrey Tretyakov %conv = sext i32 %0 to i64 87*8468e674SAndrey Tretyakov %call = call spir_func i32 @_Z3foov() 88*8468e674SAndrey Tretyakov %conv1 = sext i32 %call to i64 89*8468e674SAndrey Tretyakov %expval = call i64 @llvm.expect.i64(i64 %conv, i64 %conv1) 90*8468e674SAndrey Tretyakov %tobool = icmp ne i64 %expval, 0 91*8468e674SAndrey Tretyakov br i1 %tobool, label %if.then, label %if.end 92*8468e674SAndrey Tretyakov 93*8468e674SAndrey Tretyakovif.then: ; preds = %entry 94*8468e674SAndrey Tretyakov store i32 0, i32* %retval, align 4 95*8468e674SAndrey Tretyakov br label %return 96*8468e674SAndrey Tretyakov 97*8468e674SAndrey Tretyakovif.end: ; preds = %entry 98*8468e674SAndrey Tretyakov %1 = load i32, i32* %x.addr, align 4 99*8468e674SAndrey Tretyakov store i32 %1, i32* %retval, align 4 100*8468e674SAndrey Tretyakov br label %return 101*8468e674SAndrey Tretyakov 102*8468e674SAndrey Tretyakovreturn: ; preds = %if.end, %if.then 103*8468e674SAndrey Tretyakov %2 = load i32, i32* %retval, align 4 104*8468e674SAndrey Tretyakov ret i32 %2 105*8468e674SAndrey Tretyakov} 106*8468e674SAndrey Tretyakov 107*8468e674SAndrey Tretyakovdeclare i64 @llvm.expect.i64(i64, i64) 108*8468e674SAndrey Tretyakov 109*8468e674SAndrey Tretyakovdeclare spir_func i32 @_Z3foov() 110