diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2009-04-14 00:32:25 +0000 | 
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2009-04-14 00:32:25 +0000 | 
| commit | 9787183b9b01ebe645ce8436e12e14c2d41141fb (patch) | |
| tree | f49c077d693038284ffbe3b74ed093c24c12f07a /llvm/lib | |
| parent | 1a0d0b9acc57e0c14ad32008ffac0fea49098121 (diff) | |
| download | bcm5719-llvm-9787183b9b01ebe645ce8436e12e14c2d41141fb.tar.gz bcm5719-llvm-9787183b9b01ebe645ce8436e12e14c2d41141fb.zip | |
Fix PR3934 part 2. findOnlyInterestingUse() was not setting IsCopy and IsDstPhys which are returned by value and used by callee. This happened to work on the earlier test cases because of a logic error in the caller side.
llvm-svn: 69006
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/TwoAddressInstructionPass.cpp | 22 | 
1 files changed, 13 insertions, 9 deletions
| diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp index 8a18dc0fc79..42d517b2e5f 100644 --- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -405,7 +405,7 @@ static  MachineInstr *findOnlyInterestingUse(unsigned Reg, MachineBasicBlock *MBB,                                       MachineRegisterInfo *MRI,                                       const TargetInstrInfo *TII, -                                     bool &isCopy, +                                     bool &IsCopy,                                       unsigned &DstReg, bool &IsDstPhys) {    MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg);    if (UI == MRI->use_end()) @@ -418,11 +418,15 @@ MachineInstr *findOnlyInterestingUse(unsigned Reg, MachineBasicBlock *MBB,      return 0;    unsigned SrcReg;    bool IsSrcPhys; -  if (isCopyToReg(UseMI, TII, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) +  if (isCopyToReg(UseMI, TII, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) { +    IsCopy = true;      return &UseMI; +  }    IsDstPhys = false; -  if (isTwoAddrUse(UseMI, Reg, DstReg)) +  if (isTwoAddrUse(UseMI, Reg, DstReg)) { +    IsDstPhys = TargetRegisterInfo::isPhysicalRegister(DstReg);      return &UseMI; +  }    return 0;  } @@ -634,12 +638,12 @@ void TwoAddressInstructionPass::ProcessCopy(MachineInstr *MI,               "Can't map to two src physical registers!");      SmallVector<unsigned, 4> VirtRegPairs; -    bool isCopy = false; +    bool IsCopy = false;      unsigned NewReg = 0;      while (MachineInstr *UseMI = findOnlyInterestingUse(DstReg, MBB, MRI,TII, -                                                   isCopy, NewReg, IsDstPhys)) { -      if (isCopy) { -        if (Processed.insert(UseMI)) +                                                   IsCopy, NewReg, IsDstPhys)) { +      if (IsCopy) { +        if (!Processed.insert(UseMI))            break;        } @@ -654,8 +658,8 @@ void TwoAddressInstructionPass::ProcessCopy(MachineInstr *MI,        }        bool isNew = SrcRegMap.insert(std::make_pair(NewReg, DstReg)).second;        if (!isNew) -      assert(SrcRegMap[NewReg] == DstReg && -             "Can't map to two src physical registers!"); +        assert(SrcRegMap[NewReg] == DstReg && +               "Can't map to two src physical registers!");        VirtRegPairs.push_back(NewReg);        DstReg = NewReg;      } | 

