diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-07-15 23:37:26 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-07-15 23:37:26 +0000 |
commit | c8a017441ab0045e249fdf0463f8489c37c58a63 (patch) | |
tree | c73c1fc5743d498c2b6c8394c3e661e3ec091e4f /lib/CodeGen | |
parent | f0cda48cf2490ed0212fc438beec5e803beb87f1 (diff) | |
download | external_llvm-c8a017441ab0045e249fdf0463f8489c37c58a63.zip external_llvm-c8a017441ab0045e249fdf0463f8489c37c58a63.tar.gz external_llvm-c8a017441ab0045e249fdf0463f8489c37c58a63.tar.bz2 |
Verify that there is no kill flag on tied operands on two-address instructions.
This extra check is not trigged when runnning "make check" on top-of-tree.
Change error message to better match llvm_unreachable() grammar.
Don't call llvm_unreachable() when writing error messages to a file, but keep going.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75860 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/MachineVerifier.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index e9b90fa..77bfcb5 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -219,11 +219,10 @@ MachineVerifier::runOnMachineFunction(MachineFunction &MF) if (OutFileName) OutFile.close(); - - if (foundErrors) { + else if (foundErrors) { std::string msg; raw_string_ostream Msg(msg); - Msg << "\nStopping with " << foundErrors << " machine code errors."; + Msg << "Found " << foundErrors << " machine code errors."; llvm_report_error(Msg.str()); } @@ -353,8 +352,12 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) if (MO->isUse()) { if (MO->isKill()) { addRegWithSubRegs(regsKilled, Reg); + // Tied operands on two-address instuctions MUST NOT have a <kill> flag. + if (MI->isRegTiedToDefOperand(MONum)) + report("Illegal kill flag on two-address instruction operand", + MO, MONum); } else { - // TwoAddress instr modyfying a reg is treated as kill+def. + // TwoAddress instr modifying a reg is treated as kill+def. unsigned defIdx; if (MI->isRegTiedToDefOperand(MONum, &defIdx) && MI->getOperand(defIdx).getReg() == Reg) |