From 52098de6407acfc9311893a3867a349acc2aaf26 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Tue, 6 Oct 2015 19:00:02 +0000 Subject: [PATCH] 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249442 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/InstructionSimplify.cpp | 15 +++++++++++---- test/Transforms/InstSimplify/implies.ll | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index c8a13c79f57..8175fbd76d6 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -2129,19 +2129,26 @@ static Constant *computePointerICmp(const DataLayout &DL, } /// 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; diff --git a/test/Transforms/InstSimplify/implies.ll b/test/Transforms/InstSimplify/implies.ll index 19e61930d75..80b6ac810d0 100644 --- a/test/Transforms/InstSimplify/implies.ll +++ b/test/Transforms/InstSimplify/implies.ll @@ -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> + %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 +} -- 2.34.1