[llvm] r285108 - [InstCombine] Ensure that truncated int types are legal.

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 25 13:11:47 PDT 2016


Author: spatel
Date: Tue Oct 25 15:11:47 2016
New Revision: 285108

URL: http://llvm.org/viewvc/llvm-project?rev=285108&view=rev
Log:
[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

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
    llvm/trunk/test/Transforms/InstCombine/icmp-shl-nuw.ll
    llvm/trunk/test/Transforms/InstCombine/icmp.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=285108&r1=285107&r2=285108&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Tue Oct 25 15:11:47 2016
@@ -1950,9 +1950,6 @@ Instruction *InstCombiner::foldICmpShlCo
                         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::foldICmpShlCo
   // 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());

Modified: llvm/trunk/test/Transforms/InstCombine/icmp-shl-nuw.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp-shl-nuw.ll?rev=285108&r1=285107&r2=285108&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/icmp-shl-nuw.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/icmp-shl-nuw.ll Tue Oct 25 15:11:47 2016
@@ -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>

Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=285108&r1=285107&r2=285108&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Tue Oct 25 15:11:47 2016
@@ -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




More information about the llvm-commits mailing list