diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a9afec8b216..6ad85fa130a 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(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 02cbccc1a49..7eac522d1f8 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 +}