1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00
llvm-mirror/test/Analysis/ScalarEvolution/lshr-shl-differentconstmask.ll
Nikita Popov c334a9e7fa [SCEV] Use unsigned/signed intersection type in SCEV
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
2019-06-15 09:15:52 +00:00

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
}