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:
309309exit:
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