64
64
}
65
65
66
66
; Perform the transformation only if we know that the GEPs used are inbounds.
67
- define ptr @test3 (ptr %A , i32 %Offset ) {
68
- ; CHECK-LABEL: @test3 (
67
+ define ptr @test3_no_inbounds1 (ptr %A , i32 %Offset ) {
68
+ ; CHECK-LABEL: @test3_no_inbounds1 (
69
69
; CHECK-NEXT: entry:
70
70
; CHECK-NEXT: [[TMP:%.*]] = getelementptr i32, ptr [[A:%.*]], i32 [[OFFSET:%.*]]
71
71
; CHECK-NEXT: br label [[BB:%.*]]
72
72
; CHECK: bb:
73
73
; CHECK-NEXT: [[RHS:%.*]] = phi ptr [ [[RHS_NEXT:%.*]], [[BB]] ], [ [[TMP]], [[ENTRY:%.*]] ]
74
- ; CHECK-NEXT: [[LHS:%.*]] = getelementptr i32, ptr [[A]], i32 100
75
- ; CHECK-NEXT: [[RHS_NEXT]] = getelementptr i32, ptr [[RHS]], i32 1
74
+ ; CHECK-NEXT: [[LHS:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 100
75
+ ; CHECK-NEXT: [[RHS_NEXT]] = getelementptr inbounds i32, ptr [[RHS]], i32 1
76
76
; CHECK-NEXT: [[COND:%.*]] = icmp ult ptr [[LHS]], [[RHS]]
77
77
; CHECK-NEXT: br i1 [[COND]], label [[BB2:%.*]], label [[BB]]
78
78
; CHECK: bb2:
@@ -84,7 +84,36 @@ entry:
84
84
85
85
bb:
86
86
%RHS = phi ptr [ %RHS.next , %bb ], [ %tmp , %entry ]
87
- %LHS = getelementptr i32 , ptr %A , i32 100
87
+ %LHS = getelementptr inbounds i32 , ptr %A , i32 100
88
+ %RHS.next = getelementptr inbounds i32 , ptr %RHS , i64 1
89
+ %cond = icmp ult ptr %LHS , %RHS
90
+ br i1 %cond , label %bb2 , label %bb
91
+
92
+ bb2:
93
+ ret ptr %RHS
94
+ }
95
+
96
+ define ptr @test3_no_inbounds2 (ptr %A , i32 %Offset ) {
97
+ ; CHECK-LABEL: @test3_no_inbounds2(
98
+ ; CHECK-NEXT: entry:
99
+ ; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[OFFSET:%.*]]
100
+ ; CHECK-NEXT: br label [[BB:%.*]]
101
+ ; CHECK: bb:
102
+ ; CHECK-NEXT: [[RHS:%.*]] = phi ptr [ [[RHS_NEXT:%.*]], [[BB]] ], [ [[TMP]], [[ENTRY:%.*]] ]
103
+ ; CHECK-NEXT: [[LHS:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 100
104
+ ; CHECK-NEXT: [[RHS_NEXT]] = getelementptr i32, ptr [[RHS]], i32 1
105
+ ; CHECK-NEXT: [[COND:%.*]] = icmp ult ptr [[LHS]], [[RHS]]
106
+ ; CHECK-NEXT: br i1 [[COND]], label [[BB2:%.*]], label [[BB]]
107
+ ; CHECK: bb2:
108
+ ; CHECK-NEXT: ret ptr [[RHS]]
109
+ ;
110
+ entry:
111
+ %tmp = getelementptr inbounds i32 , ptr %A , i32 %Offset
112
+ br label %bb
113
+
114
+ bb:
115
+ %RHS = phi ptr [ %RHS.next , %bb ], [ %tmp , %entry ]
116
+ %LHS = getelementptr inbounds i32 , ptr %A , i32 100
88
117
%RHS.next = getelementptr i32 , ptr %RHS , i64 1
89
118
%cond = icmp ult ptr %LHS , %RHS
90
119
br i1 %cond , label %bb2 , label %bb
93
122
ret ptr %RHS
94
123
}
95
124
125
+ define ptr @test3_no_inbounds3 (ptr %A , i32 %Offset ) {
126
+ ; CHECK-LABEL: @test3_no_inbounds3(
127
+ ; CHECK-NEXT: entry:
128
+ ; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[OFFSET:%.*]]
129
+ ; CHECK-NEXT: br label [[BB:%.*]]
130
+ ; CHECK: bb:
131
+ ; CHECK-NEXT: [[RHS:%.*]] = phi ptr [ [[RHS_NEXT:%.*]], [[BB]] ], [ [[TMP]], [[ENTRY:%.*]] ]
132
+ ; CHECK-NEXT: [[LHS:%.*]] = getelementptr i32, ptr [[A]], i32 100
133
+ ; CHECK-NEXT: [[RHS_NEXT]] = getelementptr inbounds i32, ptr [[RHS]], i32 1
134
+ ; CHECK-NEXT: [[COND:%.*]] = icmp ult ptr [[LHS]], [[RHS]]
135
+ ; CHECK-NEXT: br i1 [[COND]], label [[BB2:%.*]], label [[BB]]
136
+ ; CHECK: bb2:
137
+ ; CHECK-NEXT: ret ptr [[RHS]]
138
+ ;
139
+ entry:
140
+ %tmp = getelementptr inbounds i32 , ptr %A , i32 %Offset
141
+ br label %bb
142
+
143
+ bb:
144
+ %RHS = phi ptr [ %RHS.next , %bb ], [ %tmp , %entry ]
145
+ %LHS = getelementptr i32 , ptr %A , i32 100
146
+ %RHS.next = getelementptr inbounds i32 , ptr %RHS , i64 1
147
+ %cond = icmp ult ptr %LHS , %RHS
148
+ br i1 %cond , label %bb2 , label %bb
149
+
150
+ bb2:
151
+ ret ptr %RHS
152
+ }
153
+
96
154
; An inttoptr that requires an extension or truncation will be opaque when determining
97
155
; the base pointer. In this case we can still perform the transformation by considering
98
156
; A.ptr as being the base pointer.
0 commit comments