forked from OSchip/llvm-project
Fix another constant folding address space place I missed.
This fixes an assertion failure with a different sized address space. llvm-svn: 194014
This commit is contained in:
parent
243140f2fd
commit
a8e894405c
|
@ -224,7 +224,8 @@ static bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
|
|||
APInt &Offset, const DataLayout &TD) {
|
||||
// Trivial case, constant is the global.
|
||||
if ((GV = dyn_cast<GlobalValue>(C))) {
|
||||
Offset.clearAllBits();
|
||||
unsigned BitWidth = TD.getPointerTypeSizeInBits(GV->getType());
|
||||
Offset = APInt(BitWidth, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -238,16 +239,23 @@ static bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
|
|||
return IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD);
|
||||
|
||||
// i32* getelementptr ([5 x i32]* @a, i32 0, i32 5)
|
||||
if (GEPOperator *GEP = dyn_cast<GEPOperator>(CE)) {
|
||||
// If the base isn't a global+constant, we aren't either.
|
||||
if (!IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD))
|
||||
return false;
|
||||
GEPOperator *GEP = dyn_cast<GEPOperator>(CE);
|
||||
if (!GEP)
|
||||
return false;
|
||||
|
||||
// Otherwise, add any offset that our operands provide.
|
||||
return GEP->accumulateConstantOffset(TD, Offset);
|
||||
}
|
||||
unsigned BitWidth = TD.getPointerTypeSizeInBits(GEP->getType());
|
||||
APInt TmpOffset(BitWidth, 0);
|
||||
|
||||
return false;
|
||||
// If the base isn't a global+constant, we aren't either.
|
||||
if (!IsConstantOffsetFromGlobal(CE->getOperand(0), GV, TmpOffset, TD))
|
||||
return false;
|
||||
|
||||
// Otherwise, add any offset that our operands provide.
|
||||
if (!GEP->accumulateConstantOffset(TD, TmpOffset))
|
||||
return false;
|
||||
|
||||
Offset = TmpOffset;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// ReadDataFromGlobal - Recursive helper to read bits out of global. C is the
|
||||
|
@ -416,7 +424,7 @@ static Constant *FoldReinterpretLoadFromConstPtr(Constant *C,
|
|||
return 0;
|
||||
|
||||
GlobalValue *GVal;
|
||||
APInt Offset(TD.getPointerTypeSizeInBits(PTy), 0);
|
||||
APInt Offset;
|
||||
if (!IsConstantOffsetFromGlobal(C, GVal, Offset, TD))
|
||||
return 0;
|
||||
|
||||
|
@ -585,8 +593,7 @@ static Constant *SymbolicallyEvaluateBinop(unsigned Opc, Constant *Op0,
|
|||
// constant. This happens frequently when iterating over a global array.
|
||||
if (Opc == Instruction::Sub && DL) {
|
||||
GlobalValue *GV1, *GV2;
|
||||
unsigned PtrSize = DL->getPointerSizeInBits();
|
||||
APInt Offs1(PtrSize, 0), Offs2(PtrSize, 0);
|
||||
APInt Offs1, Offs2;
|
||||
|
||||
if (IsConstantOffsetFromGlobal(Op0, GV1, Offs1, *DL))
|
||||
if (IsConstantOffsetFromGlobal(Op1, GV2, Offs2, *DL) &&
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"
|
||||
target datalayout = "E-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"
|
||||
|
||||
; Constant folding should fix notionally out-of-bounds indices
|
||||
; and add inbounds keywords.
|
||||
|
@ -72,3 +72,21 @@ entry:
|
|||
ret i64 %E
|
||||
; CHECK: ret i64 1000
|
||||
}
|
||||
|
||||
@X_as1 = addrspace(1) global [1000 x i8] zeroinitializer, align 16
|
||||
|
||||
define i16 @test2_as1() {
|
||||
; CHECK-LABEL: @test2_as1(
|
||||
; CHECK: ret i16 1000
|
||||
|
||||
entry:
|
||||
%A = bitcast i8 addrspace(1)* getelementptr inbounds ([1000 x i8] addrspace(1)* @X_as1, i64 1, i64 0) to i8 addrspace(1)*
|
||||
%B = bitcast i8 addrspace(1)* getelementptr inbounds ([1000 x i8] addrspace(1)* @X_as1, i64 0, i64 0) to i8 addrspace(1)*
|
||||
|
||||
%B2 = ptrtoint i8 addrspace(1)* %B to i16
|
||||
%C = sub i16 0, %B2
|
||||
%D = getelementptr i8 addrspace(1)* %A, i16 %C
|
||||
%E = ptrtoint i8 addrspace(1)* %D to i16
|
||||
|
||||
ret i16 %E
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue