xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/ashr.ll (revision f7d1baa414e6e4fca04092cb2f71e9b037c762f0)
1bd6d41f5SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
288fe246aSSimon Pilgrim; RUN: opt < %s --data-layout="e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
388fe246aSSimon Pilgrim; RUN: opt < %s --data-layout="e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
4bd6d41f5SRoman Lebedev
5bd6d41f5SRoman Lebedev; In general, we can't deal with ashr.
6bd6d41f5SRoman Lebedevdefine i32 @t0(i32 %x, i32 %y) {
788fe246aSSimon Pilgrim; CHECK-LABEL: 't0'
888fe246aSSimon Pilgrim; CHECK-NEXT:  Classifying expressions for: @t0
988fe246aSSimon Pilgrim; CHECK-NEXT:    %i0 = ashr i32 %x, %y
1088fe246aSSimon Pilgrim; CHECK-NEXT:    --> %i0 U: full-set S: full-set
1188fe246aSSimon Pilgrim; CHECK-NEXT:  Determining loop execution counts for: @t0
12bd6d41f5SRoman Lebedev;
13bd6d41f5SRoman Lebedev  %i0 = ashr i32 %x, %y
14bd6d41f5SRoman Lebedev  ret i32 %i0
15bd6d41f5SRoman Lebedev}
16bd6d41f5SRoman Lebedev; Not even if we know it's exact
17bd6d41f5SRoman Lebedevdefine i32 @t1(i32 %x, i32 %y) {
1888fe246aSSimon Pilgrim; CHECK-LABEL: 't1'
1988fe246aSSimon Pilgrim; CHECK-NEXT:  Classifying expressions for: @t1
2088fe246aSSimon Pilgrim; CHECK-NEXT:    %i0 = ashr exact i32 %x, %y
2188fe246aSSimon Pilgrim; CHECK-NEXT:    --> %i0 U: full-set S: full-set
2288fe246aSSimon Pilgrim; CHECK-NEXT:  Determining loop execution counts for: @t1
23bd6d41f5SRoman Lebedev;
24bd6d41f5SRoman Lebedev  %i0 = ashr exact i32 %x, %y
25bd6d41f5SRoman Lebedev  ret i32 %i0
26bd6d41f5SRoman Lebedev}
27bd6d41f5SRoman Lebedev; Not even if the shift amount is a constant.
28bd6d41f5SRoman Lebedevdefine i32 @t2(i32 %x, i32 %y) {
2988fe246aSSimon Pilgrim; CHECK-LABEL: 't2'
3088fe246aSSimon Pilgrim; CHECK-NEXT:  Classifying expressions for: @t2
3188fe246aSSimon Pilgrim; CHECK-NEXT:    %i0 = ashr i32 %x, 4
324a5edea1SPhilip Reames; CHECK-NEXT:    --> %i0 U: [-134217728,134217728) S: [-134217728,134217728)
3388fe246aSSimon Pilgrim; CHECK-NEXT:  Determining loop execution counts for: @t2
34bd6d41f5SRoman Lebedev;
35bd6d41f5SRoman Lebedev  %i0 = ashr i32 %x, 4
36bd6d41f5SRoman Lebedev  ret i32 %i0
37bd6d41f5SRoman Lebedev}
38bd6d41f5SRoman Lebedev; However, if it's a constant AND the shift is exact, we can model it!
39bd6d41f5SRoman Lebedevdefine i32 @t3(i32 %x, i32 %y) {
4088fe246aSSimon Pilgrim; CHECK-LABEL: 't3'
4188fe246aSSimon Pilgrim; CHECK-NEXT:  Classifying expressions for: @t3
4288fe246aSSimon Pilgrim; CHECK-NEXT:    %i0 = ashr exact i32 %x, 4
43d480f968SRoman Lebedev; CHECK-NEXT:    --> %i0 U: [-134217728,134217728) S: [-134217728,134217728)
4488fe246aSSimon Pilgrim; CHECK-NEXT:  Determining loop execution counts for: @t3
45bd6d41f5SRoman Lebedev;
46bd6d41f5SRoman Lebedev  %i0 = ashr exact i32 %x, 4
47bd6d41f5SRoman Lebedev  ret i32 %i0
48bd6d41f5SRoman Lebedev}
49bd6d41f5SRoman Lebedev; As long as the shift amount is in-bounds
50bd6d41f5SRoman Lebedevdefine i32 @t4(i32 %x, i32 %y) {
5188fe246aSSimon Pilgrim; CHECK-LABEL: 't4'
5288fe246aSSimon Pilgrim; CHECK-NEXT:  Classifying expressions for: @t4
5388fe246aSSimon Pilgrim; CHECK-NEXT:    %i0 = ashr exact i32 %x, 32
54*f7d1baa4SNikita Popov; CHECK-NEXT:    --> %i0 U: [0,1) S: [0,1)
5588fe246aSSimon Pilgrim; CHECK-NEXT:  Determining loop execution counts for: @t4
56bd6d41f5SRoman Lebedev;
57bd6d41f5SRoman Lebedev  %i0 = ashr exact i32 %x, 32
58bd6d41f5SRoman Lebedev  ret i32 %i0
59bd6d41f5SRoman Lebedev}
60bd6d41f5SRoman Lebedev
61bd6d41f5SRoman Lebedev; One more test, just to see that we model constant correctly
62bd6d41f5SRoman Lebedevdefine i32 @t5(i32 %x, i32 %y) {
6388fe246aSSimon Pilgrim; CHECK-LABEL: 't5'
6488fe246aSSimon Pilgrim; CHECK-NEXT:  Classifying expressions for: @t5
6588fe246aSSimon Pilgrim; CHECK-NEXT:    %i0 = ashr exact i32 %x, 5
66d480f968SRoman Lebedev; CHECK-NEXT:    --> %i0 U: [-67108864,67108864) S: [-67108864,67108864)
6788fe246aSSimon Pilgrim; CHECK-NEXT:  Determining loop execution counts for: @t5
68bd6d41f5SRoman Lebedev;
69bd6d41f5SRoman Lebedev  %i0 = ashr exact i32 %x, 5
70bd6d41f5SRoman Lebedev  ret i32 %i0
71bd6d41f5SRoman Lebedev}
72