Index: lib/Analysis/InstructionSimplify.cpp =================================================================== --- lib/Analysis/InstructionSimplify.cpp +++ lib/Analysis/InstructionSimplify.cpp @@ -2129,19 +2129,26 @@ } /// 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; Index: test/Transforms/InstSimplify/implies.ll =================================================================== --- test/Transforms/InstSimplify/implies.ll +++ test/Transforms/InstSimplify/implies.ll @@ -75,3 +75,19 @@ %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> + %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 +}