Skip to content

Commit 5cd91b8

Browse files
committed
Update test
1 parent 2d987ba commit 5cd91b8

File tree

1 file changed

+87
-1
lines changed

1 file changed

+87
-1
lines changed

llvm/test/Transforms/Util/flatten-cfg.ll

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2-
; RUN: opt -passes=flatten-cfg -S < %s | FileCheck %s
2+
; RUN: opt -passes='require<aa>,flatten-cfg' -S < %s | FileCheck %s
33

44

55
; This test checks whether the pass completes without a crash.
@@ -309,3 +309,89 @@ if.then.y:
309309
exit:
310310
ret i1 %cmp.y
311311
}
312+
313+
; Test that two if-regions are not merged when there's potential aliasing
314+
; between a store in the first if-region and a load in the second if-region's header
315+
define i32 @test_alias(i32 %a, i32 %b, ptr %p1, ptr %p2) {
316+
; CHECK-LABEL: define i32 @test_alias
317+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) {
318+
; CHECK-NEXT: entry:
319+
; CHECK-NEXT: store i32 42, ptr [[P1]], align 4
320+
; CHECK-NEXT: [[COND1:%.*]] = icmp eq i32 [[A]], 0
321+
; CHECK-NEXT: br i1 [[COND1]], label [[IF_THEN1:%.*]], label [[IF_END1:%.*]]
322+
; CHECK: if.then1:
323+
; CHECK-NEXT: store i32 100, ptr [[P2]], align 4
324+
; CHECK-NEXT: br label [[IF_END1]]
325+
; CHECK: if.end1:
326+
; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[P1]], align 4
327+
; CHECK-NEXT: [[COND2:%.*]] = icmp eq i32 [[B]], 0
328+
; CHECK-NEXT: br i1 [[COND2]], label [[IF_THEN2:%.*]], label [[IF_END2:%.*]]
329+
; CHECK: if.then2:
330+
; CHECK-NEXT: store i32 100, ptr [[P2]], align 4
331+
; CHECK-NEXT: br label [[IF_END2]]
332+
; CHECK: if.end2:
333+
; CHECK-NEXT: ret i32 0
334+
;
335+
entry:
336+
store i32 42, ptr %p1
337+
%cond1 = icmp eq i32 %a, 0
338+
br i1 %cond1, label %if.then1, label %if.end1
339+
340+
if.then1:
341+
store i32 100, ptr %p2 ; May alias with the load below
342+
br label %if.end1
343+
344+
if.end1:
345+
%val = load i32, ptr %p1 ; This load prevents merging due to potential alias
346+
%cond2 = icmp eq i32 %b, 0
347+
br i1 %cond2, label %if.then2, label %if.end2
348+
349+
if.then2:
350+
store i32 100, ptr %p2
351+
br label %if.end2
352+
353+
if.end2:
354+
ret i32 0
355+
}
356+
357+
; Test that two if-regions are merged when there's no potential aliasing
358+
; between a store in the first if-region and a load in the second if-region's header
359+
define i32 @test_no_alias(i32 %a, i32 %b) {
360+
; CHECK-LABEL: define i32 @test_no_alias
361+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
362+
; CHECK-NEXT: entry:
363+
; CHECK-NEXT: [[P:%.*]] = alloca i32, align 4
364+
; CHECK-NEXT: store i32 42, ptr [[P]], align 4
365+
; CHECK-NEXT: [[COND1:%.*]] = icmp eq i32 [[A]], 0
366+
; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr @g, align 4
367+
; CHECK-NEXT: [[COND2:%.*]] = icmp eq i32 [[B]], 0
368+
; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[COND1]], [[COND2]]
369+
; CHECK-NEXT: br i1 [[TMP0]], label [[IF_THEN2:%.*]], label [[IF_END2:%.*]]
370+
; CHECK: if.then2:
371+
; CHECK-NEXT: store i32 100, ptr [[P]], align 4
372+
; CHECK-NEXT: br label [[IF_END2]]
373+
; CHECK: if.end2:
374+
; CHECK-NEXT: ret i32 0
375+
;
376+
entry:
377+
%p = alloca i32
378+
store i32 42, ptr %p
379+
%cond1 = icmp eq i32 %a, 0
380+
br i1 %cond1, label %if.then1, label %if.end1
381+
382+
if.then1:
383+
store i32 100, ptr %p ; No alias with the load below
384+
br label %if.end1
385+
386+
if.end1:
387+
%val = load i32, ptr @g
388+
%cond2 = icmp eq i32 %b, 0
389+
br i1 %cond2, label %if.then2, label %if.end2
390+
391+
if.then2:
392+
store i32 100, ptr %p
393+
br label %if.end2
394+
395+
if.end2:
396+
ret i32 0
397+
}

0 commit comments

Comments
 (0)