From 8b4588fa64f0ebfbb7d2b9b4af8c682ddddf29c0 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 25 Jul 2008 00:04:14 +0000 Subject: [PATCH] Use AliasAnalysis::pointsToConstantMemory in SDISel to avoid unnecessary dependencies with constant load nodes. This allows them to be scheduled freely. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54001 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index fdc3d25bd58..ac9e399e9d6 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2885,9 +2885,15 @@ void SelectionDAGLowering::visitLoad(LoadInst &I) { return; SDOperand Root; + bool ConstantMemory = false; if (I.isVolatile()) + // Serialize volatile loads with other side effects. Root = getRoot(); - else { + else if (AA.pointsToConstantMemory(SV)) { + // Do not serialize (non-volatile) loads of constant memory with anything. + Root = DAG.getEntryNode(); + ConstantMemory = true; + } else { // Do not serialize non-volatile loads against each other. Root = DAG.getRoot(); } @@ -2905,12 +2911,14 @@ void SelectionDAGLowering::visitLoad(LoadInst &I) { Chains[i] = L.getValue(1); } - SDOperand Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, - &Chains[0], NumValues); - if (isVolatile) - DAG.setRoot(Chain); - else - PendingLoads.push_back(Chain); + if (!ConstantMemory) { + SDOperand Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, + &Chains[0], NumValues); + if (isVolatile) + DAG.setRoot(Chain); + else + PendingLoads.push_back(Chain); + } setValue(&I, DAG.getMergeValues(DAG.getVTList(&ValueVTs[0], NumValues), &Values[0], NumValues));