[llvm] r198609 - XCore target: fix handling of unsized global arrays in large code model
Robert Lytton
robert at xmos.com
Mon Jan 6 06:20:32 PST 2014
Author: rlytton
Date: Mon Jan 6 08:20:32 2014
New Revision: 198609
URL: http://llvm.org/viewvc/llvm-project?rev=198609&view=rev
Log:
XCore target: fix handling of unsized global arrays in large code model
Modified:
llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp
llvm/trunk/test/CodeGen/XCore/codemodel.ll
Modified: llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp?rev=198609&r1=198608&r2=198609&view=diff
==============================================================================
--- llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/XCore/XCoreISelLowering.cpp Mon Jan 6 08:20:32 2014
@@ -268,6 +268,18 @@ getGlobalAddressWrapper(SDValue GA, cons
return DAG.getNode(XCoreISD::PCRelativeWrapper, dl, MVT::i32, GA);
}
+static bool IsSmallObject(const GlobalValue *GV, const XCoreTargetLowering &XTL) {
+ if (XTL.getTargetMachine().getCodeModel() == CodeModel::Small)
+ return true;
+
+ Type *ObjType = GV->getType()->getPointerElementType();
+ if (!ObjType->isSized())
+ return false;
+
+ unsigned ObjSize = XTL.getDataLayout()->getTypeAllocSize(ObjType);
+ return ObjSize < CodeModelLargeSize && ObjSize != 0;
+}
+
SDValue XCoreTargetLowering::
LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
{
@@ -275,10 +287,7 @@ LowerGlobalAddress(SDValue Op, Selection
const GlobalValue *GV = GN->getGlobal();
SDLoc DL(GN);
int64_t Offset = GN->getOffset();
- Type *ObjType = GV->getType()->getPointerElementType();
- if (getTargetMachine().getCodeModel() == CodeModel::Small ||
- !ObjType->isSized() ||
- getDataLayout()->getTypeAllocSize(ObjType) < CodeModelLargeSize) {
+ if (IsSmallObject(GV, *this)) {
// We can only fold positive offsets that are a multiple of the word size.
int64_t FoldedOffset = std::max(Offset & ~3, (int64_t)0);
SDValue GA = DAG.getTargetGlobalAddress(GV, DL, MVT::i32, FoldedOffset);
Modified: llvm/trunk/test/CodeGen/XCore/codemodel.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/XCore/codemodel.ll?rev=198609&r1=198608&r2=198609&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/XCore/codemodel.ll (original)
+++ llvm/trunk/test/CodeGen/XCore/codemodel.ll Mon Jan 6 08:20:32 2014
@@ -35,6 +35,7 @@ entry:
ret [50000 x i32]* %Addr
}
+
; CHECK: .section .cp.rodata.cst4,"aMc", at progbits,4
; CHECK: .long 65536
; CHECK: .text
@@ -115,6 +116,46 @@ entry:
ret i32 %16
}
+
+; CHECK-LABEL: UnknownSize:
+; CHECK: ldw r0, dp[NoSize+40]
+; CHECK-NEXT: retsp 0
+;
+; LARGE: .section .cp.rodata,"ac", at progbits
+; LARGE: .LCPI{{[0-9_]*}}
+; LARGE-NEXT: .long NoSize
+; LARGE-NEXT: .text
+; LARGE-LABEL: UnknownSize:
+; LARGE: ldw r0, cp[.LCPI{{[0-9_]*}}]
+; LARGE-NEXT: ldw r0, r0[0]
+; LARGE-NEXT: retsp 0
+ at NoSize = external global [0 x i32]
+define i32 @UnknownSize() nounwind {
+entry:
+ %0 = load i32* getelementptr inbounds ([0 x i32]* @NoSize, i32 0, i32 10)
+ ret i32 %0
+}
+
+
+; CHECK-LABEL: UnknownStruct:
+; CHECK: ldaw r0, dp[Unknown]
+; CHECK-NEXT: retsp 0
+;
+; LARGE: .section .cp.rodata,"ac", at progbits
+; LARGE: .LCPI{{[0-9_]*}}
+; LARGE-NEXT: .long Unknown
+; LARGE-NEXT: .text
+; LARGE-LABEL: UnknownStruct:
+; LARGE: ldw r0, cp[.LCPI{{[0-9_]*}}]
+; LARGE-NEXT: retsp 0
+%Struct = type opaque
+ at Unknown = external global %Struct
+define %Struct* @UnknownStruct() nounwind {
+entry:
+ ret %Struct* @Unknown
+}
+
+
; CHECK: .section .dp.bss,"awd", at nobits
; CHECK-LABEL: l:
; CHECK: .space 400
More information about the llvm-commits
mailing list