xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/pr46786.ll (revision 92619956eb27ef08dd24045307593fc3d7f78db0)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
3
4source_filename = "input.cpp"
5target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
6
7; Function Attrs: nofree
8define ptr @FSE_decompress_usingDTable(ptr %arg, i32 %arg1, i32 %arg2, i32 %arg3) local_unnamed_addr #0 {
9; CHECK-LABEL: 'FSE_decompress_usingDTable'
10; CHECK-NEXT:  Classifying expressions for: @FSE_decompress_usingDTable
11; CHECK-NEXT:    %i = getelementptr inbounds i8, ptr %arg, i32 %arg2
12; CHECK-NEXT:    --> (%arg2 + %arg) U: full-set S: full-set
13; CHECK-NEXT:    %i4 = sub nsw i32 0, %arg1
14; CHECK-NEXT:    --> (-1 * %arg1) U: full-set S: full-set
15; CHECK-NEXT:    %i5 = getelementptr inbounds i8, ptr %i, i32 %i4
16; CHECK-NEXT:    --> ((-1 * %arg1) + %arg2 + %arg) U: full-set S: full-set
17; CHECK-NEXT:    %i7 = select i1 %i6, i32 %arg2, i32 %arg1
18; CHECK-NEXT:    --> ((-1 * (ptrtoint ptr %arg to i32)) + (((-1 * %arg1) + (ptrtoint ptr %arg to i32) + %arg2) umin (ptrtoint ptr %arg to i32)) + %arg1) U: full-set S: full-set
19; CHECK-NEXT:    %i8 = sub i32 %arg3, %i7
20; CHECK-NEXT:    --> ((-1 * (((-1 * %arg1) + (ptrtoint ptr %arg to i32) + %arg2) umin (ptrtoint ptr %arg to i32))) + (-1 * %arg1) + (ptrtoint ptr %arg to i32) + %arg3) U: full-set S: full-set
21; CHECK-NEXT:    %i9 = getelementptr inbounds i8, ptr %arg, i32 %i8
22; CHECK-NEXT:    --> ((-1 * (((-1 * %arg1) + (ptrtoint ptr %arg to i32) + %arg2) umin (ptrtoint ptr %arg to i32))) + (-1 * %arg1) + (ptrtoint ptr %arg to i32) + %arg3 + %arg) U: full-set S: full-set
23; CHECK-NEXT:  Determining loop execution counts for: @FSE_decompress_usingDTable
24;
25bb:
26  %i = getelementptr inbounds i8, ptr %arg, i32 %arg2
27  %i4 = sub nsw i32 0, %arg1
28  %i5 = getelementptr inbounds i8, ptr %i, i32 %i4
29  %i6 = icmp ult ptr %i5, %arg
30  %i7 = select i1 %i6, i32 %arg2, i32 %arg1
31  %i8 = sub i32 %arg3, %i7
32  %i9 = getelementptr inbounds i8, ptr %arg, i32 %i8
33  ret ptr %i9
34}
35
36define ptr @test_01(ptr %p) {
37; CHECK-LABEL: 'test_01'
38; CHECK-NEXT:  Classifying expressions for: @test_01
39; CHECK-NEXT:    %p1 = getelementptr i8, ptr %p, i32 2
40; CHECK-NEXT:    --> (2 + %p) U: full-set S: full-set
41; CHECK-NEXT:    %p2 = getelementptr i8, ptr %p, i32 1
42; CHECK-NEXT:    --> (1 + %p) U: full-set S: full-set
43; CHECK-NEXT:    %index = select i1 %cmp, i32 2, i32 1
44; CHECK-NEXT:    --> ((-1 * (ptrtoint ptr %p to i32)) + ((1 + (ptrtoint ptr %p to i32)) umax (2 + (ptrtoint ptr %p to i32)))) U: full-set S: full-set
45; CHECK-NEXT:    %neg_index = sub i32 0, %index
46; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) umax (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32)) U: full-set S: full-set
47; CHECK-NEXT:    %gep = getelementptr i8, ptr %p, i32 %neg_index
48; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) umax (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32) + %p) U: full-set S: full-set
49; CHECK-NEXT:  Determining loop execution counts for: @test_01
50;
51  %p1 = getelementptr i8, ptr %p, i32 2
52  %p2 = getelementptr i8, ptr %p, i32 1
53  %cmp = icmp ugt ptr %p1, %p2
54  %index = select i1 %cmp, i32 2, i32 1
55  %neg_index = sub i32 0, %index
56  %gep = getelementptr i8, ptr %p, i32 %neg_index
57  ret ptr %gep
58}
59
60define ptr @test_02(ptr %p) {
61; CHECK-LABEL: 'test_02'
62; CHECK-NEXT:  Classifying expressions for: @test_02
63; CHECK-NEXT:    %p1 = getelementptr i8, ptr %p, i32 2
64; CHECK-NEXT:    --> (2 + %p) U: full-set S: full-set
65; CHECK-NEXT:    %p2 = getelementptr i8, ptr %p, i32 1
66; CHECK-NEXT:    --> (1 + %p) U: full-set S: full-set
67; CHECK-NEXT:    %index = select i1 %cmp, i32 2, i32 1
68; CHECK-NEXT:    --> ((-1 * (ptrtoint ptr %p to i32)) + ((1 + (ptrtoint ptr %p to i32)) smax (2 + (ptrtoint ptr %p to i32)))) U: full-set S: full-set
69; CHECK-NEXT:    %neg_index = sub i32 0, %index
70; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) smax (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32)) U: full-set S: full-set
71; CHECK-NEXT:    %gep = getelementptr i8, ptr %p, i32 %neg_index
72; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) smax (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32) + %p) U: full-set S: full-set
73; CHECK-NEXT:  Determining loop execution counts for: @test_02
74;
75  %p1 = getelementptr i8, ptr %p, i32 2
76  %p2 = getelementptr i8, ptr %p, i32 1
77  %cmp = icmp sgt ptr %p1, %p2
78  %index = select i1 %cmp, i32 2, i32 1
79  %neg_index = sub i32 0, %index
80  %gep = getelementptr i8, ptr %p, i32 %neg_index
81  ret ptr %gep
82}
83
84define ptr @test_03(ptr %p) {
85; CHECK-LABEL: 'test_03'
86; CHECK-NEXT:  Classifying expressions for: @test_03
87; CHECK-NEXT:    %p1 = getelementptr i8, ptr %p, i32 2
88; CHECK-NEXT:    --> (2 + %p) U: full-set S: full-set
89; CHECK-NEXT:    %p2 = getelementptr i8, ptr %p, i32 1
90; CHECK-NEXT:    --> (1 + %p) U: full-set S: full-set
91; CHECK-NEXT:    %index = select i1 %cmp, i32 2, i32 1
92; CHECK-NEXT:    --> ((-1 * (ptrtoint ptr %p to i32)) + ((1 + (ptrtoint ptr %p to i32)) umin (2 + (ptrtoint ptr %p to i32)))) U: full-set S: full-set
93; CHECK-NEXT:    %neg_index = sub i32 0, %index
94; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) umin (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32)) U: full-set S: full-set
95; CHECK-NEXT:    %gep = getelementptr i8, ptr %p, i32 %neg_index
96; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) umin (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32) + %p) U: full-set S: full-set
97; CHECK-NEXT:  Determining loop execution counts for: @test_03
98;
99  %p1 = getelementptr i8, ptr %p, i32 2
100  %p2 = getelementptr i8, ptr %p, i32 1
101  %cmp = icmp ult ptr %p1, %p2
102  %index = select i1 %cmp, i32 2, i32 1
103  %neg_index = sub i32 0, %index
104  %gep = getelementptr i8, ptr %p, i32 %neg_index
105  ret ptr %gep
106}
107
108define ptr @test_04(ptr %p) {
109; CHECK-LABEL: 'test_04'
110; CHECK-NEXT:  Classifying expressions for: @test_04
111; CHECK-NEXT:    %p1 = getelementptr i8, ptr %p, i32 2
112; CHECK-NEXT:    --> (2 + %p) U: full-set S: full-set
113; CHECK-NEXT:    %p2 = getelementptr i8, ptr %p, i32 1
114; CHECK-NEXT:    --> (1 + %p) U: full-set S: full-set
115; CHECK-NEXT:    %index = select i1 %cmp, i32 2, i32 1
116; CHECK-NEXT:    --> ((-1 * (ptrtoint ptr %p to i32)) + ((1 + (ptrtoint ptr %p to i32)) smin (2 + (ptrtoint ptr %p to i32)))) U: full-set S: full-set
117; CHECK-NEXT:    %neg_index = sub i32 0, %index
118; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) smin (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32)) U: full-set S: full-set
119; CHECK-NEXT:    %gep = getelementptr i8, ptr %p, i32 %neg_index
120; CHECK-NEXT:    --> ((-1 * ((1 + (ptrtoint ptr %p to i32)) smin (2 + (ptrtoint ptr %p to i32)))) + (ptrtoint ptr %p to i32) + %p) U: full-set S: full-set
121; CHECK-NEXT:  Determining loop execution counts for: @test_04
122;
123  %p1 = getelementptr i8, ptr %p, i32 2
124  %p2 = getelementptr i8, ptr %p, i32 1
125  %cmp = icmp slt ptr %p1, %p2
126  %index = select i1 %cmp, i32 2, i32 1
127  %neg_index = sub i32 0, %index
128  %gep = getelementptr i8, ptr %p, i32 %neg_index
129  ret ptr %gep
130}
131
132attributes #0 = { nofree }
133