mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[ConstantFolding] Don't create illegal (non-integral) inttoptrs
Reviewers: majnemer, arsenm Subscribers: mcrosier, llvm-commits Differential Revision: https://reviews.llvm.org/D23182 llvm-svn: 277854
This commit is contained in:
parent
ad0f97a7d9
commit
3c9e97ad45
@ -828,7 +828,9 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP,
|
||||
}
|
||||
}
|
||||
|
||||
if (Ptr->isNullValue() || BasePtr != 0) {
|
||||
auto *PTy = cast<PointerType>(Ptr->getType());
|
||||
if ((Ptr->isNullValue() || BasePtr != 0) &&
|
||||
!DL.isNonIntegralPointerType(PTy)) {
|
||||
Constant *C = ConstantInt::get(Ptr->getContext(), Offset + BasePtr);
|
||||
return ConstantExpr::getIntToPtr(C, ResTy);
|
||||
}
|
||||
@ -837,8 +839,7 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP,
|
||||
// we eliminate over-indexing of the notional static type array bounds.
|
||||
// This makes it easy to determine if the getelementptr is "inbounds".
|
||||
// Also, this helps GlobalOpt do SROA on GlobalVariables.
|
||||
Type *Ty = Ptr->getType();
|
||||
assert(Ty->isPointerTy() && "Forming regular GEP of non-pointer type");
|
||||
Type *Ty = PTy;
|
||||
SmallVector<Constant *, 32> NewIdxs;
|
||||
|
||||
do {
|
||||
|
20
test/Transforms/InstCombine/non-integral-pointers.ll
Normal file
20
test/Transforms/InstCombine/non-integral-pointers.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: opt -instcombine -S < %s | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define i8 addrspace(4)* @f_0() {
|
||||
; CHECK-LABEL: @f_0(
|
||||
; CHECK: ret i8 addrspace(4)* getelementptr (i8, i8 addrspace(4)* null, i64 50)
|
||||
%result = getelementptr i8, i8 addrspace(4)* null, i64 50
|
||||
ret i8 addrspace(4)* %result
|
||||
}
|
||||
|
||||
define i8 addrspace(3)* @f_1() {
|
||||
; inttoptr is fine here since addrspace(3) is integral.
|
||||
|
||||
; CHECK-LABEL: @f_1(
|
||||
; CHECK: ret i8 addrspace(3)* inttoptr (i64 50 to i8 addrspace(3)*)
|
||||
%result = getelementptr i8, i8 addrspace(3)* null, i64 50
|
||||
ret i8 addrspace(3)* %result
|
||||
}
|
Loading…
Reference in New Issue
Block a user