xref: /llvm-project/llvm/test/Transforms/SCCP/predicateinfo-cond.ll (revision 8ebb3eac02a926ffa4298c12834c57aefb2e8579)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=ipsccp < %s | FileCheck %s
3
4; Test that information about the true/false value of conditions themselves
5; is also used, not information implied by comparisions.
6
7define i32 @switch(i32 %x) {
8; CHECK-LABEL: @switch(
9; CHECK-NEXT:    switch i32 [[X:%.*]], label [[CASE_DEFAULT:%.*]] [
10; CHECK-NEXT:    i32 0, label [[CASE_0:%.*]]
11; CHECK-NEXT:    i32 2, label [[CASE_2:%.*]]
12; CHECK-NEXT:    ]
13; CHECK:       case.0:
14; CHECK-NEXT:    br label [[END:%.*]]
15; CHECK:       case.2:
16; CHECK-NEXT:    br label [[END]]
17; CHECK:       case.default:
18; CHECK-NEXT:    br label [[END]]
19; CHECK:       end:
20; CHECK-NEXT:    ret i32 1
21;
22  switch i32 %x, label %case.default [
23  i32 0, label %case.0
24  i32 2, label %case.2
25  ]
26
27case.0:
28  %add = add i32 %x, 1
29  br label %end
30
31case.2:
32  %sub = sub i32 %x, 1
33  br label %end
34
35case.default:
36  br label %end
37
38end:
39  %phi = phi i32 [ %add, %case.0 ], [ %sub, %case.2 ], [ 1, %case.default]
40  ret i32 %phi
41}
42
43define i1 @assume(i32 %x) {
44; CHECK-LABEL: @assume(
45; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
46; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP]])
47; CHECK-NEXT:    ret i1 true
48;
49  %cmp = icmp sge i32 %x, 0
50  call void @llvm.assume(i1 %cmp)
51  ret i1 %cmp
52}
53
54define i32 @branch(i32 %x) {
55; CHECK-LABEL: @branch(
56; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
57; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_THEN2:%.*]]
58; CHECK:       if.then1:
59; CHECK-NEXT:    br label [[IF2_THEN1:%.*]]
60; CHECK:       if2.then1:
61; CHECK-NEXT:    br label [[IF2_END:%.*]]
62; CHECK:       if2.end:
63; CHECK-NEXT:    ret i32 0
64; CHECK:       if.then2:
65; CHECK-NEXT:    br label [[IF3_THEN2:%.*]]
66; CHECK:       if3.then2:
67; CHECK-NEXT:    br label [[IF3_END:%.*]]
68; CHECK:       if3.end:
69; CHECK-NEXT:    ret i32 1
70;
71  %cmp = icmp sge i32 %x, 0
72  br i1 %cmp, label %if.then1, label %if.then2
73
74if.then1:
75  br i1 %cmp, label %if2.then1, label %if2.then2
76
77if2.then1:
78  br label %if2.end
79
80if2.then2:
81  br label %if2.end
82
83if2.end:
84  %phi = phi i32 [ 0, %if2.then1 ], [ 1, %if2.then2 ]
85  ret i32 %phi
86
87if.then2:
88  br i1 %cmp, label %if3.then1, label %if3.then2
89
90if3.then1:
91  br label %if3.end
92
93if3.then2:
94  br label %if3.end
95
96if3.end:
97  %phi2 = phi i32 [ 0, %if3.then1 ], [ 1, %if3.then2 ]
98  ret i32 %phi2
99}
100
101define void @pr46814(i32 %a) {
102; CHECK-LABEL: @pr46814(
103; CHECK-NEXT:    [[C1:%.*]] = icmp uge i32 [[A:%.*]], 10
104; CHECK-NEXT:    [[C2:%.*]] = icmp ult i32 [[A]], 20
105; CHECK-NEXT:    [[C3:%.*]] = and i1 [[C1]], [[C2]]
106; CHECK-NEXT:    br i1 [[C3]], label [[IF_1:%.*]], label [[EXIT:%.*]]
107; CHECK:       if.1:
108; CHECK-NEXT:    br label [[IF_2:%.*]]
109; CHECK:       if.2:
110; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[EXIT]]
111; CHECK:       exit:
112; CHECK-NEXT:    ret void
113;
114  %c1 = icmp uge i32 %a, 10
115  %c2 = icmp ult i32 %a, 20
116  %c3 = and i1 %c1, %c2
117  br i1 %c3, label %if.1, label %exit
118
119if.1:
120  br i1 %c3, label %if.2, label %exit
121
122if.2:
123  br i1 %c3, label %exit, label %exit
124
125exit:
126  ret void
127}
128
129declare void @llvm.assume(i1)
130