[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / branch-phi-thread.ll
blob0afec05ecbd6a55592834366d4a25736f4e235b5
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=simplifycfg,adce -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
4 declare void @f1()
6 declare void @f2()
8 declare void @f3()
10 declare void @f4()
12 define i32 @test1(i32 %X, i1 %D) {
13 ; CHECK-LABEL: @test1(
14 ; CHECK-NEXT:  E:
15 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[X:%.*]], 0
16 ; CHECK-NEXT:    br i1 [[C]], label [[B:%.*]], label [[F:%.*]]
17 ; CHECK:       common.ret:
18 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ 345, [[B]] ], [ 123, [[F]] ]
19 ; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
20 ; CHECK:       B:
21 ; CHECK-NEXT:    call void @f2()
22 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
23 ; CHECK:       F:
24 ; CHECK-NEXT:    call void @f3()
25 ; CHECK-NEXT:    br label [[COMMON_RET]]
28   %C = icmp eq i32 %X, 0                ; <i1> [#uses=2]
29   br i1 %C, label %T, label %F
30 T:              ; preds = %A, %E
31   br i1 %C, label %B, label %A
32 A:              ; preds = %T
33   call void @f1( )
34   br i1 %D, label %T, label %F
35 B:              ; preds = %T
36   call void @f2( )
37   ret i32 345
38 F:              ; preds = %A, %E
39   call void @f3( )
40   ret i32 123
43 define i32 @test2(i32 %X, i1 %D) {
44 ; CHECK-LABEL: @test2(
45 ; CHECK-NEXT:  E:
46 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[X:%.*]], 0
47 ; CHECK-NEXT:    br i1 [[C]], label [[B:%.*]], label [[F:%.*]]
48 ; CHECK:       common.ret:
49 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ 345, [[B]] ], [ 123, [[F]] ]
50 ; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
51 ; CHECK:       B:
52 ; CHECK-NEXT:    call void @f2()
53 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
54 ; CHECK:       F:
55 ; CHECK-NEXT:    call void @f3()
56 ; CHECK-NEXT:    br label [[COMMON_RET]]
59   %C = icmp eq i32 %X, 0                ; <i1> [#uses=2]
60   br i1 %C, label %T, label %F
61 T:              ; preds = %A, %E
62   %P = phi i1 [ true, %E ], [ %C, %A ]          ; <i1> [#uses=1]
63   br i1 %P, label %B, label %A
64 A:              ; preds = %T
65   call void @f1( )
66   br i1 %D, label %T, label %F
67 B:              ; preds = %T
68   call void @f2( )
69   ret i32 345
70 F:              ; preds = %A, %E
71   call void @f3( )
72   ret i32 123
75 define i32 @test3(i32 %X, i1 %D, ptr %AP, ptr %BP) {
76 ; CHECK-LABEL: @test3(
77 ; CHECK-NEXT:  E:
78 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[X:%.*]], 0
79 ; CHECK-NEXT:    br i1 [[C]], label [[B_CRITEDGE:%.*]], label [[F:%.*]]
80 ; CHECK:       common.ret:
81 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ 345, [[B_CRITEDGE]] ], [ 123, [[F]] ]
82 ; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
83 ; CHECK:       B.critedge:
84 ; CHECK-NEXT:    call void @f3()
85 ; CHECK-NEXT:    [[XX_C:%.*]] = load i32, ptr [[AP:%.*]], align 4
86 ; CHECK-NEXT:    store i32 [[XX_C]], ptr [[BP:%.*]], align 4
87 ; CHECK-NEXT:    call void @f2()
88 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
89 ; CHECK:       F:
90 ; CHECK-NEXT:    call void @f3()
91 ; CHECK-NEXT:    br label [[COMMON_RET]]
94   %C = icmp eq i32 %X, 0                ; <i1> [#uses=2]
95   br i1 %C, label %T, label %F
96 T:              ; preds = %A, %E
97   call void @f3( )
98   %XX = load i32, ptr %AP               ; <i32> [#uses=1]
99   store i32 %XX, ptr %BP
100   br i1 %C, label %B, label %A
101 A:              ; preds = %T
102   call void @f1( )
103   br i1 %D, label %T, label %F
104 B:              ; preds = %T
105   call void @f2( )
106   ret i32 345
107 F:              ; preds = %A, %E
108   call void @f3( )
109   ret i32 123