diff --git a/llvm/test/CodeGen/Generic/overloaded-intrinsic-name.ll b/llvm/test/CodeGen/Generic/overloaded-intrinsic-name.ll index b0ab95edec435e..e3f120412e04cc 100644 --- a/llvm/test/CodeGen/Generic/overloaded-intrinsic-name.ll +++ b/llvm/test/CodeGen/Generic/overloaded-intrinsic-name.ll @@ -12,75 +12,75 @@ ; will serve the purpose. ; function and integer -define i32* @test_iAny(i32* %v) gc "statepoint-example" { - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %v)] - %v-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - ret i32* %v-new +define i32 addrspace(1)* @test_iAny(i32 addrspace(1)* %v) gc "statepoint-example" { + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %v)] + %v-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + ret i32 addrspace(1)* %v-new } ; float -define float* @test_fAny(float* %v) gc "statepoint-example" { - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(float* %v)] - %v-new = call float* @llvm.experimental.gc.relocate.p0f32(token %tok, i32 0, i32 0) - ret float* %v-new +define float addrspace(1)* @test_fAny(float addrspace(1)* %v) gc "statepoint-example" { + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(float addrspace(1)* %v)] + %v-new = call float addrspace(1)* @llvm.experimental.gc.relocate.p1f32(token %tok, i32 0, i32 0) + ret float addrspace(1)* %v-new } ; array of integers -define [3 x i32]* @test_aAny([3 x i32]* %v) gc "statepoint-example" { - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"([3 x i32]* %v)] - %v-new = call [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token %tok, i32 0, i32 0) - ret [3 x i32]* %v-new +define [3 x i32] addrspace(1)* @test_aAny([3 x i32] addrspace(1)* %v) gc "statepoint-example" { + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"([3 x i32] addrspace(1)* %v)] + %v-new = call [3 x i32] addrspace(1)* @llvm.experimental.gc.relocate.p1a3i32(token %tok, i32 0, i32 0) + ret [3 x i32] addrspace(1)* %v-new } ; vector of integers -define <3 x i32>* @test_vAny(<3 x i32>* %v) gc "statepoint-example" { - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(<3 x i32>* %v)] - %v-new = call <3 x i32>* @llvm.experimental.gc.relocate.p0v3i32(token %tok, i32 0, i32 0) - ret <3 x i32>* %v-new +define <3 x i32> addrspace(1)* @test_vAny(<3 x i32> addrspace(1)* %v) gc "statepoint-example" { + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(<3 x i32> addrspace(1)* %v)] + %v-new = call <3 x i32> addrspace(1)* @llvm.experimental.gc.relocate.p1v3i32(token %tok, i32 0, i32 0) + ret <3 x i32> addrspace(1)* %v-new } %struct.test = type { i32, i1 } ; struct -define %struct.test* @test_struct(%struct.test* %v) gc "statepoint-example" { - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(%struct.test* %v)] - %v-new = call %struct.test* @llvm.experimental.gc.relocate.p0s_struct.tests(token %tok, i32 0, i32 0) - ret %struct.test* %v-new +define %struct.test addrspace(1)* @test_struct(%struct.test addrspace(1)* %v) gc "statepoint-example" { + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(%struct.test addrspace(1)* %v)] + %v-new = call %struct.test addrspace(1)* @llvm.experimental.gc.relocate.p1s_struct.tests(token %tok, i32 0, i32 0) + ret %struct.test addrspace(1)* %v-new } ; literal struct with nested literal struct -define {i64, i64, {i64} }* @test_literal_struct({i64, i64, {i64}}* %v) gc "statepoint-example" { - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"({i64, i64, {i64}} *%v)] - %v-new = call {i64, i64, {i64}}* @llvm.experimental.gc.relocate.p0sl_i64i64sl_i64ss.test(token %tok, i32 0, i32 0) - ret {i64, i64, {i64}}* %v-new +define {i64, i64, {i64} } addrspace(1)* @test_literal_struct({i64, i64, {i64}} addrspace(1)* %v) gc "statepoint-example" { + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"({i64, i64, {i64}} addrspace(1)* %v)] + %v-new = call {i64, i64, {i64}} addrspace(1)* @llvm.experimental.gc.relocate.p1sl_i64i64sl_i64ss.test(token %tok, i32 0, i32 0) + ret {i64, i64, {i64}} addrspace(1)* %v-new } ; struct with a horrible name, broken when structs were unprefixed %i32 = type { i32 } -define %i32* @test_i32_struct(%i32* %v) gc "statepoint-example" { +define %i32 addrspace(1)* @test_i32_struct(%i32 addrspace(1)* %v) gc "statepoint-example" { entry: - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(%i32* %v)] - %v-new = call %i32* @llvm.experimental.gc.relocate.p0s_i32s(token %tok, i32 0, i32 0) - ret %i32* %v-new + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(%i32 addrspace(1)* %v)] + %v-new = call %i32 addrspace(1)* @llvm.experimental.gc.relocate.p1s_i32s(token %tok, i32 0, i32 0) + ret %i32 addrspace(1)* %v-new } ; completely broken intrinsic naming due to needing remangling. Just use random naming to test -define %i32* @test_broken_names(%i32* %v) gc "statepoint-example" { +define %i32 addrspace(1)* @test_broken_names(%i32 addrspace(1)* %v) gc "statepoint-example" { entry: - %tok = call fastcc token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.deadbeef(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(%i32* %v)] + %tok = call fastcc token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.deadbeef(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(%i32 addrspace(1)* %v)] ; Make sure we do not destroy the calling convention when remangling ; CHECK: fastcc - %v-new = call %i32* @llvm.experimental.gc.relocate.beefdead(token %tok, i32 0, i32 0) - ret %i32* %v-new + %v-new = call %i32 addrspace(1)* @llvm.experimental.gc.relocate.beefdead(token %tok, i32 0, i32 0) + ret %i32 addrspace(1)* %v-new } declare zeroext i1 @return_i1() declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...) -declare i32* @llvm.experimental.gc.relocate.p0i32(token, i32, i32) -declare float* @llvm.experimental.gc.relocate.p0f32(token, i32, i32) -declare [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token, i32, i32) -declare <3 x i32>* @llvm.experimental.gc.relocate.p0v3i32(token, i32, i32) -declare %struct.test* @llvm.experimental.gc.relocate.p0s_struct.tests(token, i32, i32) -declare {i64, i64, {i64}}* @llvm.experimental.gc.relocate.p0sl_i64i64sl_i64ss.test(token, i32, i32) -declare %i32* @llvm.experimental.gc.relocate.p0s_i32s(token, i32, i32) -declare %i32* @llvm.experimental.gc.relocate.beefdead(token, i32, i32) +declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) +declare float addrspace(1)* @llvm.experimental.gc.relocate.p1f32(token, i32, i32) +declare [3 x i32] addrspace(1)* @llvm.experimental.gc.relocate.p1a3i32(token, i32, i32) +declare <3 x i32> addrspace(1)* @llvm.experimental.gc.relocate.p1v3i32(token, i32, i32) +declare %struct.test addrspace(1)* @llvm.experimental.gc.relocate.p1s_struct.tests(token, i32, i32) +declare {i64, i64, {i64}} addrspace(1)* @llvm.experimental.gc.relocate.p1sl_i64i64sl_i64ss.test(token, i32, i32) +declare %i32 addrspace(1)* @llvm.experimental.gc.relocate.p1s_i32s(token, i32, i32) +declare %i32 addrspace(1)* @llvm.experimental.gc.relocate.beefdead(token, i32, i32) declare token @llvm.experimental.gc.statepoint.deadbeef(i64, i32, i1 ()*, i32, i32, ...) diff --git a/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll b/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll index 092410cf260b1f..eda8a8e84beb15 100644 --- a/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll +++ b/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll @@ -5,145 +5,145 @@ target triple = "x86_64-pc-linux-gnu" declare zeroext i1 @return_i1() -define i32 @test_sor_basic(i32* %base) gc "statepoint-example" { -; CHECK: getelementptr i32, i32* %base, i32 15 -; CHECK: getelementptr i32, i32* %base-new, i32 15 +define i32 @test_sor_basic(i32 addrspace(1)* %base) gc "statepoint-example" { +; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 15 +; CHECK: getelementptr i32, i32 addrspace(1)* %base-new, i32 15 entry: - %ptr = getelementptr i32, i32* %base, i32 15 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %base, i32* %ptr)] - %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %ret = load i32, i32* %ptr-new + %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base, i32 addrspace(1)* %ptr)] + %base-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %ret = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret } -define i32 @test_sor_two_derived(i32* %base) gc "statepoint-example" { -; CHECK: getelementptr i32, i32* %base, i32 15 -; CHECK: getelementptr i32, i32* %base, i32 12 -; CHECK: getelementptr i32, i32* %base-new, i32 12 -; CHECK: getelementptr i32, i32* %base-new, i32 15 +define i32 @test_sor_two_derived(i32 addrspace(1)* %base) gc "statepoint-example" { +; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 15 +; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 12 +; CHECK: getelementptr i32, i32 addrspace(1)* %base-new, i32 12 +; CHECK: getelementptr i32, i32 addrspace(1)* %base-new, i32 15 entry: - %ptr = getelementptr i32, i32* %base, i32 15 - %ptr2 = getelementptr i32, i32* %base, i32 12 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %base, i32* %ptr, i32* %ptr2)] - %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %ptr2-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 2) - %ret = load i32, i32* %ptr-new + %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15 + %ptr2 = getelementptr i32, i32 addrspace(1)* %base, i32 12 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base, i32 addrspace(1)* %ptr, i32 addrspace(1)* %ptr2)] + %base-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %ptr2-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 2) + %ret = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret } -define i32 @test_sor_ooo(i32* %base) gc "statepoint-example" { -; CHECK: getelementptr i32, i32* %base, i32 15 -; CHECK: getelementptr i32, i32* %base-new, i32 15 +define i32 @test_sor_ooo(i32 addrspace(1)* %base) gc "statepoint-example" { +; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 15 +; CHECK: getelementptr i32, i32 addrspace(1)* %base-new, i32 15 entry: - %ptr = getelementptr i32, i32* %base, i32 15 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %base, i32* %ptr)] - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - %ret = load i32, i32* %ptr-new + %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base, i32 addrspace(1)* %ptr)] + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %base-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + %ret = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret } -define i32 @test_sor_gep_smallint([3 x i32]* %base) gc "statepoint-example" { -; CHECK: getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 2 -; CHECK: getelementptr [3 x i32], [3 x i32]* %base-new, i32 0, i32 2 +define i32 @test_sor_gep_smallint([3 x i32] addrspace(1)* %base) gc "statepoint-example" { +; CHECK: getelementptr [3 x i32], [3 x i32] addrspace(1)* %base, i32 0, i32 2 +; CHECK: getelementptr [3 x i32], [3 x i32] addrspace(1)* %base-new, i32 0, i32 2 entry: - %ptr = getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 2 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"([3 x i32]* %base, i32* %ptr)] - %base-new = call [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token %tok, i32 0, i32 0) - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %ret = load i32, i32* %ptr-new + %ptr = getelementptr [3 x i32], [3 x i32] addrspace(1)* %base, i32 0, i32 2 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"([3 x i32] addrspace(1)* %base, i32 addrspace(1)* %ptr)] + %base-new = call [3 x i32] addrspace(1)* @llvm.experimental.gc.relocate.p1a3i32(token %tok, i32 0, i32 0) + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %ret = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret } -define i32 @test_sor_gep_largeint([3 x i32]* %base) gc "statepoint-example" { -; CHECK: getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 21 -; CHECK-NOT: getelementptr [3 x i32], [3 x i32]* %base-new, i32 0, i32 21 +define i32 @test_sor_gep_largeint([3 x i32] addrspace(1)* %base) gc "statepoint-example" { +; CHECK: getelementptr [3 x i32], [3 x i32] addrspace(1)* %base, i32 0, i32 21 +; CHECK-NOT: getelementptr [3 x i32], [3 x i32] addrspace(1)* %base-new, i32 0, i32 21 entry: - %ptr = getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 21 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"([3 x i32]* %base, i32* %ptr)] - %base-new = call [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token %tok, i32 0, i32 0) - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %ret = load i32, i32* %ptr-new + %ptr = getelementptr [3 x i32], [3 x i32] addrspace(1)* %base, i32 0, i32 21 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"([3 x i32] addrspace(1)* %base, i32 addrspace(1)* %ptr)] + %base-new = call [3 x i32] addrspace(1)* @llvm.experimental.gc.relocate.p1a3i32(token %tok, i32 0, i32 0) + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %ret = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret } -define i32 @test_sor_noop(i32* %base) gc "statepoint-example" { -; CHECK: getelementptr i32, i32* %base, i32 15 -; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) -; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 2) +define i32 @test_sor_noop(i32 addrspace(1)* %base) gc "statepoint-example" { +; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 15 +; CHECK: call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) +; CHECK: call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 2) entry: - %ptr = getelementptr i32, i32* %base, i32 15 - %ptr2 = getelementptr i32, i32* %base, i32 12 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %base, i32* %ptr, i32* %ptr2)] - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %ptr2-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 2) - %ret = load i32, i32* %ptr-new + %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15 + %ptr2 = getelementptr i32, i32 addrspace(1)* %base, i32 12 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base, i32 addrspace(1)* %ptr, i32 addrspace(1)* %ptr2)] + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %ptr2-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 2) + %ret = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret } -define i32 @test_sor_basic_wrong_order(i32* %base) gc "statepoint-example" { +define i32 @test_sor_basic_wrong_order(i32 addrspace(1)* %base) gc "statepoint-example" { ; CHECK-LABEL: @test_sor_basic_wrong_order ; Here we have base relocate inserted after derived. Make sure that we don't ; produce uses of the relocated base pointer before it's definition. entry: - %ptr = getelementptr i32, i32* %base, i32 15 - ; CHECK: getelementptr i32, i32* %base, i32 15 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %base, i32* %ptr)] - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - ; CHECK: %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - ; CHECK-NEXT: getelementptr i32, i32* %base-new, i32 15 - %ret = load i32, i32* %ptr-new + %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15 + ; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 15 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base, i32 addrspace(1)* %ptr)] + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %base-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + ; CHECK: %base-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + ; CHECK-NEXT: getelementptr i32, i32 addrspace(1)* %base-new, i32 15 + %ret = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret } -define i32 @test_sor_noop_cross_bb(i1 %external-cond, i32* %base) gc "statepoint-example" { +define i32 @test_sor_noop_cross_bb(i1 %external-cond, i32 addrspace(1)* %base) gc "statepoint-example" { ; CHECK-LABEL: @test_sor_noop_cross_bb ; Here base relocate doesn't dominate derived relocate. Make sure that we don't ; produce undefined use of the relocated base pointer. entry: - %ptr = getelementptr i32, i32* %base, i32 15 - ; CHECK: getelementptr i32, i32* %base, i32 15 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %base, i32* %ptr)] + %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15 + ; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 15 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base, i32 addrspace(1)* %ptr)] br i1 %external-cond, label %left, label %right left: - %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - ; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %ret-new = load i32, i32* %ptr-new + %ptr-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + ; CHECK: call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %ret-new = load i32, i32 addrspace(1)* %ptr-new ret i32 %ret-new right: - %ptr-base = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - ; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - %ret-base = load i32, i32* %ptr-base + %ptr-base = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + ; CHECK: call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + %ret-base = load i32, i32 addrspace(1)* %ptr-base ret i32 %ret-base } -define i32 @test_sor_noop_same_bb(i1 %external-cond, i32* %base) gc "statepoint-example" { +define i32 @test_sor_noop_same_bb(i1 %external-cond, i32 addrspace(1)* %base) gc "statepoint-example" { ; CHECK-LABEL: @test_sor_noop_same_bb ; Here base relocate doesn't dominate derived relocate. Make sure that we don't ; produce undefined use of the relocated base pointer. entry: - %ptr1 = getelementptr i32, i32* %base, i32 15 - ; CHECK: getelementptr i32, i32* %base, i32 15 - %ptr2 = getelementptr i32, i32* %base, i32 5 - ; CHECK: getelementptr i32, i32* %base, i32 5 - %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32* %base, i32* %ptr1, i32* %ptr2)] - ; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) - %ptr2-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 2) - %ret2-new = load i32, i32* %ptr2-new - ; CHECK: getelementptr i32, i32* %base-new, i32 5 - %ptr1-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 1) - %ret1-new = load i32, i32* %ptr1-new - ; CHECK: getelementptr i32, i32* %base-new, i32 15 - %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 0, i32 0) + %ptr1 = getelementptr i32, i32 addrspace(1)* %base, i32 15 + ; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 15 + %ptr2 = getelementptr i32, i32 addrspace(1)* %base, i32 5 + ; CHECK: getelementptr i32, i32 addrspace(1)* %base, i32 5 + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base, i32 addrspace(1)* %ptr1, i32 addrspace(1)* %ptr2)] + ; CHECK: call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) + %ptr2-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 2) + %ret2-new = load i32, i32 addrspace(1)* %ptr2-new + ; CHECK: getelementptr i32, i32 addrspace(1)* %base-new, i32 5 + %ptr1-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 1) + %ret1-new = load i32, i32 addrspace(1)* %ptr1-new + ; CHECK: getelementptr i32, i32 addrspace(1)* %base-new, i32 15 + %base-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0) %ret-new = add i32 %ret2-new, %ret1-new ret i32 %ret-new } declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...) -declare i32* @llvm.experimental.gc.relocate.p0i32(token, i32, i32) -declare [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token, i32, i32) +declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) +declare [3 x i32] addrspace(1)* @llvm.experimental.gc.relocate.p1a3i32(token, i32, i32)