Skip to content

Commit 4fcbd0e

Browse files
committed
[GVN] Add more tests for opaque pointer GEPs (NFC)
Some of these are equivalent when considering an offset encoding.
1 parent 6ddf2a8 commit 4fcbd0e

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

llvm/test/Transforms/GVN/opaque-ptr.ll

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,81 @@ define void @gep_cse(ptr %p) {
2222
ret void
2323
}
2424

25+
define void @gep_cse_offset_canonicalization(ptr %p, i64 %idx, i64 %idx2) {
26+
; CHECK-LABEL: @gep_cse_offset_canonicalization(
27+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i64, ptr [[P:%.*]], i64 1
28+
; CHECK-NEXT: [[GEP1_SAME1:%.*]] = getelementptr i32, ptr [[P]], i64 2
29+
; CHECK-NEXT: [[GEP1_SAME2:%.*]] = getelementptr i8, ptr [[P]], i64 8
30+
; CHECK-NEXT: [[GEP1_DIFFERENT:%.*]] = getelementptr i8, ptr [[P]], i64 12
31+
; CHECK-NEXT: call void @use(ptr [[GEP1]])
32+
; CHECK-NEXT: call void @use(ptr [[GEP1_SAME1]])
33+
; CHECK-NEXT: call void @use(ptr [[GEP1_SAME2]])
34+
; CHECK-NEXT: call void @use(ptr [[GEP1_DIFFERENT]])
35+
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i64, ptr [[P]], i64 [[IDX:%.*]]
36+
; CHECK-NEXT: [[GEP2_SAME:%.*]] = getelementptr { i32, i32 }, ptr [[P]], i64 [[IDX]]
37+
; CHECK-NEXT: [[GEP2_DIFFERENT:%.*]] = getelementptr { i32, i32, i32 }, ptr [[P]], i64 [[IDX]]
38+
; CHECK-NEXT: call void @use(ptr [[GEP2]])
39+
; CHECK-NEXT: call void @use(ptr [[GEP2_SAME]])
40+
; CHECK-NEXT: call void @use(ptr [[GEP2_DIFFERENT]])
41+
; CHECK-NEXT: [[GEP3:%.*]] = getelementptr { [0 x i32], [0 x i32] }, ptr [[P]], i64 0, i32 0, i64 [[IDX]]
42+
; CHECK-NEXT: [[GEP3_SAME1:%.*]] = getelementptr { [0 x i32], [0 x i32] }, ptr [[P]], i64 0, i32 1, i64 [[IDX]]
43+
; CHECK-NEXT: [[GEP3_SAME2:%.*]] = getelementptr { [0 x i32], [0 x i32] }, ptr [[P]], i64 1, i32 0, i64 [[IDX]]
44+
; CHECK-NEXT: [[GEP3_DIFFERENT:%.*]] = getelementptr { [0 x i32], [0 x i32] }, ptr [[P]], i64 0, i32 0, i64 [[IDX2:%.*]]
45+
; CHECK-NEXT: call void @use(ptr [[GEP3]])
46+
; CHECK-NEXT: call void @use(ptr [[GEP3_SAME1]])
47+
; CHECK-NEXT: call void @use(ptr [[GEP3_SAME2]])
48+
; CHECK-NEXT: call void @use(ptr [[GEP3_DIFFERENT]])
49+
; CHECK-NEXT: [[GEP4:%.*]] = getelementptr [4 x i32], ptr [[P]], i64 [[IDX]], i64 [[IDX2]]
50+
; CHECK-NEXT: [[GEP4_SAME:%.*]] = getelementptr [4 x float], ptr [[P]], i64 [[IDX]], i64 [[IDX2]]
51+
; CHECK-NEXT: [[GEP4_DIFFERENT:%.*]] = getelementptr [4 x float], ptr [[P]], i64 [[IDX2]], i64 [[IDX]]
52+
; CHECK-NEXT: call void @use(ptr [[GEP4]])
53+
; CHECK-NEXT: call void @use(ptr [[GEP4_SAME]])
54+
; CHECK-NEXT: call void @use(ptr [[GEP4_DIFFERENT]])
55+
; CHECK-NEXT: [[GEP5:%.*]] = getelementptr <vscale x 2 x i32>, ptr [[P]], i64 1
56+
; CHECK-NEXT: [[GEP5_SAME:%.*]] = getelementptr <vscale x 2 x float>, ptr [[P]], i64 1
57+
; CHECK-NEXT: [[GEP5_DIFFERENT:%.*]] = getelementptr <vscale x 2 x i64>, ptr [[P]], i64 1
58+
; CHECK-NEXT: call void @use(ptr [[GEP5]])
59+
; CHECK-NEXT: call void @use(ptr [[GEP5_SAME]])
60+
; CHECK-NEXT: call void @use(ptr [[GEP5_DIFFERENT]])
61+
; CHECK-NEXT: ret void
62+
;
63+
%gep1 = getelementptr i64, ptr %p, i64 1
64+
%gep1.same1 = getelementptr i32, ptr %p, i64 2
65+
%gep1.same2 = getelementptr i8, ptr %p, i64 8
66+
%gep1.different = getelementptr i8, ptr %p, i64 12
67+
call void @use(ptr %gep1)
68+
call void @use(ptr %gep1.same1)
69+
call void @use(ptr %gep1.same2)
70+
call void @use(ptr %gep1.different)
71+
%gep2 = getelementptr i64, ptr %p, i64 %idx
72+
%gep2.same = getelementptr { i32, i32 }, ptr %p, i64 %idx
73+
%gep2.different = getelementptr { i32, i32, i32 }, ptr %p, i64 %idx
74+
call void @use(ptr %gep2)
75+
call void @use(ptr %gep2.same)
76+
call void @use(ptr %gep2.different)
77+
%gep3 = getelementptr { [0 x i32], [0 x i32] }, ptr %p, i64 0, i32 0, i64 %idx
78+
%gep3.same1 = getelementptr { [0 x i32], [0 x i32] }, ptr %p, i64 0, i32 1, i64 %idx
79+
%gep3.same2 = getelementptr { [0 x i32], [0 x i32] }, ptr %p, i64 1, i32 0, i64 %idx
80+
%gep3.different = getelementptr { [0 x i32], [0 x i32] }, ptr %p, i64 0, i32 0, i64 %idx2
81+
call void @use(ptr %gep3)
82+
call void @use(ptr %gep3.same1)
83+
call void @use(ptr %gep3.same2)
84+
call void @use(ptr %gep3.different)
85+
%gep4 = getelementptr [4 x i32], ptr %p, i64 %idx, i64 %idx2
86+
%gep4.same = getelementptr [4 x float], ptr %p, i64 %idx, i64 %idx2
87+
%gep4.different = getelementptr [4 x float], ptr %p, i64 %idx2, i64 %idx
88+
call void @use(ptr %gep4)
89+
call void @use(ptr %gep4.same)
90+
call void @use(ptr %gep4.different)
91+
%gep5 = getelementptr <vscale x 2 x i32>, ptr %p, i64 1
92+
%gep5.same = getelementptr <vscale x 2 x float>, ptr %p, i64 1
93+
%gep5.different = getelementptr <vscale x 2 x i64>, ptr %p, i64 1
94+
call void @use(ptr %gep5)
95+
call void @use(ptr %gep5.same)
96+
call void @use(ptr %gep5.different)
97+
ret void
98+
}
99+
25100
define i32 @phi_trans(i1 %c, ptr %p1, ptr %p2) {
26101
; CHECK-LABEL: @phi_trans(
27102
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]

0 commit comments

Comments
 (0)