diff --git a/lib/Target/Hexagon/HexagonISelLowering.cpp b/lib/Target/Hexagon/HexagonISelLowering.cpp index f2c27e5e39b..7a708a8ac24 100644 --- a/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -3080,6 +3080,21 @@ HexagonTargetLowering::findRepresentativeClass(const TargetRegisterInfo *TRI, return TargetLowering::findRepresentativeClass(TRI, VT); } +bool HexagonTargetLowering::shouldReduceLoadWidth(SDNode *Load, + ISD::LoadExtType ExtTy, EVT NewVT) const { + auto *L = cast(Load); + std::pair BO = getBaseAndOffset(L->getBasePtr()); + // Small-data object, do not shrink. + if (BO.first.getOpcode() == HexagonISD::CONST32_GP) + return false; + if (GlobalAddressSDNode *GA = dyn_cast(BO.first)) { + auto &HTM = static_cast(getTargetMachine()); + const auto *GO = dyn_cast_or_null(GA->getGlobal()); + return !GO || !HTM.getObjFileLowering()->isGlobalInSmallSection(GO, HTM); + } + return true; +} + Value *HexagonTargetLowering::emitLoadLinked(IRBuilder<> &Builder, Value *Addr, AtomicOrdering Ord) const { BasicBlock *BB = Builder.GetInsertBlock(); diff --git a/lib/Target/Hexagon/HexagonISelLowering.h b/lib/Target/Hexagon/HexagonISelLowering.h index 8efb3c9cda5..39af19b9b07 100644 --- a/lib/Target/Hexagon/HexagonISelLowering.h +++ b/lib/Target/Hexagon/HexagonISelLowering.h @@ -304,6 +304,9 @@ namespace HexagonISD { SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const override; + bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, + EVT NewVT) const override; + // Handling of atomic RMW instructions. Value *emitLoadLinked(IRBuilder<> &Builder, Value *Addr, AtomicOrdering Ord) const override; diff --git a/test/CodeGen/Hexagon/sdata-load-size.ll b/test/CodeGen/Hexagon/sdata-load-size.ll new file mode 100644 index 00000000000..325713f7062 --- /dev/null +++ b/test/CodeGen/Hexagon/sdata-load-size.ll @@ -0,0 +1,19 @@ +; RUN: llc -march=hexagon -hexagon-small-data-threshold=8 < %s | FileCheck %s +; CHECK: = memd(gp+#g0) +; If an object will be placed in .sdata, do not shrink any references to it. +; In this case, g0 must be loaded via memd. + +target triple = "hexagon" + +@g0 = common global i64 0, align 8 + +define i32 @f0() #0 { +entry: + %v0 = load i64, i64* @g0, align 8 + %v1 = trunc i64 %v0 to i8 + %v2 = zext i8 %v1 to i32 + ret i32 %v2 +} + +attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+small-data" } +