151 lines · plain
1; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S < %s | FileCheck %s2 3target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"4target triple = "x86_64-pc-linux-gnu"5 6declare zeroext i1 @return_i1()7 8define i32 @test_sor_basic(ptr addrspace(1) %base) gc "statepoint-example" {9; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 1510; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 1511entry:12 %ptr = getelementptr i32, ptr addrspace(1) %base, i32 1513 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr)]14 %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)15 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)16 %ret = load i32, ptr addrspace(1) %ptr-new17 ret i32 %ret18}19 20define i32 @test_sor_two_derived(ptr addrspace(1) %base) gc "statepoint-example" {21; CHECK-LABEL: @test_sor_two_derived(22; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 1523; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 1224; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 1525; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 1226entry:27 %ptr = getelementptr i32, ptr addrspace(1) %base, i32 1528 %ptr2 = getelementptr i32, ptr addrspace(1) %base, i32 1229 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr, ptr addrspace(1) %ptr2)]30 %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)31 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)32 %ptr2-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 2)33 %ret = load i32, ptr addrspace(1) %ptr-new34 ret i32 %ret35}36 37define i32 @test_sor_ooo(ptr addrspace(1) %base) gc "statepoint-example" {38; CHECK-LABEL: @test_sor_ooo(39; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 1540; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 1541entry:42 %ptr = getelementptr i32, ptr addrspace(1) %base, i32 1543 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr)]44 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)45 %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)46 %ret = load i32, ptr addrspace(1) %ptr-new47 ret i32 %ret48}49 50define i32 @test_sor_gep_smallint(ptr addrspace(1) %base) gc "statepoint-example" {51; CHECK: getelementptr [3 x i32], ptr addrspace(1) %base, i32 0, i32 252; CHECK: getelementptr [3 x i32], ptr addrspace(1) %base-new, i32 0, i32 253entry:54 %ptr = getelementptr [3 x i32], ptr addrspace(1) %base, i32 0, i32 255 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr)]56 %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)57 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)58 %ret = load i32, ptr addrspace(1) %ptr-new59 ret i32 %ret60}61 62define i32 @test_sor_gep_largeint(ptr addrspace(1) %base) gc "statepoint-example" {63; CHECK: getelementptr [3 x i32], ptr addrspace(1) %base, i32 0, i32 2164; CHECK-NOT: getelementptr [3 x i32], ptr addrspace(1) %base-new, i32 0, i32 2165entry:66 %ptr = getelementptr [3 x i32], ptr addrspace(1) %base, i32 0, i32 2167 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr)]68 %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)69 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)70 %ret = load i32, ptr addrspace(1) %ptr-new71 ret i32 %ret72}73 74define i32 @test_sor_noop(ptr addrspace(1) %base) gc "statepoint-example" {75; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 1576; CHECK: call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)77; CHECK: call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 2)78entry:79 %ptr = getelementptr i32, ptr addrspace(1) %base, i32 1580 %ptr2 = getelementptr i32, ptr addrspace(1) %base, i32 1281 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr, ptr addrspace(1) %ptr2)]82 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)83 %ptr2-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 2)84 %ret = load i32, ptr addrspace(1) %ptr-new85 ret i32 %ret86}87 88define i32 @test_sor_basic_wrong_order(ptr addrspace(1) %base) gc "statepoint-example" {89; CHECK-LABEL: @test_sor_basic_wrong_order90; Here we have base relocate inserted after derived. Make sure that we don't91; produce uses of the relocated base pointer before it's definition.92entry:93 %ptr = getelementptr i32, ptr addrspace(1) %base, i32 1594 ; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 1595 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr)]96 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)97 %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)98 ; CHECK: %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)99 ; CHECK-NEXT: getelementptr i32, ptr addrspace(1) %base-new, i32 15100 %ret = load i32, ptr addrspace(1) %ptr-new101 ret i32 %ret102}103 104define i32 @test_sor_noop_cross_bb(i1 %external-cond, ptr addrspace(1) %base) gc "statepoint-example" {105; CHECK-LABEL: @test_sor_noop_cross_bb106; Here base relocate doesn't dominate derived relocate. Make sure that we don't107; produce undefined use of the relocated base pointer.108entry:109 %ptr = getelementptr i32, ptr addrspace(1) %base, i32 15110 ; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 15111 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr)]112 br i1 %external-cond, label %left, label %right113 114left:115 %ptr-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)116 ; CHECK: call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)117 %ret-new = load i32, ptr addrspace(1) %ptr-new118 ret i32 %ret-new119 120right:121 %ptr-base = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)122 ; CHECK: call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)123 %ret-base = load i32, ptr addrspace(1) %ptr-base124 ret i32 %ret-base125}126 127define i32 @test_sor_noop_same_bb(i1 %external-cond, ptr addrspace(1) %base) gc "statepoint-example" {128; CHECK-LABEL: @test_sor_noop_same_bb129; Here base relocate doesn't dominate derived relocate. Make sure that we don't130; produce undefined use of the relocated base pointer.131entry:132 %ptr1 = getelementptr i32, ptr addrspace(1) %base, i32 15133 ; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 15134 %ptr2 = getelementptr i32, ptr addrspace(1) %base, i32 5135 ; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 5136 %tok = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %base, ptr addrspace(1) %ptr1, ptr addrspace(1) %ptr2)]137 ; CHECK: call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)138 %ptr2-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 2)139 %ret2-new = load i32, ptr addrspace(1) %ptr2-new140 ; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 5141 %ptr1-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 1)142 %ret1-new = load i32, ptr addrspace(1) %ptr1-new143 ; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 15144 %base-new = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %tok, i32 0, i32 0)145 %ret-new = add i32 %ret2-new, %ret1-new146 ret i32 %ret-new147}148 149declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)150declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32, i32)151