diff options
author | Chris Lattner <sabre@nondot.org> | 2011-04-09 02:32:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-04-09 02:32:02 +0000 |
commit | b3452ea35c3e78d1a8c7d92f9448b0054d36e740 (patch) | |
tree | 25589784246bfbeedf831db145808d8c40220bfd | |
parent | 4ae6a4d696c612164391a6a533f70b38d265ff79 (diff) | |
download | external_llvm-b3452ea35c3e78d1a8c7d92f9448b0054d36e740.zip external_llvm-b3452ea35c3e78d1a8c7d92f9448b0054d36e740.tar.gz external_llvm-b3452ea35c3e78d1a8c7d92f9448b0054d36e740.tar.bz2 |
have dag combine zap "store undef", which can be formed during call lowering
with undef arguments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129185 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 10 | ||||
-rw-r--r-- | test/CodeGen/X86/call-push.ll | 15 |
2 files changed, 23 insertions, 2 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a9afec8..6ad85fa 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -6264,6 +6264,10 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) { Ptr, ST->getPointerInfo(), ST->isVolatile(), ST->isNonTemporal(), OrigAlign); } + + // Turn 'store undef, Ptr' -> nothing. + if (Value.getOpcode() == ISD::UNDEF && ST->isUnindexed()) + return Chain; // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr' if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(Value)) { @@ -6298,8 +6302,10 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) { return DAG.getStore(Chain, N->getDebugLoc(), Tmp, Ptr, ST->getPointerInfo(), ST->isVolatile(), ST->isNonTemporal(), ST->getAlignment()); - } else if (!ST->isVolatile() && - TLI.isOperationLegalOrCustom(ISD::STORE, MVT::i32)) { + } + + if (!ST->isVolatile() && + TLI.isOperationLegalOrCustom(ISD::STORE, MVT::i32)) { // Many FP stores are not made apparent until after legalize, e.g. for // argument passing. Since this is so common, custom legalize the // 64-bit integer store into two 32-bit stores. diff --git a/test/CodeGen/X86/call-push.ll b/test/CodeGen/X86/call-push.ll index 02cbccc..7eac522 100644 --- a/test/CodeGen/X86/call-push.ll +++ b/test/CodeGen/X86/call-push.ll @@ -27,3 +27,18 @@ UnifiedReturnBlock: ; preds = %entry } declare i32 @f(%struct.decode_t*) + + +; There should be no store for the undef operand. + +; CHECK: _test2: +; CHECK-NOT: 8(%esp) +; CHECK: 4(%esp) +; CHECK: calll +declare i32 @foo(i32, i32, i32) + +define void @test2() nounwind { +entry: + %call = call i32 @foo(i32 8, i32 6, i32 undef) + ret void +} |