[llvm] 0752fb5 - [InstSimplify] Fold (X || Y) ? false : X --> false

via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 29 06:09:07 PST 2022


Author: chenglin.bi
Date: 2022-11-29T22:08:50+08:00
New Revision: 0752fb57e4915ad13cb83439a35313c4007addc4

URL: https://github.com/llvm/llvm-project/commit/0752fb57e4915ad13cb83439a35313c4007addc4
DIFF: https://github.com/llvm/llvm-project/commit/0752fb57e4915ad13cb83439a35313c4007addc4.diff

LOG: [InstSimplify] Fold (X || Y) ? false : X --> false

(X || Y) ? false : X --> false
https://alive2.llvm.org/ce/z/y93yUm

Reviewed By: spatel

Differential Revision: https://reviews.llvm.org/D138700

Added: 
    

Modified: 
    llvm/lib/Analysis/InstructionSimplify.cpp
    llvm/test/Transforms/InstSimplify/select-logical.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 0db6b85318ddd..6bb0b94fd1930 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4555,9 +4555,14 @@ static Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
     if (match(TrueVal, m_One()) && match(FalseVal, m_ZeroInt()))
       return Cond;
 
-    // (X || Y) && (X || !Y) --> X (commuted 8 ways)
+    // (X || Y) ? false : X --> false (commuted 2 ways)
+    if (match(Cond, m_c_LogicalOr(m_Specific(FalseVal), m_Value())) &&
+        match(TrueVal, m_ZeroInt()))
+      return ConstantInt::getFalse(Cond->getType());
+
     Value *X, *Y;
     if (match(FalseVal, m_ZeroInt())) {
+      // (X || Y) && (X || !Y) --> X (commuted 8 ways)
       if (match(Cond, m_c_LogicalOr(m_Value(X), m_Not(m_Value(Y)))) &&
           match(TrueVal, m_c_LogicalOr(m_Specific(X), m_Specific(Y))))
         return X;

diff  --git a/llvm/test/Transforms/InstSimplify/select-logical.ll b/llvm/test/Transforms/InstSimplify/select-logical.ll
index 7cabf38aed090..61c108fa206a1 100644
--- a/llvm/test/Transforms/InstSimplify/select-logical.ll
+++ b/llvm/test/Transforms/InstSimplify/select-logical.ll
@@ -289,98 +289,85 @@ define i1 @logical_not_or_and_negative1(i1 %x, i1 %y, i1 %z) {
 }
 
 
-; (X | Y) ? false && X --> false
+; (X | Y) ? false : X --> false
 
 define i1 @or_select_false_x_case1(i1 %x, i1 %y) {
 ; CHECK-LABEL: @or_select_false_x_case1(
-; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[OR]], i1 false, i1 [[X]]
-; CHECK-NEXT:    ret i1 [[R]]
+; CHECK-NEXT:    ret i1 false
 ;
   %or = or i1 %x, %y
   %r = select i1 %or, i1 false, i1 %x
   ret i1 %r
 }
 
-; (X | Y) ? false && X --> false
+; (X | Y) ? false : X --> false
 
 define i1 @or_select_false_x_case2(i1 %x, i1 %y) {
 ; CHECK-LABEL: @or_select_false_x_case2(
-; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[OR]], i1 false, i1 [[Y]]
-; CHECK-NEXT:    ret i1 [[R]]
+; CHECK-NEXT:    ret i1 false
 ;
   %or = or i1 %x, %y
   %r = select i1 %or, i1 false, i1 %y
   ret i1 %r
 }
 
-; vector case (X | Y) ? false && X --> false
+; vector case (X | Y) ? false : X --> false
 
 define <2 x i1> @or_select_false_x_vector(<2 x i1> %x, <2 x i1> %y) {
 ; CHECK-LABEL: @or_select_false_x_vector(
-; CHECK-NEXT:    [[OR:%.*]] = or <2 x i1> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[OR]], <2 x i1> zeroinitializer, <2 x i1> [[X]]
-; CHECK-NEXT:    ret <2 x i1> [[R]]
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
 ;
   %or = or <2 x i1> %x, %y
   %r = select <2 x i1> %or, <2 x i1> <i1 false, i1 false>, <2 x i1> %x
   ret <2 x i1> %r
 }
 
-; vector poison case (X | Y) ? false && X --> false
+; vector poison case (X | Y) ? false : X --> false
 
 define <2 x i1> @or_select_false_x_vector_poison(<2 x i1> %x, <2 x i1> %y) {
 ; CHECK-LABEL: @or_select_false_x_vector_poison(
-; CHECK-NEXT:    [[OR:%.*]] = or <2 x i1> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[OR]], <2 x i1> <i1 poison, i1 false>, <2 x i1> [[X]]
-; CHECK-NEXT:    ret <2 x i1> [[R]]
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
 ;
   %or = or <2 x i1> %x, %y
   %r = select <2 x i1> %or, <2 x i1> <i1 poison, i1 false>, <2 x i1> %x
   ret <2 x i1> %r
 }
 
-; (X || Y) ? false && X --> false
+; (X || Y) ? false : X --> false
 
 define i1 @logical_or_select_false_x_case1(i1 %x, i1 %y) {
 ; CHECK-LABEL: @logical_or_select_false_x_case1(
-; CHECK-NEXT:    [[OR:%.*]] = select i1 [[X:%.*]], i1 true, i1 [[Y:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[OR]], i1 false, i1 [[X]]
-; CHECK-NEXT:    ret i1 [[R]]
+; CHECK-NEXT:    ret i1 false
 ;
   %or = select i1 %x, i1 true, i1 %y
   %r = select i1 %or, i1 false, i1 %x
   ret i1 %r
 }
 
-; (X || Y) ? false && X --> false
+; (X || Y) ? false : X --> false
 
 define i1 @logical_or_select_false_x_case2(i1 %x, i1 %y) {
 ; CHECK-LABEL: @logical_or_select_false_x_case2(
-; CHECK-NEXT:    [[OR:%.*]] = select i1 [[Y:%.*]], i1 true, i1 [[X:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[OR]], i1 false, i1 [[X]]
-; CHECK-NEXT:    ret i1 [[R]]
+; CHECK-NEXT:    ret i1 false
 ;
   %or = select i1 %y, i1 true, i1 %x
   %r = select i1 %or, i1 false, i1 %x
   ret i1 %r
 }
 
-; vector case (X || Y) ? false && X --> false
+; vector case (X || Y) ? false : X --> false
 
 define <2 x i1> @logical_or_select_false_x_vector(<2 x i1> %x, <2 x i1> %y) {
 ; CHECK-LABEL: @logical_or_select_false_x_vector(
-; CHECK-NEXT:    [[OR:%.*]] = select <2 x i1> [[Y:%.*]], <2 x i1> <i1 true, i1 true>, <2 x i1> [[X:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[OR]], <2 x i1> zeroinitializer, <2 x i1> [[X]]
-; CHECK-NEXT:    ret <2 x i1> [[R]]
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
 ;
   %or = select <2 x i1> %y, <2 x i1> <i1 true, i1 true>, <2 x i1> %x
   %r = select <2 x i1> %or, <2 x i1> <i1 false, i1 false>, <2 x i1> %x
   ret <2 x i1> %r
 }
 
-; vector poison case (X || Y) ? false && X --> false
+; TODO: this could transform to false
+; vector poison case (X || Y) ? false : X --> false
 
 define <2 x i1> @logical_or_select_false_x_vector_poison1(<2 x i1> %x, <2 x i1> %y) {
 ; CHECK-LABEL: @logical_or_select_false_x_vector_poison1(
@@ -393,13 +380,11 @@ define <2 x i1> @logical_or_select_false_x_vector_poison1(<2 x i1> %x, <2 x i1>
   ret <2 x i1> %r
 }
 
-; vector poison case (X || Y) ? false && X --> false
+; vector poison case (X || Y) ? false : X --> false
 
 define <2 x i1> @logical_or_select_false_x_vector_poison2(<2 x i1> %x, <2 x i1> %y) {
 ; CHECK-LABEL: @logical_or_select_false_x_vector_poison2(
-; CHECK-NEXT:    [[OR:%.*]] = select <2 x i1> [[Y:%.*]], <2 x i1> <i1 true, i1 true>, <2 x i1> [[X:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[OR]], <2 x i1> <i1 poison, i1 false>, <2 x i1> [[X]]
-; CHECK-NEXT:    ret <2 x i1> [[R]]
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
 ;
   %or = select <2 x i1> %y, <2 x i1> <i1 true, i1 true>, <2 x i1> %x
   %r = select <2 x i1> %or, <2 x i1> <i1 poison, i1 false>, <2 x i1> %x


        


More information about the llvm-commits mailing list