mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
c334a9e7fa
Based on D59959, this switches SCEV to use unsigned/signed range intersection based on the sign hint. This will prefer non-wrapping ranges in the relevant domain. I've left the one intersection in getRangeForAffineAR() to use the smallest intersection heuristic, as there doesn't seem to be any obvious preference there. Differential Revision: https://reviews.llvm.org/D60035 llvm-svn: 363490
142 lines
5.3 KiB
LLVM
142 lines
5.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
|
|
; RUN: opt -S -analyze -scalar-evolution < %s | FileCheck %s
|
|
|
|
; The obvious case.
|
|
define i32 @udiv_biggerLshr(i32 %val) nounwind {
|
|
; CHECK-LABEL: 'udiv_biggerLshr'
|
|
; CHECK-NEXT: Classifying expressions for: @udiv_biggerLshr
|
|
; CHECK-NEXT: %tmp1 = udiv i32 %val, 64
|
|
; CHECK-NEXT: --> (%val /u 64) U: [0,67108864) S: [0,67108864)
|
|
; CHECK-NEXT: %tmp2 = mul i32 %tmp1, 16
|
|
; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)
|
|
; CHECK-NEXT: Determining loop execution counts for: @udiv_biggerLshr
|
|
;
|
|
%tmp1 = udiv i32 %val, 64
|
|
%tmp2 = mul i32 %tmp1, 16
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
define i32 @udiv_biggerShl(i32 %val) nounwind {
|
|
; CHECK-LABEL: 'udiv_biggerShl'
|
|
; CHECK-NEXT: Classifying expressions for: @udiv_biggerShl
|
|
; CHECK-NEXT: %tmp1 = udiv i32 %val, 16
|
|
; CHECK-NEXT: --> (%val /u 16) U: [0,268435456) S: [0,268435456)
|
|
; CHECK-NEXT: %tmp2 = mul i32 %tmp1, 64
|
|
; CHECK-NEXT: --> (64 * (%val /u 16)) U: [0,-63) S: [-2147483648,2147483585)
|
|
; CHECK-NEXT: Determining loop execution counts for: @udiv_biggerShl
|
|
;
|
|
%tmp1 = udiv i32 %val, 16
|
|
%tmp2 = mul i32 %tmp1, 64
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
; Or, it could have been transformed to shifts
|
|
|
|
define i32 @shifty_biggerLshr(i32 %val) {
|
|
; CHECK-LABEL: 'shifty_biggerLshr'
|
|
; CHECK-NEXT: Classifying expressions for: @shifty_biggerLshr
|
|
; CHECK-NEXT: %tmp1 = lshr i32 %val, 6
|
|
; CHECK-NEXT: --> (%val /u 64) U: [0,67108864) S: [0,67108864)
|
|
; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 4
|
|
; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)
|
|
; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerLshr
|
|
;
|
|
%tmp1 = lshr i32 %val, 6
|
|
%tmp2 = shl i32 %tmp1, 4
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
define i32 @shifty_biggerLshr_lshrexact(i32 %val) {
|
|
; CHECK-LABEL: 'shifty_biggerLshr_lshrexact'
|
|
; CHECK-NEXT: Classifying expressions for: @shifty_biggerLshr_lshrexact
|
|
; CHECK-NEXT: %tmp1 = lshr exact i32 %val, 6
|
|
; CHECK-NEXT: --> (%val /u 64) U: [0,67108864) S: [0,67108864)
|
|
; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 4
|
|
; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)
|
|
; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerLshr_lshrexact
|
|
;
|
|
%tmp1 = lshr exact i32 %val, 6
|
|
%tmp2 = shl i32 %tmp1, 4
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
define i32 @shifty_biggerShr(i32 %val) {
|
|
; CHECK-LABEL: 'shifty_biggerShr'
|
|
; CHECK-NEXT: Classifying expressions for: @shifty_biggerShr
|
|
; CHECK-NEXT: %tmp1 = lshr i32 %val, 4
|
|
; CHECK-NEXT: --> (%val /u 16) U: [0,268435456) S: [0,268435456)
|
|
; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 6
|
|
; CHECK-NEXT: --> (64 * (%val /u 16)) U: [0,-63) S: [-2147483648,2147483585)
|
|
; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerShr
|
|
;
|
|
%tmp1 = lshr i32 %val, 4
|
|
%tmp2 = shl i32 %tmp1, 6
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
define i32 @shifty_biggerShr_lshrexact(i32 %val) {
|
|
; CHECK-LABEL: 'shifty_biggerShr_lshrexact'
|
|
; CHECK-NEXT: Classifying expressions for: @shifty_biggerShr_lshrexact
|
|
; CHECK-NEXT: %tmp1 = lshr exact i32 %val, 4
|
|
; CHECK-NEXT: --> (%val /u 16) U: [0,268435456) S: [0,268435456)
|
|
; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 6
|
|
; CHECK-NEXT: --> (64 * (%val /u 16)) U: [0,-63) S: [-2147483648,2147483585)
|
|
; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerShr_lshrexact
|
|
;
|
|
%tmp1 = lshr exact i32 %val, 4
|
|
%tmp2 = shl i32 %tmp1, 6
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
; Or, further folded into mask variant.
|
|
|
|
define i32 @masky_biggerLshr(i32 %val) {
|
|
; CHECK-LABEL: 'masky_biggerLshr'
|
|
; CHECK-NEXT: Classifying expressions for: @masky_biggerLshr
|
|
; CHECK-NEXT: %tmp1 = lshr i32 %val, 2
|
|
; CHECK-NEXT: --> (%val /u 4) U: [0,1073741824) S: [0,1073741824)
|
|
; CHECK-NEXT: %tmp2 = and i32 %tmp1, -16
|
|
; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)
|
|
; CHECK-NEXT: Determining loop execution counts for: @masky_biggerLshr
|
|
;
|
|
%tmp1 = lshr i32 %val, 2
|
|
%tmp2 = and i32 %tmp1, -16
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
define i32 @masky_biggerLshr_lshrexact(i32 %val) {
|
|
; CHECK-LABEL: 'masky_biggerLshr_lshrexact'
|
|
; CHECK-NEXT: Classifying expressions for: @masky_biggerLshr_lshrexact
|
|
; CHECK-NEXT: %tmp1 = lshr exact i32 %val, 2
|
|
; CHECK-NEXT: --> (%val /u 4) U: [0,1073741824) S: [0,1073741824)
|
|
; CHECK-NEXT: Determining loop execution counts for: @masky_biggerLshr_lshrexact
|
|
;
|
|
%tmp1 = lshr exact i32 %val, 2
|
|
ret i32 %tmp1
|
|
}
|
|
|
|
define i32 @masky_biggerShr(i32 %val) {
|
|
; CHECK-LABEL: 'masky_biggerShr'
|
|
; CHECK-NEXT: Classifying expressions for: @masky_biggerShr
|
|
; CHECK-NEXT: %tmp1 = shl i32 %val, 2
|
|
; CHECK-NEXT: --> (4 * %val) U: [0,-3) S: [-2147483648,2147483645)
|
|
; CHECK-NEXT: %tmp2 = and i32 %tmp1, -64
|
|
; CHECK-NEXT: --> (64 * (zext i26 (trunc i32 (%val /u 16) to i26) to i32))<nuw> U: [0,-63) S: [-2147483648,2147483585)
|
|
; CHECK-NEXT: Determining loop execution counts for: @masky_biggerShr
|
|
;
|
|
%tmp1 = shl i32 %val, 2
|
|
%tmp2 = and i32 %tmp1, -64
|
|
ret i32 %tmp2
|
|
}
|
|
|
|
define i32 @masky_biggerShr_lshrexact(i32 %val) {
|
|
; CHECK-LABEL: 'masky_biggerShr_lshrexact'
|
|
; CHECK-NEXT: Classifying expressions for: @masky_biggerShr_lshrexact
|
|
; CHECK-NEXT: %tmp1 = shl i32 %val, 2
|
|
; CHECK-NEXT: --> (4 * %val) U: [0,-3) S: [-2147483648,2147483645)
|
|
; CHECK-NEXT: Determining loop execution counts for: @masky_biggerShr_lshrexact
|
|
;
|
|
%tmp1 = shl i32 %val, 2
|
|
ret i32 %tmp1
|
|
}
|