[InferAddressSpaces] Fix crash on select of non-ptr operands

Check the operands of a select are pointers, to determine if it is an address
expression or not.

https://reviews.llvm.org/D58226

llvm-svn: 354576
This commit is contained in:
Joey Gouly 2019-02-21 12:31:36 +00:00
parent e6b338cbef
commit 92af1360f3
2 changed files with 14 additions and 2 deletions

View File

@ -217,13 +217,16 @@ static bool isAddressExpression(const Value &V) {
if (!isa<Operator>(V)) if (!isa<Operator>(V))
return false; return false;
switch (cast<Operator>(V).getOpcode()) { const Operator &Op = cast<Operator>(V);
switch (Op.getOpcode()) {
case Instruction::PHI: case Instruction::PHI:
assert(Op.getType()->isPointerTy());
case Instruction::BitCast: case Instruction::BitCast:
case Instruction::AddrSpaceCast: case Instruction::AddrSpaceCast:
case Instruction::GetElementPtr: case Instruction::GetElementPtr:
case Instruction::Select:
return true; return true;
case Instruction::Select:
return Op.getType()->isPointerTy();
default: default:
return false; return false;
} }

View File

@ -168,6 +168,15 @@ exit: ; preds = %loop
ret void ret void
} }
; CHECK-LABEL: @select_bug(
; CHECK: %add.ptr157 = getelementptr inbounds i64, i64* undef, i64 select (i1 icmp ne (i32* inttoptr (i64 4873 to i32*), i32* null), i64 73, i64 93)
; CHECK: %cmp169 = icmp uge i64* undef, %add.ptr157
define void @select_bug() #0 {
%add.ptr157 = getelementptr inbounds i64, i64* undef, i64 select (i1 icmp ne (i32* inttoptr (i64 4873 to i32*), i32* null), i64 73, i64 93)
%cmp169 = icmp uge i64* undef, %add.ptr157
unreachable
}
declare void @llvm.amdgcn.s.barrier() #1 declare void @llvm.amdgcn.s.barrier() #1
declare void @use(float) #0 declare void @use(float) #0