xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/udiv-of-x-xsmaxone-fold.ll (revision e80f48986c7ba6cc41378b8d8e12d804cf26895d)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -disable-output -passes="print<scalar-evolution>" < %s 2>&1 | FileCheck %s
3
4define i32 @test_expr_with_constant_1(i32 %x) {
5; CHECK-LABEL: 'test_expr_with_constant_1'
6; CHECK-NEXT:  Classifying expressions for: @test_expr_with_constant_1
7; CHECK-NEXT:    %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 1)
8; CHECK-NEXT:    --> (1 smax %x) U: [1,-2147483648) S: [1,-2147483648)
9; CHECK-NEXT:    %add = add nsw i32 %smax, -1
10; CHECK-NEXT:    --> (-1 + (1 smax %x))<nsw> U: [0,2147483647) S: [0,2147483647)
11; CHECK-NEXT:    %udiv = udiv i32 %add, %x
12; CHECK-NEXT:    --> 0 U: [0,1) S: [0,1)
13; CHECK-NEXT:  Determining loop execution counts for: @test_expr_with_constant_1
14;
15entry:
16  %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 1)
17  %add = add nsw i32 %smax, -1
18  %udiv = udiv i32 %add, %x
19  ret i32 %udiv
20}
21
22; Non-1 constant: (-2 + (2 smax %x)) /u %x
23define i32 @test_expr_with_constant_2(i32 %x) {
24; CHECK-LABEL: 'test_expr_with_constant_2'
25; CHECK-NEXT:  Classifying expressions for: @test_expr_with_constant_2
26; CHECK-NEXT:    %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2)
27; CHECK-NEXT:    --> (2 smax %x) U: [2,-2147483648) S: [2,-2147483648)
28; CHECK-NEXT:    %add = add nsw i32 %smax, -2
29; CHECK-NEXT:    --> (-2 + (2 smax %x))<nsw> U: [0,2147483646) S: [0,2147483646)
30; CHECK-NEXT:    %udiv = udiv i32 %add, %x
31; CHECK-NEXT:    --> 0 U: [0,1) S: [0,1)
32; CHECK-NEXT:  Determining loop execution counts for: @test_expr_with_constant_2
33;
34entry:
35  %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2)
36  %add = add nsw i32 %smax, -2
37  %udiv = udiv i32 %add, %x
38  ret i32 %udiv
39}
40
41; Negative test, constants mismatch: (-3 + (2 smax %x)) /u %x
42define i32 @test_expr_mismatch_constants(i32 %x) {
43; CHECK-LABEL: 'test_expr_mismatch_constants'
44; CHECK-NEXT:  Classifying expressions for: @test_expr_mismatch_constants
45; CHECK-NEXT:    %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2)
46; CHECK-NEXT:    --> (2 smax %x) U: [2,-2147483648) S: [2,-2147483648)
47; CHECK-NEXT:    %add = add nsw i32 %smax, -3
48; CHECK-NEXT:    --> (-3 + (2 smax %x))<nsw> U: [-1,2147483645) S: [-1,2147483645)
49; CHECK-NEXT:    %udiv = udiv i32 %add, %x
50; CHECK-NEXT:    --> ((-3 + (2 smax %x))<nsw> /u %x) U: full-set S: full-set
51; CHECK-NEXT:  Determining loop execution counts for: @test_expr_mismatch_constants
52;
53entry:
54  %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2)
55  %add = add nsw i32 %smax, -3
56  %udiv = udiv i32 %add, %x
57  ret i32 %udiv
58}
59
60; Negative constant: (3 + (-3 smax %x)) /u %x
61define i32 @test_expr_negative_constant(i32 %x) {
62; CHECK-LABEL: 'test_expr_negative_constant'
63; CHECK-NEXT:  Classifying expressions for: @test_expr_negative_constant
64; CHECK-NEXT:    %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 -3)
65; CHECK-NEXT:    --> (-3 smax %x) U: [-3,-2147483648) S: [-3,-2147483648)
66; CHECK-NEXT:    %add = add nsw i32 %smax, 3
67; CHECK-NEXT:    --> (3 + (-3 smax %x)) U: [0,-2147483645) S: [0,-2147483645)
68; CHECK-NEXT:    %udiv = udiv i32 %add, %x
69; CHECK-NEXT:    --> ((3 + (-3 smax %x)) /u %x) U: [0,-2147483645) S: [0,-2147483645)
70; CHECK-NEXT:  Determining loop execution counts for: @test_expr_negative_constant
71;
72entry:
73  %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 -3)
74  %add = add nsw i32 %smax, 3
75  %udiv = udiv i32 %add, %x
76  ret i32 %udiv
77}
78
79; Negative signed minimum value.
80define i8 @text_expr_with_constant_signed_min(i8 %x) {
81; CHECK-LABEL: 'text_expr_with_constant_signed_min'
82; CHECK-NEXT:  Classifying expressions for: @text_expr_with_constant_signed_min
83; CHECK-NEXT:    %smax = tail call i8 @llvm.smax.i8(i8 %x, i8 -128)
84; CHECK-NEXT:    --> %x U: full-set S: full-set
85; CHECK-NEXT:    %add = add nsw i8 %smax, -128
86; CHECK-NEXT:    --> (-128 + %x) U: full-set S: full-set
87; CHECK-NEXT:    %udiv = udiv i8 %add, %x
88; CHECK-NEXT:    --> ((-128 + %x) /u %x) U: full-set S: full-set
89; CHECK-NEXT:  Determining loop execution counts for: @text_expr_with_constant_signed_min
90;
91entry:
92  %smax = tail call i8 @llvm.smax.i8(i8 %x, i8 128)
93  %add = add nsw i8 %smax, -128
94  %udiv = udiv i8 %add, %x
95  ret i8 %udiv
96}
97