diff options
| author | Craig Topper <craig.topper@intel.com> | 2017-11-08 22:26:39 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2017-11-08 22:26:39 +0000 |
| commit | 61f81f9637cf81ee25d941b09c41a372d9387f3e (patch) | |
| tree | c616307f16839f9dcd59bbf819895c18f8364610 /llvm/lib/Target | |
| parent | 55029d811ff8c28fcbfb91faa6c658b59136943c (diff) | |
| download | bcm5719-llvm-61f81f9637cf81ee25d941b09c41a372d9387f3e.tar.gz bcm5719-llvm-61f81f9637cf81ee25d941b09c41a372d9387f3e.zip | |
[X86] Preserve memory refs when folding loads into divides.
This is similar to what we already do for multiplies. Without this we can't unfold and hoist an invariant load.
llvm-svn: 317732
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index 21fee9a91e0..099543240ae 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -2885,11 +2885,15 @@ void X86DAGToDAGISel::Select(SDNode *Node) { if (foldedLoad) { SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N1.getOperand(0), InFlag }; - SDNode *CNode = + MachineSDNode *CNode = CurDAG->getMachineNode(MOpc, dl, MVT::Other, MVT::Glue, Ops); InFlag = SDValue(CNode, 1); // Update the chain. ReplaceUses(N1.getValue(1), SDValue(CNode, 0)); + // Record the mem-refs + MachineSDNode::mmo_iterator MemOp = MF->allocateMemRefsArray(1); + MemOp[0] = cast<LoadSDNode>(N1)->getMemOperand(); + CNode->setMemRefs(MemOp, MemOp + 1); } else { InFlag = SDValue(CurDAG->getMachineNode(Opc, dl, MVT::Glue, N1, InFlag), 0); |

