diff options
| author | Akira Hatanaka <ahatanaka@mips.com> | 2012-05-11 23:22:18 +0000 |
|---|---|---|
| committer | Akira Hatanaka <ahatanaka@mips.com> | 2012-05-11 23:22:18 +0000 |
| commit | 0661b81bca9e6cb68b6a37470ed3d92c61d3593b (patch) | |
| tree | 83d23668a95f0fdc38a449be3a76c5a446b32b29 | |
| parent | a33015d4e0f60159e37da0a163b826db6cb7a81d (diff) | |
| download | bcm5719-llvm-0661b81bca9e6cb68b6a37470ed3d92c61d3593b.tar.gz bcm5719-llvm-0661b81bca9e6cb68b6a37470ed3d92c61d3593b.zip | |
Do not replace operands of pseudo instructions with register $zero.
llvm-svn: 156663
| -rw-r--r-- | llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Mips/atomic.ll | 16 |
2 files changed, 18 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp b/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp index 6e5bad7f153..027c171eff5 100644 --- a/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp +++ b/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp @@ -213,7 +213,8 @@ bool MipsDAGToDAGISel::ReplaceUsesWithZeroReg(MachineRegisterInfo *MRI, MachineInstr *MI = MO.getParent(); // Do not replace if it is a phi's operand or is tied to def operand. - if (MI->isPHI() || MI->isRegTiedToDefOperand(U.getOperandNo())) + if (MI->isPHI() || MI->isRegTiedToDefOperand(U.getOperandNo()) || + MI->isPseudo()) continue; MO.setReg(ZeroReg); diff --git a/llvm/test/CodeGen/Mips/atomic.ll b/llvm/test/CodeGen/Mips/atomic.ll index a4763b130d4..e181610ec35 100644 --- a/llvm/test/CodeGen/Mips/atomic.ll +++ b/llvm/test/CodeGen/Mips/atomic.ll @@ -242,3 +242,19 @@ entry: ; CHECK: sync 0 } +; make sure that this assertion in +; TwoAddressInstructionPass::TryInstructionTransform does not fail: +; +; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) && +; +; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an +; operand of an atomic instruction with register $zero. +@a = external global i32 + +define i32 @zeroreg() nounwind { +entry: + %0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst + %1 = icmp eq i32 %0, 1 + %conv = zext i1 %1 to i32 + ret i32 %conv +} |

