xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/zext-for-per-formula-reasoning.ll (revision 8a5d51b039c52c3e429390966670b0ab21cf257c)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4declare void @llvm.assume(i1)
5
6define i1 @test(i8 %x, i8 %y) {
7; CHECK-LABEL: @test(
8; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i8 [[X:%.*]], [[Y:%.*]]
9; CHECK-NEXT:    [[CMP_0:%.*]] = icmp uge i8 [[ADD]], 10
10; CHECK-NEXT:    tail call void @llvm.assume(i1 [[CMP_0]])
11; CHECK-NEXT:    [[EXT:%.*]] = zext i8 [[X]] to i16
12; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i16 [[EXT]], 1
13; CHECK-NEXT:    [[RES:%.*]] = xor i1 true, [[C_1]]
14; CHECK-NEXT:    ret i1 [[RES]]
15;
16  %add = add nuw nsw i8 %x, %y
17  %cmp.0 = icmp uge i8 %add, 10
18  tail call void @llvm.assume(i1 %cmp.0)
19  %ext = zext i8 %x to i16
20  %t.1 = icmp uge i16 %ext, 0
21  %c.1 = icmp uge i16 %ext, 1
22  %res = xor i1 %t.1, %c.1
23  ret i1 %res
24}
25
26define i1 @test2(i8 %x, i8 %y) {
27; CHECK-LABEL: @test2(
28; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i8 [[X:%.*]], [[Y:%.*]]
29; CHECK-NEXT:    [[CMP_0:%.*]] = icmp uge i8 [[ADD]], 0
30; CHECK-NEXT:    tail call void @llvm.assume(i1 [[CMP_0]])
31; CHECK-NEXT:    [[EXT:%.*]] = zext i8 [[X]] to i16
32; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw nsw i16 [[EXT]], 1
33; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i16 [[ADD_1]], 2
34; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]
35; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], false
36; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i16 [[ADD_1]], 1
37; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_2]]
38; CHECK-NEXT:    ret i1 [[RES_3]]
39;
40  %add = add nuw nsw i8 %x, %y
41  %cmp.0 = icmp uge i8 %add, 0
42  tail call void @llvm.assume(i1 %cmp.0)
43  %ext = zext i8 %x to i16
44  %add.1 = add nuw nsw i16 %ext, 1
45  %t.1 = icmp uge i16 %add.1, 1
46  %c.1 = icmp uge i16 %add.1, 2
47  %f.1 = icmp ult i16 %add.1, 1
48  %res.1 = xor i1 %t.1, %c.1
49  %res.2 = xor i1 %res.1, %f.1
50  %c.2 = icmp sge i16 %add.1, 1
51  %res.3 = xor i1 %res.2, %c.2
52  ret i1 %res.3
53}
54
55define i1 @gep_zext_idx(ptr %p, i8 %cnt, i8 %off) {
56; CHECK-LABEL: @gep_zext_idx(
57; CHECK-NEXT:  entry:
58; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i8 [[CNT:%.*]], [[OFF:%.*]]
59; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[ADD]], 10
60; CHECK-NEXT:    tail call void @llvm.assume(i1 [[CMP]])
61; CHECK-NEXT:    [[EXT:%.*]] = zext i8 [[CNT]] to i16
62; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i16 [[EXT]]
63; CHECK-NEXT:    [[GEP_11:%.*]] = getelementptr inbounds i32, ptr [[P]], i16 11
64; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt ptr [[ADD_PTR]], [[GEP_11]]
65; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false
66; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
67; CHECK-NEXT:    ret i1 [[RES_2]]
68;
69entry:
70  %add = add nuw nsw i8 %cnt, %off
71  %cmp = icmp ugt i8 %add, 10
72  tail call void @llvm.assume(i1 %cmp)
73  %ext = zext i8 %cnt to i16
74  %add.ptr = getelementptr inbounds i32, ptr %p, i16 %ext
75  %t.1 = icmp uge ptr %add.ptr, %p
76  %f.1 = icmp ult ptr %add.ptr, %p
77  %gep.11 = getelementptr inbounds i32, ptr %p, i16 11
78  %c.1 = icmp ugt ptr %add.ptr, %gep.11
79  %res.1 = xor i1 %t.1, %f.1
80  %res.2 = xor i1 %res.1, %c.1
81  ret i1 %res.2
82}
83
84define i1 @gep_zext_idx_adds(ptr %p, i8 %cnt, i8 %off) {
85; CHECK-LABEL: @gep_zext_idx_adds(
86; CHECK-NEXT:  entry:
87; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i8 [[CNT:%.*]], [[OFF:%.*]]
88; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i8 [[ADD]], 10
89; CHECK-NEXT:    tail call void @llvm.assume(i1 [[CMP]])
90; CHECK-NEXT:    [[EXT:%.*]] = zext i8 [[CNT]] to i16
91; CHECK-NEXT:    [[EXT_1:%.*]] = add nuw nsw i16 [[EXT]], 1
92; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i16 [[EXT_1]]
93; CHECK-NEXT:    [[GEP_11:%.*]] = getelementptr inbounds i32, ptr [[P]], i16 11
94; CHECK-NEXT:    [[C_1:%.*]] = icmp uge ptr [[ADD_PTR]], [[GEP_11]]
95; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, false
96; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
97; CHECK-NEXT:    ret i1 [[RES_2]]
98;
99entry:
100  %add = add nuw nsw i8 %cnt, %off
101  %cmp = icmp uge i8 %add, 10
102  tail call void @llvm.assume(i1 %cmp)
103  %ext = zext i8 %cnt to i16
104  %ext.1 = add nuw nsw i16 %ext, 1
105  %add.ptr = getelementptr inbounds i32, ptr %p, i16 %ext.1
106  %t.1 = icmp uge ptr %add.ptr, %p
107  %f.1 = icmp ult ptr %add.ptr, %p
108  %gep.11 = getelementptr inbounds i32, ptr %p, i16 11
109  %c.1 = icmp uge ptr %add.ptr, %gep.11
110  %res.1 = xor i1 %t.1, %f.1
111  %res.2 = xor i1 %res.1, %c.1
112  ret i1 %res.2
113}
114