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