[llvm] r341292 - [InstCombine] allow not+sub fold for arbitrary vector constants

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 2 12:31:45 PDT 2018


Author: spatel
Date: Sun Sep  2 12:31:45 2018
New Revision: 341292

URL: http://llvm.org/viewvc/llvm-project?rev=341292&view=rev
Log:
[InstCombine] allow not+sub fold for arbitrary vector constants

The fold was implemented for the general case but use-limitation,
but the later constant version which didn't check uses was only
matching splat constants.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
    llvm/trunk/test/Transforms/InstCombine/not.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp?rev=341292&r1=341291&r2=341292&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp Sun Sep  2 12:31:45 2018
@@ -2673,8 +2673,9 @@ Instruction *InstCombiner::visitXor(Bina
     }
 
     // ~(X - Y) --> ~X + Y
-    if (match(NotVal, m_OneUse(m_Sub(m_Value(X), m_Value(Y)))))
-      return BinaryOperator::CreateAdd(Builder.CreateNot(X), Y);
+    if (match(NotVal, m_Sub(m_Value(X), m_Value(Y))))
+      if (isa<Constant>(X) || NotVal->hasOneUse())
+        return BinaryOperator::CreateAdd(Builder.CreateNot(X), Y);
 
     // ~(~X >>s Y) --> (X >>s Y)
     if (match(NotVal, m_AShr(m_Not(m_Value(X)), m_Value(Y))))
@@ -2713,18 +2714,13 @@ Instruction *InstCombiner::visitXor(Bina
       Value *X;
       const APInt *C;
       if (match(Op0, m_Sub(m_APInt(C), m_Value(X)))) {
-        // ~(c-X) == X-c-1 == X+(-c-1)
-        if (RHSC->isAllOnesValue()) {
-          Constant *NewC = ConstantInt::get(I.getType(), -(*C) - 1);
-          return BinaryOperator::CreateAdd(X, NewC);
-        }
         if (RHSC->isSignMask()) {
           // (C - X) ^ signmask -> (C + signmask - X)
           Constant *NewC = ConstantInt::get(I.getType(), *C + *RHSC);
           return BinaryOperator::CreateSub(NewC, X);
         }
       } else if (match(Op0, m_Add(m_Value(X), m_APInt(C)))) {
-        // ~(X-c) --> (-c-1)-X
+        // ~(X + C) --> (-C - 1) - X
         if (RHSC->isAllOnesValue()) {
           Constant *NewC = ConstantInt::get(I.getType(), -(*C) - 1);
           return BinaryOperator::CreateSub(NewC, X);

Modified: llvm/trunk/test/Transforms/InstCombine/not.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/not.ll?rev=341292&r1=341291&r2=341292&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/not.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/not.ll Sun Sep  2 12:31:45 2018
@@ -210,7 +210,7 @@ define <2 x i32> @not_sub_extra_use_vec(
 ; CHECK-LABEL: @not_sub_extra_use_vec(
 ; CHECK-NEXT:    [[S:%.*]] = sub <2 x i32> <i32 123, i32 42>, [[Y:%.*]]
 ; CHECK-NEXT:    store <2 x i32> [[S]], <2 x i32>* [[P:%.*]], align 8
-; CHECK-NEXT:    [[R:%.*]] = xor <2 x i32> [[S]], <i32 -1, i32 -1>
+; CHECK-NEXT:    [[R:%.*]] = add <2 x i32> [[Y]], <i32 -124, i32 -43>
 ; CHECK-NEXT:    ret <2 x i32> [[R]]
 ;
   %s = sub <2 x i32> <i32 123, i32 42>, %y




More information about the llvm-commits mailing list