diff options
author | Craig Topper <craig.topper@intel.com> | 2018-09-30 17:47:18 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-09-30 17:47:18 +0000 |
commit | 99ad2a5723ce09f2264b91f6e45e2e7428d82e7d (patch) | |
tree | e1a4554a228a9e7c552ff87952cd39ef9a0250eb | |
parent | 873a50901b9d2281eb2a4b40d7e19c5172c9f92b (diff) | |
download | bcm5719-llvm-99ad2a5723ce09f2264b91f6e45e2e7428d82e7d.tar.gz bcm5719-llvm-99ad2a5723ce09f2264b91f6e45e2e7428d82e7d.zip |
[X86] Copy memrefs when folding a load for division instruction selection.
llvm-svn: 343419
-rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index a0ef4b61263..4909d18d967 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -3266,20 +3266,22 @@ void X86DAGToDAGISel::Select(SDNode *Node) { if (NVT == MVT::i8 && (!isSigned || signBitIsZero)) { // Special case for div8, just use a move with zero extension to AX to // clear the upper 8 bits (AH). - SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, Move, Chain; + SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, Chain; + MachineSDNode *Move; if (tryFoldLoad(Node, N0, Tmp0, Tmp1, Tmp2, Tmp3, Tmp4)) { SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N0.getOperand(0) }; - Move = - SDValue(CurDAG->getMachineNode(X86::MOVZX32rm8, dl, MVT::i32, - MVT::Other, Ops), 0); - Chain = Move.getValue(1); + Move = CurDAG->getMachineNode(X86::MOVZX32rm8, dl, MVT::i32, + MVT::Other, Ops); + Chain = SDValue(Move, 1); ReplaceUses(N0.getValue(1), Chain); + // Record the mem-refs + CurDAG->setNodeMemRefs(Move, {cast<LoadSDNode>(N0)->getMemOperand()}); } else { - Move = - SDValue(CurDAG->getMachineNode(X86::MOVZX32rr8, dl, MVT::i32, N0),0); + Move = CurDAG->getMachineNode(X86::MOVZX32rr8, dl, MVT::i32, N0); Chain = CurDAG->getEntryNode(); } - Chain = CurDAG->getCopyToReg(Chain, dl, X86::EAX, Move, SDValue()); + Chain = CurDAG->getCopyToReg(Chain, dl, X86::EAX, SDValue(Move, 0), + SDValue()); InFlag = Chain.getValue(1); } else { InFlag = |