diff options
| author | Philip Reames <listmail@philipreames.com> | 2015-12-23 17:05:57 +0000 | 
|---|---|---|
| committer | Philip Reames <listmail@philipreames.com> | 2015-12-23 17:05:57 +0000 | 
| commit | 42bd26f29d4be2c503d30b104b8f4304ba651ad6 (patch) | |
| tree | ceb19a55035528d07b751e9f4a4f961ab80fd7f5 /llvm/lib/CodeGen | |
| parent | 97cbe3e39c170f1df8bbcdc84acd940a64e2ca79 (diff) | |
| download | bcm5719-llvm-42bd26f29d4be2c503d30b104b8f4304ba651ad6.tar.gz bcm5719-llvm-42bd26f29d4be2c503d30b104b8f4304ba651ad6.zip | |
[MachineLICM] Fix handling of memoperands
As far as I can tell, the correct interpretation of an empty memoperands list is that we didn't have sufficient room to store information about the MachineInstr, NOT that the MachineInstr doesn't access any particular bit of memory. This appears to be fairly consistent in a number of places, but I'm not 100% sure of this interpretation. I'd really appreciate someone more knowledgeable confirming my reading of the code.
This patch fixes two latent bugs in MachineLICM - given the above assumption - and adds comments to document the meaning and required handling. I don't have test cases; these were noticed by inspection.
Differential Revision: http://reviews.llvm.org/D15730
llvm-svn: 256335
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/MachineLICM.cpp | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/llvm/lib/CodeGen/MachineLICM.cpp b/llvm/lib/CodeGen/MachineLICM.cpp index 1a8e92332bc..a8368e9c80d 100644 --- a/llvm/lib/CodeGen/MachineLICM.cpp +++ b/llvm/lib/CodeGen/MachineLICM.cpp @@ -330,6 +330,10 @@ bool MachineLICM::runOnMachineFunction(MachineFunction &MF) {  /// Return true if instruction stores to the specified frame.  static bool InstructionStoresToFI(const MachineInstr *MI, int FI) { +  // If we lost memory operands, conservatively assume that the instruction +  // writes to all slots.  +  if (MI->memoperands_empty()) +    return true;    for (MachineInstr::mmo_iterator o = MI->memoperands_begin(),           oe = MI->memoperands_end(); o != oe; ++o) {      if (!(*o)->isStore() || !(*o)->getPseudoValue()) @@ -846,8 +850,14 @@ MachineLICM::calcRegisterCost(const MachineInstr *MI, bool ConsiderSeen,  /// Return true if this machine instruction loads from global offset table or  /// constant pool. -static bool isLoadFromGOTOrConstantPool(MachineInstr &MI) { +static bool mayLoadFromGOTOrConstantPool(MachineInstr &MI) {    assert (MI.mayLoad() && "Expected MI that loads!"); +   +  // If we lost memory operands, conservatively assume that the instruction +  // reads from everything..  +  if (MI.memoperands_empty()) +    return true; +    for (MachineInstr::mmo_iterator I = MI.memoperands_begin(),           E = MI.memoperands_end(); I != E; ++I) {      if (const PseudoSourceValue *PSV = (*I)->getPseudoValue()) { @@ -872,7 +882,7 @@ bool MachineLICM::IsLICMCandidate(MachineInstr &I) {    // from constant memory are not safe to speculate all the time, for example    // indexed load from a jump table.    // Stores and side effects are already checked by isSafeToMove. -  if (I.mayLoad() && !isLoadFromGOTOrConstantPool(I) && +  if (I.mayLoad() && !mayLoadFromGOTOrConstantPool(I) &&        !IsGuaranteedToExecute(I.getParent()))      return false; | 

