xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/ext_min_max.ll (revision 5fe915bb8c6b963be9c8617fa50aa4d9c1e304fc)
1b5fa3574SMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2b5fa3574SMax Kazantsev; RUN: opt -S -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s
3b5fa3574SMax Kazantsev
4b5fa3574SMax Kazantsev; TODO: Make sure that zext(umin(x, y)) has same SCEV as umin(zext(x), zext(y)).
5b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/vdsvmp
6b5fa3574SMax Kazantsevdefine i1 @test_umin(i32 %x, i32 %y) {
7b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_umin'
8b5fa3574SMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_umin
9b5fa3574SMax Kazantsev; CHECK-NEXT:    %umin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y
10b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
11b5fa3574SMax Kazantsev; CHECK-NEXT:    %zext_umin_x_y = zext i32 %umin_x_y to i64
12*5fe915bbSMax Kazantsev; CHECK-NEXT:    --> ((zext i32 %x to i64) umin (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296)
13b5fa3574SMax Kazantsev; CHECK-NEXT:    %zext_x = zext i32 %x to i64
14b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (zext i32 %x to i64) U: [0,4294967296) S: [0,4294967296)
15b5fa3574SMax Kazantsev; CHECK-NEXT:    %zext_y = zext i32 %y to i64
16b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (zext i32 %y to i64) U: [0,4294967296) S: [0,4294967296)
17b5fa3574SMax Kazantsev; CHECK-NEXT:    %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y
18b5fa3574SMax Kazantsev; CHECK-NEXT:    --> ((zext i32 %x to i64) umin (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296)
19b5fa3574SMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_umin
20b5fa3574SMax Kazantsev;
21b5fa3574SMax Kazantsev  %cmp_x_y = icmp ult i32 %x, %y
22b5fa3574SMax Kazantsev  %umin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y
23b5fa3574SMax Kazantsev  %zext_umin_x_y = zext i32 %umin_x_y to i64
24b5fa3574SMax Kazantsev
25b5fa3574SMax Kazantsev  %zext_x = zext i32 %x to i64
26b5fa3574SMax Kazantsev  %zext_y = zext i32 %y to i64
27b5fa3574SMax Kazantsev  %cmp_zext_x_zext_y = icmp ult i64 %zext_x, %zext_y
28b5fa3574SMax Kazantsev  %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y
29b5fa3574SMax Kazantsev
30b5fa3574SMax Kazantsev  %they_are_same = icmp eq i64 %zext_umin_x_y, %umin_zext_x_zext_y
31b5fa3574SMax Kazantsev  ret i1 %they_are_same
32b5fa3574SMax Kazantsev}
33b5fa3574SMax Kazantsev
34b5fa3574SMax Kazantsev; TODO: Make sure that zext(umax(x, y)) has same SCEV as umax(zext(x), zext(y)).
35b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/5JHgxZ
36b5fa3574SMax Kazantsevdefine i1 @test_umax(i32 %x, i32 %y) {
37b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_umax'
38b5fa3574SMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_umax
39b5fa3574SMax Kazantsev; CHECK-NEXT:    %umax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x
40b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (%x umax %y) U: full-set S: full-set
41b5fa3574SMax Kazantsev; CHECK-NEXT:    %zext_umax_x_y = zext i32 %umax_x_y to i64
42*5fe915bbSMax Kazantsev; CHECK-NEXT:    --> ((zext i32 %x to i64) umax (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296)
43b5fa3574SMax Kazantsev; CHECK-NEXT:    %zext_x = zext i32 %x to i64
44b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (zext i32 %x to i64) U: [0,4294967296) S: [0,4294967296)
45b5fa3574SMax Kazantsev; CHECK-NEXT:    %zext_y = zext i32 %y to i64
46b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (zext i32 %y to i64) U: [0,4294967296) S: [0,4294967296)
47b5fa3574SMax Kazantsev; CHECK-NEXT:    %umax_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_y, i64 %zext_x
48b5fa3574SMax Kazantsev; CHECK-NEXT:    --> ((zext i32 %x to i64) umax (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296)
49b5fa3574SMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_umax
50b5fa3574SMax Kazantsev;
51b5fa3574SMax Kazantsev  %cmp_x_y = icmp ult i32 %x, %y
52b5fa3574SMax Kazantsev  %umax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x
53b5fa3574SMax Kazantsev  %zext_umax_x_y = zext i32 %umax_x_y to i64
54b5fa3574SMax Kazantsev
55b5fa3574SMax Kazantsev  %zext_x = zext i32 %x to i64
56b5fa3574SMax Kazantsev  %zext_y = zext i32 %y to i64
57b5fa3574SMax Kazantsev  %cmp_zext_x_zext_y = icmp ult i64 %zext_x, %zext_y
58b5fa3574SMax Kazantsev  %umax_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_y, i64 %zext_x
59b5fa3574SMax Kazantsev
60b5fa3574SMax Kazantsev  %they_are_same = icmp eq i64 %zext_umax_x_y, %umax_zext_x_zext_y
61b5fa3574SMax Kazantsev  ret i1 %they_are_same
62b5fa3574SMax Kazantsev}
63b5fa3574SMax Kazantsev
64b5fa3574SMax Kazantsev; TODO: Make sure that sext(smin(x, y)) has same SCEV as smin(sext(x), sext(y)).
65b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/HhYHzR
66b5fa3574SMax Kazantsevdefine i1 @test_smin(i32 %x, i32 %y) {
67b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_smin'
68b5fa3574SMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_smin
69b5fa3574SMax Kazantsev; CHECK-NEXT:    %smin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y
70b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (%x smin %y) U: full-set S: full-set
71b5fa3574SMax Kazantsev; CHECK-NEXT:    %sext_smin_x_y = sext i32 %smin_x_y to i64
72*5fe915bbSMax Kazantsev; CHECK-NEXT:    --> ((sext i32 %x to i64) smin (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
73b5fa3574SMax Kazantsev; CHECK-NEXT:    %sext_x = sext i32 %x to i64
74b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (sext i32 %x to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
75b5fa3574SMax Kazantsev; CHECK-NEXT:    %sext_y = sext i32 %y to i64
76b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (sext i32 %y to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
77b5fa3574SMax Kazantsev; CHECK-NEXT:    %smin_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_x, i64 %sext_y
78b5fa3574SMax Kazantsev; CHECK-NEXT:    --> ((sext i32 %x to i64) smin (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
79b5fa3574SMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_smin
80b5fa3574SMax Kazantsev;
81b5fa3574SMax Kazantsev  %cmp_x_y = icmp slt i32 %x, %y
82b5fa3574SMax Kazantsev  %smin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y
83b5fa3574SMax Kazantsev  %sext_smin_x_y = sext i32 %smin_x_y to i64
84b5fa3574SMax Kazantsev
85b5fa3574SMax Kazantsev  %sext_x = sext i32 %x to i64
86b5fa3574SMax Kazantsev  %sext_y = sext i32 %y to i64
87b5fa3574SMax Kazantsev  %cmp_sext_x_sext_y = icmp slt i64 %sext_x, %sext_y
88b5fa3574SMax Kazantsev  %smin_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_x, i64 %sext_y
89b5fa3574SMax Kazantsev
90b5fa3574SMax Kazantsev  %they_are_same = icmp eq i64 %sext_smin_x_y, %smin_sext_x_sext_y
91b5fa3574SMax Kazantsev  ret i1 %they_are_same
92b5fa3574SMax Kazantsev}
93b5fa3574SMax Kazantsev
94b5fa3574SMax Kazantsev; TODO: Make sure that sext(smax(x, y)) has same SCEV as smax(sext(x), sext(y)).
95b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/uou_u-
96b5fa3574SMax Kazantsevdefine i1 @test_smax(i32 %x, i32 %y) {
97b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_smax'
98b5fa3574SMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_smax
99b5fa3574SMax Kazantsev; CHECK-NEXT:    %smax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x
100b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (%x smax %y) U: full-set S: full-set
101b5fa3574SMax Kazantsev; CHECK-NEXT:    %sext_smax_x_y = sext i32 %smax_x_y to i64
102*5fe915bbSMax Kazantsev; CHECK-NEXT:    --> ((sext i32 %x to i64) smax (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
103b5fa3574SMax Kazantsev; CHECK-NEXT:    %sext_x = sext i32 %x to i64
104b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (sext i32 %x to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
105b5fa3574SMax Kazantsev; CHECK-NEXT:    %sext_y = sext i32 %y to i64
106b5fa3574SMax Kazantsev; CHECK-NEXT:    --> (sext i32 %y to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
107b5fa3574SMax Kazantsev; CHECK-NEXT:    %smax_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_y, i64 %sext_x
108b5fa3574SMax Kazantsev; CHECK-NEXT:    --> ((sext i32 %x to i64) smax (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648)
109b5fa3574SMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_smax
110b5fa3574SMax Kazantsev;
111b5fa3574SMax Kazantsev  %cmp_x_y = icmp slt i32 %x, %y
112b5fa3574SMax Kazantsev  %smax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x
113b5fa3574SMax Kazantsev  %sext_smax_x_y = sext i32 %smax_x_y to i64
114b5fa3574SMax Kazantsev
115b5fa3574SMax Kazantsev  %sext_x = sext i32 %x to i64
116b5fa3574SMax Kazantsev  %sext_y = sext i32 %y to i64
117b5fa3574SMax Kazantsev  %cmp_sext_x_sext_y = icmp slt i64 %sext_x, %sext_y
118b5fa3574SMax Kazantsev  %smax_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_y, i64 %sext_x
119b5fa3574SMax Kazantsev
120b5fa3574SMax Kazantsev  %they_are_same = icmp eq i64 %sext_smax_x_y, %smax_sext_x_sext_y
121b5fa3574SMax Kazantsev  ret i1 %they_are_same
122b5fa3574SMax Kazantsev}
1233c83bbd3SMax Kazantsev
1243c83bbd3SMax Kazantsev; TODO: Make sure that zext(umin_seq(x, y)) has same SCEV as umin_seq(zext(x), zext(y)).
1253c83bbd3SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/X8kaNx
1263c83bbd3SMax Kazantsevdefine i1 @test_umin_seq(i1 %x, i1 %y) {
1273c83bbd3SMax Kazantsev; CHECK-LABEL: 'test_umin_seq'
1283c83bbd3SMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_umin_seq
1293c83bbd3SMax Kazantsev; CHECK-NEXT:    %x_umin_seq_y = select i1 %x, i1 %y, i1 false
1303c83bbd3SMax Kazantsev; CHECK-NEXT:    --> (%x umin_seq %y) U: full-set S: full-set
1313c83bbd3SMax Kazantsev; CHECK-NEXT:    %zext_x_umin_seq_y = zext i1 %x_umin_seq_y to i64
132*5fe915bbSMax Kazantsev; CHECK-NEXT:    --> ((zext i1 %x to i64) umin_seq (zext i1 %y to i64)) U: [0,2) S: [0,2)
1333c83bbd3SMax Kazantsev; CHECK-NEXT:    %zext_x = zext i1 %x to i64
1343c83bbd3SMax Kazantsev; CHECK-NEXT:    --> (zext i1 %x to i64) U: [0,2) S: [0,2)
1353c83bbd3SMax Kazantsev; CHECK-NEXT:    %zext_y = zext i1 %y to i64
1363c83bbd3SMax Kazantsev; CHECK-NEXT:    --> (zext i1 %y to i64) U: [0,2) S: [0,2)
1373c83bbd3SMax Kazantsev; CHECK-NEXT:    %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y
1383c83bbd3SMax Kazantsev; CHECK-NEXT:    --> ((zext i1 %x to i64) umin (zext i1 %y to i64)) U: [0,2) S: [0,2)
1393c83bbd3SMax Kazantsev; CHECK-NEXT:    %umin_seq_zext_x_xext_y = select i1 %zext_x_is_0, i64 0, i64 %umin_zext_x_zext_y
1403c83bbd3SMax Kazantsev; CHECK-NEXT:    --> ((zext i1 %x to i64) umin_seq (zext i1 %y to i64)) U: [0,2) S: [0,2)
1413c83bbd3SMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_umin_seq
1423c83bbd3SMax Kazantsev;
1433c83bbd3SMax Kazantsev  %x_umin_seq_y = select i1 %x, i1 %y, i1 false
1443c83bbd3SMax Kazantsev  %zext_x_umin_seq_y = zext i1 %x_umin_seq_y to i64
1453c83bbd3SMax Kazantsev
1463c83bbd3SMax Kazantsev  %zext_x = zext i1 %x to i64
1473c83bbd3SMax Kazantsev  %zext_y = zext i1 %y to i64
1483c83bbd3SMax Kazantsev  %zext_x_is_0 = icmp eq i64 %zext_x, 0
1493c83bbd3SMax Kazantsev  %cmp_zext_x_zext_y = icmp ult i64 %zext_x, %zext_y
1503c83bbd3SMax Kazantsev  %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y
1513c83bbd3SMax Kazantsev  %umin_seq_zext_x_xext_y = select i1 %zext_x_is_0, i64 0, i64 %umin_zext_x_zext_y
1523c83bbd3SMax Kazantsev
1533c83bbd3SMax Kazantsev  %they_are_same = icmp eq i64 %zext_x_umin_seq_y, %umin_seq_zext_x_xext_y
1543c83bbd3SMax Kazantsev  ret i1 %they_are_same
1553c83bbd3SMax Kazantsev}
156