mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	New method SDep::isNormalMemoryOrBarrier() in ScheduleDAGInstrs.cpp.
Used to iterate over previously added memory dependencies in adjustChainDeps() and iterateChainSucc(). SDep::isCtrl() was previously used in these places, that also gave anti and output edges. The code may be worse if these are followed, because MisNeedChainEdge() will conservatively return true since a non-memory instruction has no memory operands, and a false chain dep will be added. It is also unnecessary since all memory accesses of interest will be reached by memory dependencies, and there is a budget limit for the number of edges traversed. This problem was found on an out-of-tree target with enabled alias analysis. No test case for an in-tree target has been found. Reviewed by Hal Finkel. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225351 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -190,6 +190,12 @@ namespace llvm {
 | 
				
			|||||||
      return getKind() == Order && Contents.OrdKind == Barrier;
 | 
					      return getKind() == Order && Contents.OrdKind == Barrier;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// isNormalMemoryOrBarrier - Test if this is could be any kind of memory
 | 
				
			||||||
 | 
					    /// dependence.
 | 
				
			||||||
 | 
					    bool isNormalMemoryOrBarrier() const {
 | 
				
			||||||
 | 
					      return (isNormalMemory() || isBarrier());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// isMustAlias - Test if this is an Order dependence that is marked
 | 
					    /// isMustAlias - Test if this is an Order dependence that is marked
 | 
				
			||||||
    /// as "must alias", meaning that the SUnits at either end of the edge
 | 
					    /// as "must alias", meaning that the SUnits at either end of the edge
 | 
				
			||||||
    /// have a memory dependence on a known memory location.
 | 
					    /// have a memory dependence on a known memory location.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -614,10 +614,10 @@ iterateChainSucc(AliasAnalysis *AA, const MachineFrameInfo *MFI,
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  // Track current depth.
 | 
					  // Track current depth.
 | 
				
			||||||
  (*Depth)++;
 | 
					  (*Depth)++;
 | 
				
			||||||
  // Iterate over chain dependencies only.
 | 
					  // Iterate over memory dependencies only.
 | 
				
			||||||
  for (SUnit::const_succ_iterator I = SUb->Succs.begin(), E = SUb->Succs.end();
 | 
					  for (SUnit::const_succ_iterator I = SUb->Succs.begin(), E = SUb->Succs.end();
 | 
				
			||||||
       I != E; ++I)
 | 
					       I != E; ++I)
 | 
				
			||||||
    if (I->isCtrl())
 | 
					    if (I->isNormalMemoryOrBarrier())
 | 
				
			||||||
      iterateChainSucc (AA, MFI, SUa, I->getSUnit(), ExitSU, Depth, Visited);
 | 
					      iterateChainSucc (AA, MFI, SUa, I->getSUnit(), ExitSU, Depth, Visited);
 | 
				
			||||||
  return *Depth;
 | 
					  return *Depth;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -644,11 +644,12 @@ static void adjustChainDeps(AliasAnalysis *AA, const MachineFrameInfo *MFI,
 | 
				
			|||||||
      Dep.setLatency(((*I)->getInstr()->mayLoad()) ? LatencyToLoad : 0);
 | 
					      Dep.setLatency(((*I)->getInstr()->mayLoad()) ? LatencyToLoad : 0);
 | 
				
			||||||
      (*I)->addPred(Dep);
 | 
					      (*I)->addPred(Dep);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // Now go through all the chain successors and iterate from them.
 | 
					
 | 
				
			||||||
    // Keep track of visited nodes.
 | 
					    // Iterate recursively over all previously added memory chain
 | 
				
			||||||
 | 
					    // successors. Keep track of visited nodes.
 | 
				
			||||||
    for (SUnit::const_succ_iterator J = (*I)->Succs.begin(),
 | 
					    for (SUnit::const_succ_iterator J = (*I)->Succs.begin(),
 | 
				
			||||||
         JE = (*I)->Succs.end(); J != JE; ++J)
 | 
					         JE = (*I)->Succs.end(); J != JE; ++J)
 | 
				
			||||||
      if (J->isCtrl())
 | 
					      if (J->isNormalMemoryOrBarrier())
 | 
				
			||||||
        iterateChainSucc (AA, MFI, SU, J->getSUnit(),
 | 
					        iterateChainSucc (AA, MFI, SU, J->getSUnit(),
 | 
				
			||||||
                          ExitSU, &Depth, Visited);
 | 
					                          ExitSU, &Depth, Visited);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user