mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
[InstCombine] Don't blow up in foldICmpWithCastAndCast on vector icmp instructions.
Summary: Presently, InstCombiner::foldICmpWithCastAndCast() implicitly assumes that it is only invoked with icmp instructions of integer type. If that assumption is broken, and it is called with an icmp of vector type, then it fails (asserts/crashes). This patch addresses the deficiency. It allows it to simplify icmp (ptrtoint x), (ptrtoint/c) of vector type into a compare of the inputs, much as is done when the type is integer. Reviewers: apilipenko, fedor.sergeev, mkazantsev, anna Reviewed By: anna Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D44063 llvm-svn: 326730
This commit is contained in:
parent
9741899771
commit
33418abafa
@ -3408,8 +3408,15 @@ Instruction *InstCombiner::foldICmpWithCastAndCast(ICmpInst &ICmp) {
|
||||
|
||||
// Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
|
||||
// integer type is the same size as the pointer type.
|
||||
const auto& CompatibleSizes = [&](Type* SrcTy, Type* DestTy) -> bool {
|
||||
if (isa<VectorType>(SrcTy)) {
|
||||
SrcTy = cast<VectorType>(SrcTy)->getElementType();
|
||||
DestTy = cast<VectorType>(DestTy)->getElementType();
|
||||
}
|
||||
return DL.getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth();
|
||||
};
|
||||
if (LHSCI->getOpcode() == Instruction::PtrToInt &&
|
||||
DL.getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth()) {
|
||||
CompatibleSizes(SrcTy, DestTy)) {
|
||||
Value *RHSOp = nullptr;
|
||||
if (auto *RHSC = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
|
||||
Value *RHSCIOp = RHSC->getOperand(0);
|
||||
|
@ -3302,3 +3302,15 @@ define i1 @PR35794(i32* %a) {
|
||||
ret i1 %cmp
|
||||
}
|
||||
|
||||
; Don't crash by assuming the compared values are integers.
|
||||
define <2 x i1> @PR36583(<2 x i8*>) {
|
||||
; CHECK-LABEL: @PR36583(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[RES:%.*]] = icmp eq <2 x i8*> %0, zeroinitializer
|
||||
; CHECK-NEXT: ret <2 x i1> [[RES]]
|
||||
;
|
||||
entry:
|
||||
%cast = ptrtoint <2 x i8*> %0 to <2 x i64>
|
||||
%res = icmp eq <2 x i64> %cast, zeroinitializer
|
||||
ret <2 x i1> %res
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user