summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-11-08 22:26:39 +0000
committerCraig Topper <craig.topper@intel.com>2017-11-08 22:26:39 +0000
commit61f81f9637cf81ee25d941b09c41a372d9387f3e (patch)
treec616307f16839f9dcd59bbf819895c18f8364610 /llvm/lib/Target
parent55029d811ff8c28fcbfb91faa6c658b59136943c (diff)
downloadbcm5719-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.cpp6
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);
OpenPOWER on IntegriCloud