@@ -22,6 +22,81 @@ define void @gep_cse(ptr %p) {
22
22
ret void
23
23
}
24
24
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
+
25
100
define i32 @phi_trans (i1 %c , ptr %p1 , ptr %p2 ) {
26
101
; CHECK-LABEL: @phi_trans(
27
102
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
0 commit comments