forked from OSchip/llvm-project
[InstCombine] Ensure that truncated int types are legal.
Fixes the FIXMEs in D25952 and rL285075. Patch by bryant! Differential Revision: https://reviews.llvm.org/D25955 llvm-svn: 285108
This commit is contained in:
parent
f6c4ab901b
commit
f3dda13bd2
|
@ -1950,9 +1950,6 @@ Instruction *InstCombiner::foldICmpShlConstant(ICmpInst &Cmp,
|
|||
And, Constant::getNullValue(And->getType()));
|
||||
}
|
||||
|
||||
// FIXME: This transform can create illegal types. Use the DataLayout to
|
||||
// decide when to try this?
|
||||
|
||||
// Transform (icmp pred iM (shl iM %v, N), C)
|
||||
// -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
|
||||
// Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
|
||||
|
@ -1960,7 +1957,8 @@ Instruction *InstCombiner::foldICmpShlConstant(ICmpInst &Cmp,
|
|||
// free on the target. It has the additional benefit of comparing to a
|
||||
// smaller constant, which will be target friendly.
|
||||
unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
|
||||
if (Shl->hasOneUse() && Amt != 0 && C->countTrailingZeros() >= Amt) {
|
||||
if (Shl->hasOneUse() && Amt != 0 && C->countTrailingZeros() >= Amt &&
|
||||
DL.isLegalInteger(TypeBits - Amt)) {
|
||||
Type *TruncTy = IntegerType::get(Cmp.getContext(), TypeBits - Amt);
|
||||
if (X->getType()->isVectorTy())
|
||||
TruncTy = VectorType::get(TruncTy, X->getType()->getVectorNumElements());
|
||||
|
|
|
@ -14,8 +14,8 @@ define i1 @icmp_ugt_32(i64) {
|
|||
|
||||
define i1 @icmp_ule_64(i128) {
|
||||
; CHECK-LABEL: @icmp_ule_64(
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = trunc i128 %0 to i64
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp eq i64 [[TMP2]], 0
|
||||
; CHECK-NEXT: [[C:%.*]] = shl nuw i128 %0, 64
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ult i128 [[C]], 18446744073709551616
|
||||
; CHECK-NEXT: ret i1 [[D]]
|
||||
;
|
||||
%c = shl nuw i128 %0, 64
|
||||
|
@ -34,11 +34,10 @@ define i1 @icmp_ugt_16(i64) {
|
|||
ret i1 %d
|
||||
}
|
||||
|
||||
; FIXME: InstCombine ought not to emit the potentially illegal i48.
|
||||
define <2 x i1> @icmp_ule_16x2(<2 x i64>) {
|
||||
; CHECK-LABEL: @icmp_ule_16x2(
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = trunc <2 x i64> %0 to <2 x i48>
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp eq <2 x i48> [[TMP2]], zeroinitializer
|
||||
; CHECK-NEXT: [[C:%.*]] = shl nuw <2 x i64> %0, <i64 16, i64 16>
|
||||
; CHECK-NEXT: [[D:%.*]] = icmp ult <2 x i64> [[C]], <i64 65536, i64 65536>
|
||||
; CHECK-NEXT: ret <2 x i1> [[D]]
|
||||
;
|
||||
%c = shl nuw <2 x i64> %0, <i64 16, i64 16>
|
||||
|
|
|
@ -1208,12 +1208,12 @@ define i1 @icmp_shl16(i32 %x) {
|
|||
ret i1 %cmp
|
||||
}
|
||||
|
||||
; FIXME: We shouldn't be creating illegal types like i15 in InstCombine.
|
||||
; D25952: Don't create illegal types like i15 in InstCombine
|
||||
|
||||
define i1 @icmp_shl17(i32 %x) {
|
||||
; CHECK-LABEL: @icmp_shl17(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 %x to i15
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i15 [[TMP1]], 18
|
||||
; CHECK-NEXT: [[SHL:%.*]] = shl i32 %x, 17
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[SHL]], 2359296
|
||||
; CHECK-NEXT: ret i1 [[CMP]]
|
||||
;
|
||||
%shl = shl i32 %x, 17
|
||||
|
|
Loading…
Reference in New Issue