blob: b31dfe7f3fa63c0d8e3cd70fc22844b731386349 [file] [log] [blame]
Ramkumar Ramachandradba73292015-01-14 23:27:07 +00001; RUN: opt -codegenprepare -S < %s | FileCheck %s
2
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
Philip Reamese1bf2702015-03-27 05:09:33 +00008define i32 @test_sor_basic(i32* %base) gc "statepoint-example" {
David Blaikie79e6c742015-02-27 19:29:02 +00009; CHECK: getelementptr i32, i32* %base, i32 15
10; CHECK: getelementptr i32, i32* %base-new, i32 15
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000011entry:
David Blaikie79e6c742015-02-27 19:29:02 +000012 %ptr = getelementptr i32, i32* %base, i32 15
Chen Lid71999e2015-12-26 07:54:32 +000013 %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, i32* %base, i32* %ptr)
14 %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 7)
15 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
David Blaikiea79ac142015-02-27 21:17:42 +000016 %ret = load i32, i32* %ptr-new
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000017 ret i32 %ret
18}
19
Philip Reamese1bf2702015-03-27 05:09:33 +000020define i32 @test_sor_two_derived(i32* %base) gc "statepoint-example" {
David Blaikie79e6c742015-02-27 19:29:02 +000021; CHECK: getelementptr i32, i32* %base, i32 15
22; CHECK: getelementptr i32, i32* %base, i32 12
David Blaikie79e6c742015-02-27 19:29:02 +000023; CHECK: getelementptr i32, i32* %base-new, i32 12
Pat Gavlincc0431d2015-05-08 18:07:42 +000024; CHECK: getelementptr i32, i32* %base-new, i32 15
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000025entry:
David Blaikie79e6c742015-02-27 19:29:02 +000026 %ptr = getelementptr i32, i32* %base, i32 15
27 %ptr2 = getelementptr i32, i32* %base, i32 12
Chen Lid71999e2015-12-26 07:54:32 +000028 %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, i32* %base, i32* %ptr, i32* %ptr2)
29 %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 7)
30 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
31 %ptr2-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 9)
David Blaikiea79ac142015-02-27 21:17:42 +000032 %ret = load i32, i32* %ptr-new
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000033 ret i32 %ret
34}
35
Philip Reamese1bf2702015-03-27 05:09:33 +000036define i32 @test_sor_ooo(i32* %base) gc "statepoint-example" {
David Blaikie79e6c742015-02-27 19:29:02 +000037; CHECK: getelementptr i32, i32* %base, i32 15
38; CHECK: getelementptr i32, i32* %base-new, i32 15
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000039entry:
David Blaikie79e6c742015-02-27 19:29:02 +000040 %ptr = getelementptr i32, i32* %base, i32 15
Chen Lid71999e2015-12-26 07:54:32 +000041 %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, i32* %base, i32* %ptr)
42 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
43 %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 7)
David Blaikiea79ac142015-02-27 21:17:42 +000044 %ret = load i32, i32* %ptr-new
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000045 ret i32 %ret
46}
47
Philip Reamese1bf2702015-03-27 05:09:33 +000048define i32 @test_sor_gep_smallint([3 x i32]* %base) gc "statepoint-example" {
David Blaikie79e6c742015-02-27 19:29:02 +000049; CHECK: getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 2
50; CHECK: getelementptr [3 x i32], [3 x i32]* %base-new, i32 0, i32 2
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000051entry:
David Blaikie79e6c742015-02-27 19:29:02 +000052 %ptr = getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 2
Chen Lid71999e2015-12-26 07:54:32 +000053 %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, [3 x i32]* %base, i32* %ptr)
54 %base-new = call [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token %tok, i32 7, i32 7)
55 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
David Blaikiea79ac142015-02-27 21:17:42 +000056 %ret = load i32, i32* %ptr-new
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000057 ret i32 %ret
58}
59
Philip Reamese1bf2702015-03-27 05:09:33 +000060define i32 @test_sor_gep_largeint([3 x i32]* %base) gc "statepoint-example" {
David Blaikie79e6c742015-02-27 19:29:02 +000061; CHECK: getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 21
62; CHECK-NOT: getelementptr [3 x i32], [3 x i32]* %base-new, i32 0, i32 21
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000063entry:
David Blaikie79e6c742015-02-27 19:29:02 +000064 %ptr = getelementptr [3 x i32], [3 x i32]* %base, i32 0, i32 21
Chen Lid71999e2015-12-26 07:54:32 +000065 %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, [3 x i32]* %base, i32* %ptr)
66 %base-new = call [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token %tok, i32 7, i32 7)
67 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
David Blaikiea79ac142015-02-27 21:17:42 +000068 %ret = load i32, i32* %ptr-new
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000069 ret i32 %ret
70}
71
Philip Reamese1bf2702015-03-27 05:09:33 +000072define i32 @test_sor_noop(i32* %base) gc "statepoint-example" {
David Blaikie79e6c742015-02-27 19:29:02 +000073; CHECK: getelementptr i32, i32* %base, i32 15
Chen Lid71999e2015-12-26 07:54:32 +000074; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
75; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 9)
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000076entry:
David Blaikie79e6c742015-02-27 19:29:02 +000077 %ptr = getelementptr i32, i32* %base, i32 15
78 %ptr2 = getelementptr i32, i32* %base, i32 12
Chen Lid71999e2015-12-26 07:54:32 +000079 %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, i32* %base, i32* %ptr, i32* %ptr2)
80 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
81 %ptr2-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 9)
David Blaikiea79ac142015-02-27 21:17:42 +000082 %ret = load i32, i32* %ptr-new
Ramkumar Ramachandradba73292015-01-14 23:27:07 +000083 ret i32 %ret
84}
85
Igor Laevskyf637b4a2015-11-03 18:37:40 +000086define i32 @test_sor_basic_wrong_order(i32* %base) gc "statepoint-example" {
87; CHECK-LABEL: @test_sor_basic_wrong_order
88; Here we have base relocate inserted after derived. Make sure that we don't
89; produce uses of the relocated base pointer before it's definition.
90entry:
91 %ptr = getelementptr i32, i32* %base, i32 15
92 ; CHECK: getelementptr i32, i32* %base, i32 15
Chen Lid71999e2015-12-26 07:54:32 +000093 %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, i32* %base, i32* %ptr)
94 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
95 %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 7)
96 ; CHECK: %base-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 7)
Igor Laevskyf637b4a2015-11-03 18:37:40 +000097 ; CHECK-NEXT: getelementptr i32, i32* %base-new, i32 15
98 %ret = load i32, i32* %ptr-new
99 ret i32 %ret
100}
101
102define i32 @test_sor_noop_cross_bb(i1 %external-cond, i32* %base) gc "statepoint-example" {
103; CHECK-LABEL: @test_sor_noop_cross_bb
104; Here base relocate doesn't dominate derived relocate. Make sure that we don't
105; produce undefined use of the relocated base pointer.
106entry:
107 %ptr = getelementptr i32, i32* %base, i32 15
108 ; CHECK: getelementptr i32, i32* %base, i32 15
Chen Lid71999e2015-12-26 07:54:32 +0000109 %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, i32* %base, i32* %ptr)
Igor Laevskyf637b4a2015-11-03 18:37:40 +0000110 br i1 %external-cond, label %left, label %right
111
112left:
Chen Lid71999e2015-12-26 07:54:32 +0000113 %ptr-new = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
114 ; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 8)
Igor Laevskyf637b4a2015-11-03 18:37:40 +0000115 %ret-new = load i32, i32* %ptr-new
116 ret i32 %ret-new
117
118right:
Chen Lid71999e2015-12-26 07:54:32 +0000119 %ptr-base = call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 7)
120 ; CHECK: call i32* @llvm.experimental.gc.relocate.p0i32(token %tok, i32 7, i32 7)
Igor Laevskyf637b4a2015-11-03 18:37:40 +0000121 %ret-base = load i32, i32* %ptr-base
122 ret i32 %ret-base
123}
124
Chen Lid71999e2015-12-26 07:54:32 +0000125declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
126declare i32* @llvm.experimental.gc.relocate.p0i32(token, i32, i32)
127declare [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token, i32, i32)