[PATCH] D72412: [InstSimplify] select Cond, true, false --> Cond

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 8 13:37:09 PST 2020


spatel created this revision.
spatel added reviewers: lebedev.ri, nlopes, aqjune.
Herald added subscribers: hiraditya, mcrosier.
Herald added a project: LLVM.

This is step 1 of damage control assuming that we need to remove several over-reaching folds for select-of-booleans because they can cause miscompiles as shown in D72396 <https://reviews.llvm.org/D72396>.

The scalar case seems obviously safe:
https://rise4fun.com/Alive/jSj

And I don't think there's any danger for vectors either - if the condition is poisoned, then the select must be poisoned too, so undef elements don't make any difference.


https://reviews.llvm.org/D72412

Files:
  llvm/lib/Analysis/InstructionSimplify.cpp
  llvm/test/Transforms/InstSimplify/select.ll


Index: llvm/test/Transforms/InstSimplify/select.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/select.ll
+++ llvm/test/Transforms/InstSimplify/select.ll
@@ -3,8 +3,7 @@
 
 define i1 @bool_true_or_false(i1 %cond) {
 ; CHECK-LABEL: @bool_true_or_false(
-; CHECK-NEXT:    [[S:%.*]] = select i1 [[COND:%.*]], i1 true, i1 false
-; CHECK-NEXT:    ret i1 [[S]]
+; CHECK-NEXT:    ret i1 [[COND:%.*]]
 ;
   %s = select i1 %cond, i1 true, i1 false
   ret i1 %s
@@ -12,8 +11,7 @@
 
 define <2 x i1> @bool_true_or_false_vec(<2 x i1> %cond) {
 ; CHECK-LABEL: @bool_true_or_false_vec(
-; CHECK-NEXT:    [[S:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i1> <i1 true, i1 true>, <2 x i1> zeroinitializer
-; CHECK-NEXT:    ret <2 x i1> [[S]]
+; CHECK-NEXT:    ret <2 x i1> [[COND:%.*]]
 ;
   %s = select <2 x i1> %cond, <2 x i1> <i1 true, i1 true>, <2 x i1> zeroinitializer
   ret <2 x i1> %s
@@ -21,8 +19,7 @@
 
 define <2 x i1> @bool_true_or_false_vec_undef(<2 x i1> %cond) {
 ; CHECK-LABEL: @bool_true_or_false_vec_undef(
-; CHECK-NEXT:    [[S:%.*]] = select <2 x i1> [[COND:%.*]], <2 x i1> <i1 undef, i1 true>, <2 x i1> <i1 false, i1 undef>
-; CHECK-NEXT:    ret <2 x i1> [[S]]
+; CHECK-NEXT:    ret <2 x i1> [[COND:%.*]]
 ;
   %s = select <2 x i1> %cond, <2 x i1> <i1 undef, i1 true>, <2 x i1> <i1 false, i1 undef>
   ret <2 x i1> %s
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -3996,6 +3996,15 @@
       return FalseVal;
   }
 
+  // select i1 Cond, i1 true, i1 false --> i1 Cond
+  assert(Cond->getType()->isIntOrIntVectorTy(1) &&
+         "Select must have bool or bool vector condition");
+  assert(TrueVal->getType() == FalseVal->getType() &&
+         "Select must have same types for true/false ops");
+  if (Cond->getType() == TrueVal->getType() &&
+      match(TrueVal, m_One()) && match(FalseVal, m_ZeroInt()))
+    return Cond;
+
   // select ?, X, X -> X
   if (TrueVal == FalseVal)
     return TrueVal;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D72412.236897.patch
Type: text/x-patch
Size: 2132 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200108/f84b9437/attachment.bin>


More information about the llvm-commits mailing list