[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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354576 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/InferAddressSpaces.cpp b/lib/Transforms/Scalar/InferAddressSpaces.cpp
index 14fa24b..8f5ddf7 100644
--- a/lib/Transforms/Scalar/InferAddressSpaces.cpp
+++ b/lib/Transforms/Scalar/InferAddressSpaces.cpp
@@ -217,13 +217,16 @@
if (!isa<Operator>(V))
return false;
- switch (cast<Operator>(V).getOpcode()) {
+ const Operator &Op = cast<Operator>(V);
+ switch (Op.getOpcode()) {
case Instruction::PHI:
+ assert(Op.getType()->isPointerTy());
case Instruction::BitCast:
case Instruction::AddrSpaceCast:
case Instruction::GetElementPtr:
- case Instruction::Select:
return true;
+ case Instruction::Select:
+ return Op.getType()->isPointerTy();
default:
return false;
}
diff --git a/test/Transforms/InferAddressSpaces/AMDGPU/infer-address-space.ll b/test/Transforms/InferAddressSpaces/AMDGPU/infer-address-space.ll
index 3096d81..2f6d2b8 100644
--- a/test/Transforms/InferAddressSpaces/AMDGPU/infer-address-space.ll
+++ b/test/Transforms/InferAddressSpaces/AMDGPU/infer-address-space.ll
@@ -168,6 +168,15 @@
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 @use(float) #0