[llvm] r249442 - Fix pr25040 - Handle vectors of i1s in recently added implication code

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 6 12:00:02 PDT 2015


Author: reames
Date: Tue Oct  6 14:00:02 2015
New Revision: 249442

URL: http://llvm.org/viewvc/llvm-project?rev=249442&view=rev
Log:
Fix pr25040 - Handle vectors of i1s in recently added implication code

As mentioned in the bug, I'd missed the presence of a getScalarType in the caller of the new implies method. As a result, when we ended up with a implication over two vectors, we'd trip an assert and crash.

Differential Revision: http://reviews.llvm.org/D13441



Modified:
    llvm/trunk/lib/Analysis/InstructionSimplify.cpp
    llvm/trunk/test/Transforms/InstSimplify/implies.ll

Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=249442&r1=249441&r2=249442&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Tue Oct  6 14:00:02 2015
@@ -2129,19 +2129,26 @@ static Constant *computePointerICmp(cons
 }
 
 /// Return true if B is known to be implied by A.  A & B must be i1 (boolean)
-/// values. Note that the truth table for implication is the same as <=u on i1
-/// values (but not <=s!).  The truth table for both is:
+/// values or a vector of such values. Note that the truth table for
+/// implication is the same as <=u on i1 values (but not <=s!).  The truth
+/// table for both is: 
 ///    | T | F (B)
 ///  T | T | F
 ///  F | T | T
 /// (A)
 static bool implies(Value *A, Value *B) {
-  // TODO: Consider extending this to vector of i1?
-  assert(A->getType()->isIntegerTy(1) && B->getType()->isIntegerTy(1));
+  assert(A->getType() == B->getType() && "mismatched type");
+  Type *OpTy = A->getType();
+  assert(OpTy->getScalarType()->isIntegerTy(1));
   
   // A ==> A by definition
   if (A == B) return true;
 
+  if (OpTy->isVectorTy())
+    // TODO: extending the code below to handle vectors
+    return false;
+  assert(OpTy->isIntegerTy(1) && "implied by above");
+
   ICmpInst::Predicate APred, BPred;
   Value *I;
   Value *L;

Modified: llvm/trunk/test/Transforms/InstSimplify/implies.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/implies.ll?rev=249442&r1=249441&r2=249442&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/implies.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/implies.ll Tue Oct  6 14:00:02 2015
@@ -75,3 +75,19 @@ define i1 @test4(i32 %length.i, i32 %i)
   %res = icmp ule i1 %var30, %var29
   ret i1 %res
 }
+
+; A ==> A for vectors
+define <4 x i1> @test5(<4 x i1> %vec) {
+; CHECK-LABEL: @test5
+; CHECK: ret <4 x i1> <i1 true, i1 true, i1 true, i1 true>
+  %res = icmp ule <4 x i1> %vec, %vec
+  ret <4 x i1> %res
+}
+
+; Don't crash on vector inputs - pr25040
+define <4 x i1> @test6(<4 x i1> %a, <4 x i1> %b) {
+; CHECK-LABEL: @test6
+; CHECK: ret <4 x i1> %res
+  %res = icmp ule <4 x i1> %a, %b
+  ret <4 x i1> %res
+}




More information about the llvm-commits mailing list