@@ -120,14 +120,14 @@ define i32 @load_before_store_noescape(i64 %i, i32 %b) {
120
120
; CHECK-NEXT: [[A:%.*]] = alloca [2 x i32], align 8
121
121
; CHECK-NEXT: store i64 4294967296, ptr [[A]], align 8
122
122
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 [[I:%.*]]
123
- ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
124
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1 ]], [[B:%.*]]
125
- ; CHECK-NEXT: [[SPEC_STORE_SELECT:%.*]] = select i1 [[CMP]], i32 [[B]], i32 [[TMP1 ]]
123
+ ; CHECK-NEXT: [[TMP0 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
124
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0 ]], [[B:%.*]]
125
+ ; CHECK-NEXT: [[SPEC_STORE_SELECT:%.*]] = select i1 [[CMP]], i32 [[B]], i32 [[TMP0 ]]
126
126
; CHECK-NEXT: store i32 [[SPEC_STORE_SELECT]], ptr [[ARRAYIDX]], align 4
127
- ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[A]], align 4
127
+ ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[A]], align 4
128
128
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
129
- ; CHECK-NEXT: [[TMP3 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
130
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2 ]], [[TMP3 ]]
129
+ ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
130
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1 ]], [[TMP2 ]]
131
131
; CHECK-NEXT: ret i32 [[ADD]]
132
132
;
133
133
entry:
@@ -158,17 +158,17 @@ define i32 @load_before_store_escape(i64 %i, i32 %b) {
158
158
; CHECK-NEXT: store i64 4294967296, ptr [[A]], align 8
159
159
; CHECK-NEXT: call void @fork_some_threads(ptr [[A]])
160
160
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 [[I:%.*]]
161
- ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
162
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1 ]], [[B:%.*]]
161
+ ; CHECK-NEXT: [[TMP0 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
162
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0 ]], [[B:%.*]]
163
163
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
164
164
; CHECK: if.then:
165
165
; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
166
166
; CHECK-NEXT: br label [[IF_END]]
167
167
; CHECK: if.end:
168
- ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[A]], align 4
168
+ ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[A]], align 4
169
169
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
170
- ; CHECK-NEXT: [[TMP3 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
171
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2 ]], [[TMP3 ]]
170
+ ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
171
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1 ]], [[TMP2 ]]
172
172
; CHECK-NEXT: call void @join_some_threads()
173
173
; CHECK-NEXT: ret i32 [[ADD]]
174
174
;
@@ -205,18 +205,18 @@ define i32 @not_alone_in_block(i64 %i, i32 %b) {
205
205
; CHECK-NEXT: [[A:%.*]] = alloca [2 x i32], align 8
206
206
; CHECK-NEXT: store i64 4294967296, ptr [[A]], align 8
207
207
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 [[I:%.*]]
208
- ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
209
- ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1 ]], [[B:%.*]]
208
+ ; CHECK-NEXT: [[TMP0 :%.*]] = load i32, ptr [[ARRAYIDX]], align 4
209
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0 ]], [[B:%.*]]
210
210
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
211
211
; CHECK: if.then:
212
212
; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
213
213
; CHECK-NEXT: store i32 [[B]], ptr [[A]], align 4
214
214
; CHECK-NEXT: br label [[IF_END]]
215
215
; CHECK: if.end:
216
- ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[A]], align 4
216
+ ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[A]], align 4
217
217
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
218
- ; CHECK-NEXT: [[TMP3 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
219
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2 ]], [[TMP3 ]]
218
+ ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
219
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP1 ]], [[TMP2 ]]
220
220
; CHECK-NEXT: ret i32 [[ADD]]
221
221
;
222
222
entry:
@@ -240,6 +240,54 @@ if.end:
240
240
ret i32 %add
241
241
}
242
242
243
+ ; FIXME: This is a miscompile.
244
+ define void @wrong_align_store (ptr %A , i32 %B , i32 %C , i32 %D ) {
245
+ ; CHECK-LABEL: @wrong_align_store(
246
+ ; CHECK-NEXT: entry:
247
+ ; CHECK-NEXT: store i32 [[B:%.*]], ptr [[A:%.*]], align 4
248
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[D:%.*]], 42
249
+ ; CHECK-NEXT: [[SPEC_STORE_SELECT:%.*]] = select i1 [[CMP]], i32 [[C:%.*]], i32 [[B]]
250
+ ; CHECK-NEXT: store i32 [[SPEC_STORE_SELECT]], ptr [[A]], align 8
251
+ ; CHECK-NEXT: ret void
252
+ ;
253
+ entry:
254
+ store i32 %B , ptr %A , align 4
255
+ %cmp = icmp sgt i32 %D , 42
256
+ br i1 %cmp , label %if.then , label %ret.end
257
+
258
+ if.then:
259
+ store i32 %C , ptr %A , align 8
260
+ br label %ret.end
261
+
262
+ ret .end:
263
+ ret void
264
+ }
265
+
266
+ ; FIXME: This is a miscompile.
267
+ define void @wrong_align_load (i32 %C , i32 %D ) {
268
+ ; CHECK-LABEL: @wrong_align_load(
269
+ ; CHECK-NEXT: entry:
270
+ ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
271
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A]], align 4
272
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[D:%.*]], 42
273
+ ; CHECK-NEXT: [[SPEC_STORE_SELECT:%.*]] = select i1 [[CMP]], i32 [[C:%.*]], i32 [[TMP0]]
274
+ ; CHECK-NEXT: store i32 [[SPEC_STORE_SELECT]], ptr [[A]], align 8
275
+ ; CHECK-NEXT: ret void
276
+ ;
277
+ entry:
278
+ %A = alloca i32 , align 4
279
+ load i32 , ptr %A , align 4
280
+ %cmp = icmp sgt i32 %D , 42
281
+ br i1 %cmp , label %if.then , label %ret.end
282
+
283
+ if.then:
284
+ store i32 %C , ptr %A , align 8
285
+ br label %ret.end
286
+
287
+ ret .end:
288
+ ret void
289
+ }
290
+
243
291
; CHECK: !0 = !{!"branch_weights", i32 3, i32 5}
244
292
!0 = !{!"branch_weights" , i32 3 , i32 5 }
245
293
0 commit comments