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