[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / branch-fold.ll
blob2fe62411453f6b6cc07a65b6cdf47036a8667ca5
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
4 define void @test(i32* %P, i32* %Q, i1 %A, i1 %B) {
5 ; CHECK-LABEL: @test(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[A_NOT:%.*]] = xor i1 [[A:%.*]], true
8 ; CHECK-NEXT:    [[BRMERGE:%.*]] = select i1 [[A_NOT]], i1 true, i1 [[B:%.*]]
9 ; CHECK-NEXT:    br i1 [[BRMERGE]], label [[B:%.*]], label [[COMMON_RET:%.*]]
10 ; CHECK:       common.ret:
11 ; CHECK-NEXT:    ret void
12 ; CHECK:       b:
13 ; CHECK-NEXT:    store i32 123, i32* [[P:%.*]], align 4
14 ; CHECK-NEXT:    br label [[COMMON_RET]]
17 entry:
18   br i1 %A, label %a, label %b
20   br i1 %B, label %b, label %c
22   store i32 123, i32* %P
23   ret void
25   ret void
28 ; rdar://10554090
29 define zeroext i1 @test2(i64 %i0, i64 %i1) nounwind uwtable readonly ssp {
30 ; CHECK-LABEL: @test2(
31 ; CHECK-NEXT:  entry:
32 ; CHECK-NEXT:    [[AND_I_I:%.*]] = and i64 [[I0:%.*]], 281474976710655
33 ; CHECK-NEXT:    [[AND_I11_I:%.*]] = and i64 [[I1:%.*]], 281474976710655
34 ; CHECK-NEXT:    [[OR_COND:%.*]] = icmp eq i64 [[AND_I_I]], [[AND_I11_I]]
35 ; CHECK-NEXT:    br i1 [[OR_COND]], label [[C:%.*]], label [[A:%.*]]
36 ; CHECK:       a:
37 ; CHECK-NEXT:    [[SHR_I4_I:%.*]] = lshr i64 [[I0]], 48
38 ; CHECK-NEXT:    [[AND_I5_I:%.*]] = and i64 [[SHR_I4_I]], 32767
39 ; CHECK-NEXT:    [[SHR_I_I:%.*]] = lshr i64 [[I1]], 48
40 ; CHECK-NEXT:    [[AND_I2_I:%.*]] = and i64 [[SHR_I_I]], 32767
41 ; CHECK-NEXT:    [[CMP9_I:%.*]] = icmp ult i64 [[AND_I5_I]], [[AND_I2_I]]
42 ; CHECK-NEXT:    br i1 [[CMP9_I]], label [[C]], label [[B:%.*]]
43 ; CHECK:       b:
44 ; CHECK-NEXT:    [[SHR_I13_I9:%.*]] = lshr i64 [[I1]], 48
45 ; CHECK-NEXT:    [[AND_I14_I10:%.*]] = and i64 [[SHR_I13_I9]], 32767
46 ; CHECK-NEXT:    [[SHR_I_I11:%.*]] = lshr i64 [[I0]], 48
47 ; CHECK-NEXT:    [[AND_I11_I12:%.*]] = and i64 [[SHR_I_I11]], 32767
48 ; CHECK-NEXT:    [[PHITMP:%.*]] = icmp uge i64 [[AND_I14_I10]], [[AND_I11_I12]]
49 ; CHECK-NEXT:    br label [[C]]
50 ; CHECK:       c:
51 ; CHECK-NEXT:    [[O2:%.*]] = phi i1 [ false, [[A]] ], [ [[PHITMP]], [[B]] ], [ false, [[ENTRY:%.*]] ]
52 ; CHECK-NEXT:    ret i1 [[O2]]
54 entry:
55   %and.i.i = and i64 %i0, 281474976710655
56   %and.i11.i = and i64 %i1, 281474976710655
57   %or.cond = icmp eq i64 %and.i.i, %and.i11.i
58   br i1 %or.cond, label %c, label %a
61   %shr.i4.i = lshr i64 %i0, 48
62   %and.i5.i = and i64 %shr.i4.i, 32767
63   %shr.i.i = lshr i64 %i1, 48
64   %and.i2.i = and i64 %shr.i.i, 32767
65   %cmp9.i = icmp ult i64 %and.i5.i, %and.i2.i
66   br i1 %cmp9.i, label %c, label %b
69   %shr.i13.i9 = lshr i64 %i1, 48
70   %and.i14.i10 = and i64 %shr.i13.i9, 32767
71   %shr.i.i11 = lshr i64 %i0, 48
72   %and.i11.i12 = and i64 %shr.i.i11, 32767
73   %phitmp = icmp uge i64 %and.i14.i10, %and.i11.i12
74   br label %c
77   %o2 = phi i1 [ false, %a ], [ %phitmp, %b ], [ false, %entry ]
78   ret i1 %o2
81 ; PR13180
82 define void @pr13180(i8 %p) {
83 ; CHECK-LABEL: @pr13180(
84 ; CHECK-NEXT:  entry:
85 ; CHECK-NEXT:    unreachable
87 entry:
88   %tobool = icmp eq i8 %p, 0
89   br i1 %tobool, label %cond.false, label %cond.true
91 cond.true:                                        ; preds = %entry
92   br label %cond.end
94 cond.false:                                       ; preds = %entry
95   %phitmp = icmp eq i8 %p, 0
96   br label %cond.end
98 cond.end:                                         ; preds = %cond.false, %cond.true
99   %cond = phi i1 [ undef, %cond.true ], [ %phitmp, %cond.false ]
100   unreachable
103 declare void @foo()
104 define void @test3() {
105 ; CHECK-LABEL: @test3(
106 ; CHECK-NEXT:  entry:
107 ; CHECK-NEXT:    call void @foo()
108 ; CHECK-NEXT:    ret void
110 entry:
111   br i1 0, label %bb0, label %bb0
113 bb0:
114   call void @foo()
115   ret void