[llvm] r318404 - [InstCombine] include 'sub' in the list of narrow-able binops

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 16 06:40:51 PST 2017


Author: spatel
Date: Thu Nov 16 06:40:51 2017
New Revision: 318404

URL: http://llvm.org/viewvc/llvm-project?rev=318404&view=rev
Log:
[InstCombine] include 'sub' in the list of narrow-able binops

      // trunc (binop X, C) --> binop (trunc X, C')
      // trunc (binop (ext X), Y) --> binop X, (trunc Y)

I'm grouping sub with the other binops  because that makes the code simpler
and the transforms are valid:
https://rise4fun.com/Alive/UeF
...so even though we don't expect a sub with constant Op1 or any of the
other opcodes with constant Op0 due to canonicalization rules, we might as
well handle those situations if non-canonical code somehow reaches this
point (it should just make instcombine more efficient in reaching its
end goal).

This should solve the problem that later manifests in the vectorizers in 
PR35295:
https://bugs.llvm.org/show_bug.cgi?id=35295


Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
    llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=318404&r1=318403&r2=318404&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Thu Nov 16 06:40:51 2017
@@ -552,8 +552,15 @@ Instruction *InstCombiner::narrowBinOp(T
   case Instruction::Or:
   case Instruction::Xor:
   case Instruction::Add:
+  case Instruction::Sub:
   case Instruction::Mul: {
     Constant *C;
+    if (match(BinOp0, m_Constant(C))) {
+      // trunc (binop C, X) --> binop (trunc C', X)
+      Constant *NarrowC = ConstantExpr::getTrunc(C, DestTy);
+      Value *TruncX = Builder.CreateTrunc(BinOp1, DestTy);
+      return BinaryOperator::Create(BinOp->getOpcode(), NarrowC, TruncX);
+    }
     if (match(BinOp1, m_Constant(C))) {
       // trunc (binop X, C) --> binop (trunc X, C')
       Constant *NarrowC = ConstantExpr::getTrunc(C, DestTy);
@@ -573,16 +580,6 @@ Instruction *InstCombiner::narrowBinOp(T
     }
     break;
   }
-  case Instruction::Sub: {
-    Constant *C;
-    if (match(BinOp0, m_Constant(C))) {
-      // trunc (binop C, X) --> binop (trunc C', X)
-      Constant *NarrowC = ConstantExpr::getTrunc(C, DestTy);
-      Value *TruncX = Builder.CreateTrunc(BinOp1, DestTy);
-      return BinaryOperator::Create(BinOp->getOpcode(), NarrowC, TruncX);
-    }
-    break;
-  }
 
   default: break;
   }

Modified: llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll?rev=318404&r1=318403&r2=318404&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll Thu Nov 16 06:40:51 2017
@@ -98,9 +98,8 @@ define i16 @narrow_zext_add(i16 %x16, i3
 
 define i16 @narrow_sext_sub(i16 %x16, i32 %y32) {
 ; CHECK-LABEL: @narrow_sext_sub(
-; CHECK-NEXT:    [[X321:%.*]] = zext i16 %x16 to i32
-; CHECK-NEXT:    [[B:%.*]] = sub i32 [[X321]], %y32
-; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
+; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
+; CHECK-NEXT:    [[R:%.*]] = sub i16 %x16, [[TMP1]]
 ; CHECK-NEXT:    ret i16 [[R]]
 ;
   %x32 = sext i16 %x16 to i32
@@ -111,9 +110,8 @@ define i16 @narrow_sext_sub(i16 %x16, i3
 
 define i16 @narrow_zext_sub(i16 %x16, i32 %y32) {
 ; CHECK-LABEL: @narrow_zext_sub(
-; CHECK-NEXT:    [[X32:%.*]] = zext i16 %x16 to i32
-; CHECK-NEXT:    [[B:%.*]] = sub i32 [[X32]], %y32
-; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
+; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
+; CHECK-NEXT:    [[R:%.*]] = sub i16 %x16, [[TMP1]]
 ; CHECK-NEXT:    ret i16 [[R]]
 ;
   %x32 = zext i16 %x16 to i32
@@ -264,9 +262,8 @@ define <2 x i16> @narrow_zext_add_commut
 define <2 x i16> @narrow_sext_sub_commute(<2 x i16> %x16, <2 x i32> %y32) {
 ; CHECK-LABEL: @narrow_sext_sub_commute(
 ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
-; CHECK-NEXT:    [[X321:%.*]] = zext <2 x i16> %x16 to <2 x i32>
-; CHECK-NEXT:    [[B:%.*]] = sub <2 x i32> [[Y32OP0]], [[X321]]
-; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
+; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
+; CHECK-NEXT:    [[R:%.*]] = sub <2 x i16> [[TMP1]], %x16
 ; CHECK-NEXT:    ret <2 x i16> [[R]]
 ;
   %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
@@ -279,9 +276,8 @@ define <2 x i16> @narrow_sext_sub_commut
 define <2 x i16> @narrow_zext_sub_commute(<2 x i16> %x16, <2 x i32> %y32) {
 ; CHECK-LABEL: @narrow_zext_sub_commute(
 ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
-; CHECK-NEXT:    [[X32:%.*]] = zext <2 x i16> %x16 to <2 x i32>
-; CHECK-NEXT:    [[B:%.*]] = sub <2 x i32> [[Y32OP0]], [[X32]]
-; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
+; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
+; CHECK-NEXT:    [[R:%.*]] = sub <2 x i16> [[TMP1]], %x16
 ; CHECK-NEXT:    ret <2 x i16> [[R]]
 ;
   %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>




More information about the llvm-commits mailing list