mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-16 11:08:09 +00:00
Fix lint assert on integer vector division
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189290 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
63ae7c9aec
commit
e3e5f77d77
@ -504,14 +504,42 @@ void Lint::visitShl(BinaryOperator &I) {
|
|||||||
"Undefined result: Shift count out of range", &I);
|
"Undefined result: Shift count out of range", &I);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isZero(Value *V, DataLayout *TD) {
|
static bool isZero(Value *V, DataLayout *DL) {
|
||||||
// Assume undef could be zero.
|
// Assume undef could be zero.
|
||||||
if (isa<UndefValue>(V)) return true;
|
if (isa<UndefValue>(V))
|
||||||
|
return true;
|
||||||
|
|
||||||
unsigned BitWidth = cast<IntegerType>(V->getType())->getBitWidth();
|
VectorType *VecTy = dyn_cast<VectorType>(V->getType());
|
||||||
APInt KnownZero(BitWidth, 0), KnownOne(BitWidth, 0);
|
if (!VecTy) {
|
||||||
ComputeMaskedBits(V, KnownZero, KnownOne, TD);
|
unsigned BitWidth = V->getType()->getIntegerBitWidth();
|
||||||
return KnownZero.isAllOnesValue();
|
APInt KnownZero(BitWidth, 0), KnownOne(BitWidth, 0);
|
||||||
|
ComputeMaskedBits(V, KnownZero, KnownOne, DL);
|
||||||
|
return KnownZero.isAllOnesValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Per-component check doesn't work with zeroinitializer
|
||||||
|
Constant *C = dyn_cast<Constant>(V);
|
||||||
|
if (!C)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (C->isZeroValue())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// For a vector, KnownZero will only be true if all values are zero, so check
|
||||||
|
// this per component
|
||||||
|
unsigned BitWidth = VecTy->getElementType()->getIntegerBitWidth();
|
||||||
|
for (unsigned I = 0, N = VecTy->getNumElements(); I != N; ++I) {
|
||||||
|
Constant *Elem = C->getAggregateElement(I);
|
||||||
|
if (isa<UndefValue>(Elem))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
APInt KnownZero(BitWidth, 0), KnownOne(BitWidth, 0);
|
||||||
|
ComputeMaskedBits(Elem, KnownZero, KnownOne, DL);
|
||||||
|
if (KnownZero.isAllOnesValue())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Lint::visitSDiv(BinaryOperator &I) {
|
void Lint::visitSDiv(BinaryOperator &I) {
|
||||||
|
78
test/Analysis/Lint/check-zero-divide.ll
Normal file
78
test/Analysis/Lint/check-zero-divide.ll
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
; RUN: opt -lint -disable-output %s 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_sdiv(<2 x i32> %a) nounwind {
|
||||||
|
%b = sdiv <2 x i32> %a, <i32 5, i32 8>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_srem(<2 x i32> %a) nounwind {
|
||||||
|
%b = srem <2 x i32> %a, <i32 5, i32 8>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_udiv(<2 x i32> %a) nounwind {
|
||||||
|
%b = udiv <2 x i32> %a, <i32 5, i32 8>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_urem(<2 x i32> %a) nounwind {
|
||||||
|
%b = urem <2 x i32> %a, <i32 5, i32 8>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @use_sdiv_by_zero(i32 %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv i32 %a, 0
|
||||||
|
%b = sdiv i32 %a, 0
|
||||||
|
ret i32 %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @use_sdiv_by_zeroinitializer(i32 %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv i32 %a, 0
|
||||||
|
%b = sdiv i32 %a, zeroinitializer
|
||||||
|
ret i32 %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_sdiv_by_zero_x(<2 x i32> %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv <2 x i32> %a, <i32 0, i32 5>
|
||||||
|
%b = sdiv <2 x i32> %a, <i32 0, i32 5>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_sdiv_by_zero_y(<2 x i32> %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv <2 x i32> %a, <i32 4, i32 0>
|
||||||
|
%b = sdiv <2 x i32> %a, <i32 4, i32 0>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_sdiv_by_zero_xy(<2 x i32> %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv <2 x i32> %a, zeroinitializer
|
||||||
|
%b = sdiv <2 x i32> %a, <i32 0, i32 0>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_sdiv_by_undef_x(<2 x i32> %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv <2 x i32> %a, <i32 undef, i32 5>
|
||||||
|
%b = sdiv <2 x i32> %a, <i32 undef, i32 5>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_sdiv_by_undef_y(<2 x i32> %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv <2 x i32> %a, <i32 5, i32 undef>
|
||||||
|
%b = sdiv <2 x i32> %a, <i32 5, i32 undef>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
||||||
|
define <2 x i32> @use_vector_sdiv_by_undef_xy(<2 x i32> %a) nounwind {
|
||||||
|
; CHECK: Undefined behavior: Division by zero
|
||||||
|
; CHECK-NEXT: %b = sdiv <2 x i32> %a, undef
|
||||||
|
%b = sdiv <2 x i32> %a, <i32 undef, i32 undef>
|
||||||
|
ret <2 x i32> %b
|
||||||
|
}
|
||||||
|
|
1
test/Analysis/Lint/lit.local.cfg
Normal file
1
test/Analysis/Lint/lit.local.cfg
Normal file
@ -0,0 +1 @@
|
|||||||
|
config.suffixes = ['.ll']
|
Loading…
x
Reference in New Issue
Block a user