summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp6
-rw-r--r--llvm/test/CodeGen/ARM/ldst-f32-2-i32.ll40
2 files changed, 42 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 54a52690012..2bfc3979360 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -14928,11 +14928,9 @@ SDValue DAGCombiner::ReduceLoadOpStoreWidth(SDNode *N) {
/// load / store operations if the target deems the transformation profitable.
SDValue DAGCombiner::TransformFPLoadStorePair(SDNode *N) {
StoreSDNode *ST = cast<StoreSDNode>(N);
- SDValue Chain = ST->getChain();
SDValue Value = ST->getValue();
if (ISD::isNormalStore(ST) && ISD::isNormalLoad(Value.getNode()) &&
- Value.hasOneUse() &&
- Chain == SDValue(Value.getNode(), 1)) {
+ Value.hasOneUse()) {
LoadSDNode *LD = cast<LoadSDNode>(Value);
EVT VT = LD->getMemoryVT();
if (!VT.isFloatingPoint() ||
@@ -14962,7 +14960,7 @@ SDValue DAGCombiner::TransformFPLoadStorePair(SDNode *N) {
LD->getPointerInfo(), LDAlign);
SDValue NewST =
- DAG.getStore(NewLD.getValue(1), SDLoc(N), NewLD, ST->getBasePtr(),
+ DAG.getStore(ST->getChain(), SDLoc(N), NewLD, ST->getBasePtr(),
ST->getPointerInfo(), STAlign);
AddToWorklist(NewLD.getNode());
diff --git a/llvm/test/CodeGen/ARM/ldst-f32-2-i32.ll b/llvm/test/CodeGen/ARM/ldst-f32-2-i32.ll
index 19227b0de31..2f83d966012 100644
--- a/llvm/test/CodeGen/ARM/ldst-f32-2-i32.ll
+++ b/llvm/test/CodeGen/ARM/ldst-f32-2-i32.ll
@@ -36,3 +36,43 @@ bb:
return:
ret void
}
+
+@a1 = local_unnamed_addr global float 0.000000e+00, align 4
+@a2 = local_unnamed_addr global float 0.000000e+00, align 4
+@a3 = local_unnamed_addr global float 0.000000e+00, align 4
+@a4 = local_unnamed_addr global float 0.000000e+00, align 4
+@a5 = local_unnamed_addr global float 0.000000e+00, align 4
+@a6 = local_unnamed_addr global float 0.000000e+00, align 4
+@a7 = local_unnamed_addr global float 0.000000e+00, align 4
+@a8 = local_unnamed_addr global float 0.000000e+00, align 4
+
+
+declare void @_Z3fooddddddddddddddd(float, float, float, float, float, float, float, float)
+
+; Because this test function is trying to pass float argument by stack,
+; it can be optimized to i32 load / store
+define signext i32 @test() {
+%1 = load float, float* @a1, align 4
+%2 = load float, float* @a2, align 4
+%3 = load float, float* @a3, align 4
+%4 = load float, float* @a4, align 4
+%5 = load float, float* @a5, align 4
+%6 = load float, float* @a6, align 4
+%7 = load float, float* @a7, align 4
+%8 = load float, float* @a8, align 4
+tail call void @_Z3fooddddddddddddddd(float %1, float %2, float %3, float %4, float %5, float %6, float %7, float %8)
+ret i32 0
+}
+
+; CHECK-LABEL: _test:
+; CHECK: ldr r3, [pc, r3]
+; CHECK: ldr r2, [pc, r2]
+; CHECK: ldr r1, [pc, r1]
+; CHECK: ldr r0, [pc, r0]
+; CHECK: ldr r9, [pc, r9]
+; CHECK: ldr r12, [pc, r12]
+; CHECK: ldr lr, [pc, lr]
+; CHECK: stm sp, {r9, r12, lr}
+; CHECK: ldr r4, [pc, r4]
+; CHECK: str r4, [sp, #12]
+; CHECK: bl __Z3fooddddddddddddddd
OpenPOWER on IntegriCloud