xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/ne.ll (revision 7fb97bee9269f0d4239908ac8def70be696991c6)
1784c70d7SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3784c70d7SFlorian Hahn
4a2ba4e80SAntonio Frighettodeclare void @llvm.assume(i1)
5a2ba4e80SAntonio Frighetto
695daec6aSFlorian Hahndefine i1 @test_eq_ne_0(i8 %a, i8 %b) {
795daec6aSFlorian Hahn; CHECK-LABEL: @test_eq_ne_0(
8784c70d7SFlorian Hahn; CHECK-NEXT:  entry:
9784c70d7SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 0
10784c70d7SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
11784c70d7SFlorian Hahn; CHECK:       then:
12784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]
13a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 false, true
14784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
15784c70d7SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
16784c70d7SFlorian Hahn; CHECK:       else:
17784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ne i8 [[A]], 1
18784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ne i8 [[A]], [[B]]
1995daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 true, [[C_3]]
20784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]
21784c70d7SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_4]]
22784c70d7SFlorian Hahn;
23784c70d7SFlorian Hahnentry:
24784c70d7SFlorian Hahn  %cmp = icmp eq i8 %a, 0
25784c70d7SFlorian Hahn  br i1 %cmp, label %then, label %else
26784c70d7SFlorian Hahn
27784c70d7SFlorian Hahnthen:
28784c70d7SFlorian Hahn  %f.1 = icmp ne i8 %a, 0
29784c70d7SFlorian Hahn  %c.1 = icmp ne i8 %a, 1
30784c70d7SFlorian Hahn  %c.2 = icmp ne i8 %a, %b
31784c70d7SFlorian Hahn  %res.1 = xor i1 %f.1, %c.1
32784c70d7SFlorian Hahn  %res.2 = xor i1 %res.1, %c.2
33784c70d7SFlorian Hahn  ret i1 %res.2
34784c70d7SFlorian Hahn
35784c70d7SFlorian Hahnelse:
36784c70d7SFlorian Hahn  %t.1 = icmp ne i8 %a, 0
37784c70d7SFlorian Hahn  %c.3 = icmp ne i8 %a, 1
38784c70d7SFlorian Hahn  %c.4 = icmp ne i8 %a, %b
39784c70d7SFlorian Hahn  %res.3 = xor i1 %t.1, %c.3
40784c70d7SFlorian Hahn  %res.4 = xor i1 %res.3, %c.4
41784c70d7SFlorian Hahn  ret i1 %res.4
42784c70d7SFlorian Hahn}
43784c70d7SFlorian Hahn
4495daec6aSFlorian Hahndefine i1 @test_ne_eq_0(i8 %a, i8 %b) {
4595daec6aSFlorian Hahn; CHECK-LABEL: @test_ne_eq_0(
46784c70d7SFlorian Hahn; CHECK-NEXT:  entry:
47784c70d7SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 0
48784c70d7SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
49784c70d7SFlorian Hahn; CHECK:       then:
50784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ne i8 [[A]], 1
5195daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]
52784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]
53784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
54784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i8 [[A]], [[B]]
55784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]]
56258a0a3aSFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], false
5795daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], true
5895daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], true
59784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[A]], 1
60784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]]
61784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp sgt i8 [[A]], 0
62784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]]
63784c70d7SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_8]]
64784c70d7SFlorian Hahn; CHECK:       else:
65a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 false, true
66784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ne i8 [[A]], [[B]]
67784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_8]]
68784c70d7SFlorian Hahn; CHECK-NEXT:    [[C_9:%.*]] = icmp eq i8 [[A]], [[B]]
69784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_9]]
70258a0a3aSFlorian Hahn; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], true
71784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], false
72784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], false
73784c70d7SFlorian Hahn; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], false
74*7fb97beeSStephen Senran Zhang; CHECK-NEXT:    [[RES_16:%.*]] = xor i1 [[RES_15]], false
75784c70d7SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_16]]
76784c70d7SFlorian Hahn;
77784c70d7SFlorian Hahnentry:
78784c70d7SFlorian Hahn  %cmp = icmp ne i8 %a, 0
79784c70d7SFlorian Hahn  br i1 %cmp, label %then, label %else
80784c70d7SFlorian Hahn
81784c70d7SFlorian Hahnthen:
82784c70d7SFlorian Hahn  %t.1 = icmp ne i8 %a, 0
83784c70d7SFlorian Hahn  %c.1 = icmp ne i8 %a, 1
84784c70d7SFlorian Hahn  %res.1 = xor i1 %t.1, %c.1
85784c70d7SFlorian Hahn
86784c70d7SFlorian Hahn  %c.2 = icmp ne i8 %a, %b
87784c70d7SFlorian Hahn  %res.2 = xor i1 %res.1, %c.2
88784c70d7SFlorian Hahn
89784c70d7SFlorian Hahn  %c.3 = icmp eq i8 %a, %b
90784c70d7SFlorian Hahn  %res.3 = xor i1 %res.2, %c.3
91784c70d7SFlorian Hahn
92784c70d7SFlorian Hahn  %c.4 = icmp eq i8 %a, 0
93784c70d7SFlorian Hahn  %res.4 = xor i1 %res.3, %c.4
94784c70d7SFlorian Hahn
95784c70d7SFlorian Hahn  %t.2 = icmp ugt i8 %a, 0
96784c70d7SFlorian Hahn  %res.5 = xor i1 %res.4, %t.2
97784c70d7SFlorian Hahn
98784c70d7SFlorian Hahn  %t.3 = icmp uge i8 %a, 1
99784c70d7SFlorian Hahn  %res.6 = xor i1 %res.5, %t.3
100784c70d7SFlorian Hahn
101784c70d7SFlorian Hahn  %c.5 = icmp ugt i8 %a, 1
102784c70d7SFlorian Hahn  %res.7 = xor i1 %res.6, %c.5
103784c70d7SFlorian Hahn
104784c70d7SFlorian Hahn  %c.6 = icmp sgt i8 %a, 0
105784c70d7SFlorian Hahn  %res.8 = xor i1 %res.7, %c.6
106784c70d7SFlorian Hahn
107784c70d7SFlorian Hahn  ret i1 %res.8
108784c70d7SFlorian Hahn
109784c70d7SFlorian Hahnelse:
110784c70d7SFlorian Hahn  %f.1 = icmp ne i8 %a, 0
111784c70d7SFlorian Hahn  %c.7 = icmp ne i8 %a, 1
112784c70d7SFlorian Hahn  %res.9 = xor i1 %f.1, %c.7
113784c70d7SFlorian Hahn
114784c70d7SFlorian Hahn  %c.8 = icmp ne i8 %a, %b
115784c70d7SFlorian Hahn  %res.10 = xor i1 %res.9, %c.8
116784c70d7SFlorian Hahn
117784c70d7SFlorian Hahn  %c.9 = icmp eq i8 %a, %b
118784c70d7SFlorian Hahn  %res.11 = xor i1 %res.10, %c.9
119784c70d7SFlorian Hahn
120784c70d7SFlorian Hahn  %c.10 = icmp eq i8 %a, 0
121784c70d7SFlorian Hahn  %res.12 = xor i1 %res.11, %c.10
122784c70d7SFlorian Hahn
123784c70d7SFlorian Hahn  %f.2 = icmp ugt i8 %a, 0
124784c70d7SFlorian Hahn  %res.13 = xor i1 %res.12, %f.2
125784c70d7SFlorian Hahn
126784c70d7SFlorian Hahn  %f.3 = icmp uge i8 %a, 1
127784c70d7SFlorian Hahn  %res.14 = xor i1 %res.13, %f.3
128784c70d7SFlorian Hahn
129784c70d7SFlorian Hahn  %c.11 = icmp ugt i8 %a, 1
130784c70d7SFlorian Hahn  %res.15 = xor i1 %res.14, %c.11
131784c70d7SFlorian Hahn
132784c70d7SFlorian Hahn  %c.12 = icmp sgt i8 %a, 0
133784c70d7SFlorian Hahn  %res.16 = xor i1 %res.15, %c.12
134784c70d7SFlorian Hahn
135784c70d7SFlorian Hahn  ret i1 %res.16
136784c70d7SFlorian Hahn}
13795daec6aSFlorian Hahn
13895daec6aSFlorian Hahndefine i1 @test_eq_ne_1(i8 %a, i8 %b) {
13995daec6aSFlorian Hahn; CHECK-LABEL: @test_eq_ne_1(
14095daec6aSFlorian Hahn; CHECK-NEXT:  entry:
14195daec6aSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 1
14295daec6aSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
14395daec6aSFlorian Hahn; CHECK:       then:
14495daec6aSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]
145a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false
14695daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
14795daec6aSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_2]]
14895daec6aSFlorian Hahn; CHECK:       else:
14995daec6aSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ne i8 [[A]], 0
15095daec6aSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ne i8 [[A]], 1
15195daec6aSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ne i8 [[A]], [[B]]
15295daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[T_1]], [[C_3]]
15395daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]
15495daec6aSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_4]]
15595daec6aSFlorian Hahn;
15695daec6aSFlorian Hahnentry:
15795daec6aSFlorian Hahn  %cmp = icmp eq i8 %a, 1
15895daec6aSFlorian Hahn  br i1 %cmp, label %then, label %else
15995daec6aSFlorian Hahn
16095daec6aSFlorian Hahnthen:
16195daec6aSFlorian Hahn  %f.1 = icmp ne i8 %a, 0
16295daec6aSFlorian Hahn  %c.1 = icmp ne i8 %a, 1
16395daec6aSFlorian Hahn  %c.2 = icmp ne i8 %a, %b
16495daec6aSFlorian Hahn  %res.1 = xor i1 %f.1, %c.1
16595daec6aSFlorian Hahn  %res.2 = xor i1 %res.1, %c.2
16695daec6aSFlorian Hahn  ret i1 %res.2
16795daec6aSFlorian Hahn
16895daec6aSFlorian Hahnelse:
16995daec6aSFlorian Hahn  %t.1 = icmp ne i8 %a, 0
17095daec6aSFlorian Hahn  %c.3 = icmp ne i8 %a, 1
17195daec6aSFlorian Hahn  %c.4 = icmp ne i8 %a, %b
17295daec6aSFlorian Hahn  %res.3 = xor i1 %t.1, %c.3
17395daec6aSFlorian Hahn  %res.4 = xor i1 %res.3, %c.4
17495daec6aSFlorian Hahn  ret i1 %res.4
17595daec6aSFlorian Hahn}
17695daec6aSFlorian Hahn
17795daec6aSFlorian Hahndefine i1 @test_ne_eq_1(i8 %a, i8 %b) {
17895daec6aSFlorian Hahn; CHECK-LABEL: @test_ne_eq_1(
17995daec6aSFlorian Hahn; CHECK-NEXT:  entry:
18095daec6aSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 1
18195daec6aSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
18295daec6aSFlorian Hahn; CHECK:       then:
18395daec6aSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ne i8 [[A]], 1
18495daec6aSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ne i8 [[A]], 0
18595daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
18695daec6aSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]]
18795daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]]
18895daec6aSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i8 [[A]], [[B]]
18995daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]]
19095daec6aSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i8 [[A]], 0
19195daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]
19295daec6aSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[A]], 0
19395daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], [[C_5]]
19495daec6aSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp uge i8 [[A]], 1
19595daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_6]]
19695daec6aSFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i8 [[A]], 1
19795daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]]
19895daec6aSFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp sgt i8 [[A]], 0
19995daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]]
20095daec6aSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_8]]
20195daec6aSFlorian Hahn; CHECK:       else:
202a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 true, false
20395daec6aSFlorian Hahn; CHECK-NEXT:    [[C_10:%.*]] = icmp ne i8 [[A]], [[B]]
20495daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_10]]
20595daec6aSFlorian Hahn; CHECK-NEXT:    [[C_11:%.*]] = icmp eq i8 [[A]], [[B]]
20695daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_11]]
207258a0a3aSFlorian Hahn; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], false
20895daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_13:%.*]] = xor i1 [[RES_12]], true
20995daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_14:%.*]] = xor i1 [[RES_13]], true
21095daec6aSFlorian Hahn; CHECK-NEXT:    [[RES_15:%.*]] = xor i1 [[RES_14]], false
211*7fb97beeSStephen Senran Zhang; CHECK-NEXT:    [[RES_16:%.*]] = xor i1 [[RES_15]], true
21295daec6aSFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_16]]
21395daec6aSFlorian Hahn;
21495daec6aSFlorian Hahnentry:
21595daec6aSFlorian Hahn  %cmp = icmp ne i8 %a, 1
21695daec6aSFlorian Hahn  br i1 %cmp, label %then, label %else
21795daec6aSFlorian Hahn
21895daec6aSFlorian Hahnthen:
21995daec6aSFlorian Hahn  %t.1 = icmp ne i8 %a, 1
22095daec6aSFlorian Hahn  %c.1 = icmp ne i8 %a, 0
22195daec6aSFlorian Hahn  %res.1 = xor i1 %t.1, %c.1
22295daec6aSFlorian Hahn
22395daec6aSFlorian Hahn  %c.2 = icmp ne i8 %a, %b
22495daec6aSFlorian Hahn  %res.2 = xor i1 %res.1, %c.2
22595daec6aSFlorian Hahn
22695daec6aSFlorian Hahn  %c.3 = icmp eq i8 %a, %b
22795daec6aSFlorian Hahn  %res.3 = xor i1 %res.2, %c.3
22895daec6aSFlorian Hahn
22995daec6aSFlorian Hahn  %c.4 = icmp eq i8 %a, 0
23095daec6aSFlorian Hahn  %res.4 = xor i1 %res.3, %c.4
23195daec6aSFlorian Hahn
23295daec6aSFlorian Hahn  %c.5 = icmp ugt i8 %a, 0
23395daec6aSFlorian Hahn  %res.5 = xor i1 %res.4, %c.5
23495daec6aSFlorian Hahn
23595daec6aSFlorian Hahn  %c.6 = icmp uge i8 %a, 1
23695daec6aSFlorian Hahn  %res.6 = xor i1 %res.5, %c.6
23795daec6aSFlorian Hahn
23895daec6aSFlorian Hahn  %c.7 = icmp ugt i8 %a, 1
23995daec6aSFlorian Hahn  %res.7 = xor i1 %res.6, %c.5
24095daec6aSFlorian Hahn
24195daec6aSFlorian Hahn  %c.8 = icmp sgt i8 %a, 0
24295daec6aSFlorian Hahn  %res.8 = xor i1 %res.7, %c.6
24395daec6aSFlorian Hahn
24495daec6aSFlorian Hahn  ret i1 %res.8
24595daec6aSFlorian Hahn
24695daec6aSFlorian Hahnelse:
24795daec6aSFlorian Hahn  %t.2 = icmp ne i8 %a, 0
24895daec6aSFlorian Hahn  %c.9 = icmp ne i8 %a, 1
24995daec6aSFlorian Hahn  %res.9 = xor i1 %t.2, %c.9
25095daec6aSFlorian Hahn
25195daec6aSFlorian Hahn  %c.10 = icmp ne i8 %a, %b
25295daec6aSFlorian Hahn  %res.10 = xor i1 %res.9, %c.10
25395daec6aSFlorian Hahn
25495daec6aSFlorian Hahn  %c.11 = icmp eq i8 %a, %b
25595daec6aSFlorian Hahn  %res.11 = xor i1 %res.10, %c.11
25695daec6aSFlorian Hahn
25795daec6aSFlorian Hahn  %f.1 = icmp eq i8 %a, 0
25895daec6aSFlorian Hahn  %res.12 = xor i1 %res.11, %f.1
25995daec6aSFlorian Hahn
26095daec6aSFlorian Hahn  %t.3 = icmp ugt i8 %a, 0
26195daec6aSFlorian Hahn  %res.13 = xor i1 %res.12, %t.3
26295daec6aSFlorian Hahn
26395daec6aSFlorian Hahn  %t.4 = icmp uge i8 %a, 1
26495daec6aSFlorian Hahn  %res.14 = xor i1 %res.13, %t.4
26595daec6aSFlorian Hahn
26695daec6aSFlorian Hahn  %f.2 = icmp ugt i8 %a, 1
26795daec6aSFlorian Hahn  %res.15 = xor i1 %res.14, %f.2
26895daec6aSFlorian Hahn
26995daec6aSFlorian Hahn  %c.12 = icmp sgt i8 %a, 0
27095daec6aSFlorian Hahn  %res.16 = xor i1 %res.15, %c.12
27195daec6aSFlorian Hahn
27295daec6aSFlorian Hahn  ret i1 %res.16
27395daec6aSFlorian Hahn}
274a2ba4e80SAntonio Frighetto
275a2ba4e80SAntonio Frighettodefine i1 @assume_b_plus_1_ult_a(i64 %a, i64 %b) {
276a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_b_plus_1_ult_a(
277a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i64 [[B:%.*]], 1
278a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], [[A:%.*]]
279a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
280a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 true
281a2ba4e80SAntonio Frighetto;
282a2ba4e80SAntonio Frighetto  %1 = add nuw i64 %b, 1
283a2ba4e80SAntonio Frighetto  %2 = icmp ult i64 %1, %a
284a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %2)
285a2ba4e80SAntonio Frighetto  %3 = icmp ne i64 %a, %b
286a2ba4e80SAntonio Frighetto  ret i1 %3
287a2ba4e80SAntonio Frighetto}
288a2ba4e80SAntonio Frighetto
289a2ba4e80SAntonio Frighettodefine i1 @assume_a_gt_b_and_b_ge_c(i64 %a, i64 %b, i64 %c) {
290a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_a_gt_b_and_b_ge_c(
291a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i64 [[A:%.*]], [[B:%.*]]
292a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP1]])
293a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge i64 [[B]], [[C:%.*]]
294a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
295a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 true
296a2ba4e80SAntonio Frighetto;
297a2ba4e80SAntonio Frighetto  %1 = icmp ugt i64 %a, %b
298a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %1)
299a2ba4e80SAntonio Frighetto  %2 = icmp uge i64 %b, %c
300a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %2)
301a2ba4e80SAntonio Frighetto  %3 = icmp ne i64 %a, %c
302a2ba4e80SAntonio Frighetto  ret i1 %3
303a2ba4e80SAntonio Frighetto}
304a2ba4e80SAntonio Frighetto
305a2ba4e80SAntonio Frighettodefine i1 @assume_a_ne_b_and_b_ne_c(i64 %a, i64 %b, i64 %c) {
306a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_a_ne_b_and_b_ne_c(
307a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
308a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP1]])
309a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i64 [[B]], [[C:%.*]]
310a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
311a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i64 [[A]], [[C]]
312a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[TMP3]]
313a2ba4e80SAntonio Frighetto;
314a2ba4e80SAntonio Frighetto  %1 = icmp ne i64 %a, %b
315a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %1)
316a2ba4e80SAntonio Frighetto  %2 = icmp ne i64 %b, %c
317a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %2)
318a2ba4e80SAntonio Frighetto  %3 = icmp ne i64 %a, %c
319a2ba4e80SAntonio Frighetto  ret i1 %3
320a2ba4e80SAntonio Frighetto}
321a2ba4e80SAntonio Frighetto
322a2ba4e80SAntonio Frighettodefine i1 @assume_1a(i64 %a, i64 %b) {
323a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_1a(
324a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
325a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
326a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i64 [[A]], [[B]]
327a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
328a2ba4e80SAntonio Frighetto;
329a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
330a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
331a2ba4e80SAntonio Frighetto  %ret = icmp ugt i64 %a, %b
332a2ba4e80SAntonio Frighetto  ret i1 %ret
333a2ba4e80SAntonio Frighetto}
334a2ba4e80SAntonio Frighetto
335a2ba4e80SAntonio Frighettodefine i1 @assume_1b(i64 %a, i64 %b) {
336a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_1b(
337a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
338a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
339a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp uge i64 [[A]], [[B]]
340a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
341a2ba4e80SAntonio Frighetto;
342a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
343a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
344a2ba4e80SAntonio Frighetto  %ret = icmp uge i64 %a, %b
345a2ba4e80SAntonio Frighetto  ret i1 %ret
346a2ba4e80SAntonio Frighetto}
347a2ba4e80SAntonio Frighetto
348a2ba4e80SAntonio Frighettodefine i1 @assume_2a(i64 %a, i64 %b) {
349a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_2a(
350a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
351a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
352a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp ult i64 [[A]], [[B]]
353a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
354a2ba4e80SAntonio Frighetto;
355a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
356a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
357a2ba4e80SAntonio Frighetto  %ret = icmp ult i64 %a, %b
358a2ba4e80SAntonio Frighetto  ret i1 %ret
359a2ba4e80SAntonio Frighetto}
360a2ba4e80SAntonio Frighetto
361a2ba4e80SAntonio Frighettodefine i1 @assume_2b(i64 %a, i64 %b) {
362a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_2b(
363a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
364a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
365a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp ule i64 [[A]], [[B]]
366a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
367a2ba4e80SAntonio Frighetto;
368a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
369a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
370a2ba4e80SAntonio Frighetto  %ret = icmp ule i64 %a, %b
371a2ba4e80SAntonio Frighetto  ret i1 %ret
372a2ba4e80SAntonio Frighetto}
373a2ba4e80SAntonio Frighetto
374a2ba4e80SAntonio Frighetto; TODO: extend to support signed comparisons
375a2ba4e80SAntonio Frighettodefine i1 @assume_3a(i64 %a, i64 %b) {
376a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_3a(
377a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
378a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
379a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp sgt i64 [[A]], [[B]]
380a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
381a2ba4e80SAntonio Frighetto;
382a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
383a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
384a2ba4e80SAntonio Frighetto  %ret = icmp sgt i64 %a, %b
385a2ba4e80SAntonio Frighetto  ret i1 %ret
386a2ba4e80SAntonio Frighetto}
387a2ba4e80SAntonio Frighetto
388a2ba4e80SAntonio Frighettodefine i1 @assume_3b(i64 %a, i64 %b) {
389a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_3b(
390a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
391a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
392a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp sge i64 [[A]], [[B]]
393a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
394a2ba4e80SAntonio Frighetto;
395a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
396a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
397a2ba4e80SAntonio Frighetto  %ret = icmp sge i64 %a, %b
398a2ba4e80SAntonio Frighetto  ret i1 %ret
399a2ba4e80SAntonio Frighetto}
400a2ba4e80SAntonio Frighetto
401a2ba4e80SAntonio Frighettodefine i1 @assume_4a(i64 %a, i64 %b) {
402a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_4a(
403a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
404a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
405a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp slt i64 [[A]], [[B]]
406a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
407a2ba4e80SAntonio Frighetto;
408a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
409a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
410a2ba4e80SAntonio Frighetto  %ret = icmp slt i64 %a, %b
411a2ba4e80SAntonio Frighetto  ret i1 %ret
412a2ba4e80SAntonio Frighetto}
413a2ba4e80SAntonio Frighetto
414a2ba4e80SAntonio Frighettodefine i1 @assume_4b(i64 %a, i64 %b) {
415a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_4b(
416a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]]
417a2ba4e80SAntonio Frighetto; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NE]])
418a2ba4e80SAntonio Frighetto; CHECK-NEXT:    [[RET:%.*]] = icmp sle i64 [[A]], [[B]]
419a2ba4e80SAntonio Frighetto; CHECK-NEXT:    ret i1 [[RET]]
420a2ba4e80SAntonio Frighetto;
421a2ba4e80SAntonio Frighetto  %ne = icmp ne i64 %a, %b
422a2ba4e80SAntonio Frighetto  tail call void @llvm.assume(i1 %ne)
423a2ba4e80SAntonio Frighetto  %ret = icmp sle i64 %a, %b
424a2ba4e80SAntonio Frighetto  ret i1 %ret
425a2ba4e80SAntonio Frighetto}
426