mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
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 llvm-svn: 249442
This commit is contained in:
parent
b8e4e8fa60
commit
dd55dd6aa8
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user