Do not replace operands of pseudo instructions with register $zero.

llvm-svn: 156663
This commit is contained in:
Akira Hatanaka 2012-05-11 23:22:18 +00:00
parent a33015d4e0
commit 0661b81bca
2 changed files with 18 additions and 1 deletions

View File

@ -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);

View File

@ -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
}