mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-18 13:16:24 -04:00
InstCombine: Fix crash on icmp of gep with addrspacecasted null
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371146 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -929,8 +929,8 @@ Instruction *InstCombiner::foldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
|
||||
Base = Builder.CreateVectorSplat(NumElts, Base);
|
||||
}
|
||||
return new ICmpInst(Cond, Base,
|
||||
ConstantExpr::getBitCast(cast<Constant>(RHS),
|
||||
Base->getType()));
|
||||
ConstantExpr::getPointerBitCastOrAddrSpaceCast(
|
||||
cast<Constant>(RHS), Base->getType()));
|
||||
} else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
|
||||
// If the base pointers are different, but the indices are the same, just
|
||||
// compare the base pointer.
|
||||
|
||||
@@ -206,3 +206,31 @@ entry:
|
||||
%cnd = icmp eq i8 addrspace(2)* %gep, null
|
||||
ret i1 %cnd
|
||||
}
|
||||
|
||||
; Test for an assert from trying to create an invalid constantexpr
|
||||
; bitcast between different address spaces. The addrspacecast is
|
||||
; stripped off and the addrspace(0) null can be treated as invalid.
|
||||
; FIXME: This should be able to fold to ret i1 false
|
||||
define i1 @invalid_bitcast_icmp_addrspacecast_as0_null(i32 addrspace(5)* %ptr) {
|
||||
; CHECK-LABEL: @invalid_bitcast_icmp_addrspacecast_as0_null(
|
||||
; CHECK-NEXT: bb:
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 addrspace(5)* [[PTR:%.*]], addrspacecast (i32* null to i32 addrspace(5)*)
|
||||
; CHECK-NEXT: ret i1 [[TMP2]]
|
||||
;
|
||||
bb:
|
||||
%tmp1 = getelementptr inbounds i32, i32 addrspace(5)* %ptr, i32 1
|
||||
%tmp2 = icmp eq i32 addrspace(5)* %tmp1, addrspacecast (i32* null to i32 addrspace(5)*)
|
||||
ret i1 %tmp2
|
||||
}
|
||||
|
||||
define i1 @invalid_bitcast_icmp_addrspacecast_as0_null_var(i32 addrspace(5)* %ptr, i32 %idx) {
|
||||
; CHECK-LABEL: @invalid_bitcast_icmp_addrspacecast_as0_null_var(
|
||||
; CHECK-NEXT: bb:
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 addrspace(5)* [[PTR:%.*]], addrspacecast (i32* null to i32 addrspace(5)*)
|
||||
; CHECK-NEXT: ret i1 [[TMP2]]
|
||||
;
|
||||
bb:
|
||||
%tmp1 = getelementptr inbounds i32, i32 addrspace(5)* %ptr, i32 %idx
|
||||
%tmp2 = icmp eq i32 addrspace(5)* %tmp1, addrspacecast (i32* null to i32 addrspace(5)*)
|
||||
ret i1 %tmp2
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user