diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-09-13 20:51:27 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-09-13 20:51:27 +0000 |
| commit | 2f88006cedd06b8e2be1e9d282ba7e3bf88f57ca (patch) | |
| tree | bef5cc32a8576e5953a232463741b800dd7a7371 /llvm/lib/CodeGen | |
| parent | 59ad1c845787238560142d7608bc9433cbe9eaa0 (diff) | |
| download | bcm5719-llvm-2f88006cedd06b8e2be1e9d282ba7e3bf88f57ca.tar.gz bcm5719-llvm-2f88006cedd06b8e2be1e9d282ba7e3bf88f57ca.zip | |
[MachineInstr] In addRegisterKilled and addRegisterDead, don't remove operands from inline assembly instructions if they have an associated flag operand.
INLINEASM instructions use extra operands to carry flags. If a register operand is removed without removing the flag operand, then the flags will no longer make sense.
This patch fixes this by preventing the removal when a flag operand is present.
The included test case was generated by MS inline assembly. Longer term maybe we should fix the inline assembly parsing to not generate redundant operands.
Differential Revision: https://reviews.llvm.org/D51829
llvm-svn: 342176
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index 37e23aee000..2f323597741 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -1766,7 +1766,8 @@ bool MachineInstr::addRegisterKilled(unsigned IncomingReg, // Trim unneeded kill operands. while (!DeadOps.empty()) { unsigned OpIdx = DeadOps.back(); - if (getOperand(OpIdx).isImplicit()) + if (getOperand(OpIdx).isImplicit() && + (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0)) RemoveOperand(OpIdx); else getOperand(OpIdx).setIsKill(false); @@ -1830,7 +1831,8 @@ bool MachineInstr::addRegisterDead(unsigned Reg, // Trim unneeded dead operands. while (!DeadOps.empty()) { unsigned OpIdx = DeadOps.back(); - if (getOperand(OpIdx).isImplicit()) + if (getOperand(OpIdx).isImplicit() && + (!isInlineAsm() || findInlineAsmFlagIdx(OpIdx) < 0)) RemoveOperand(OpIdx); else getOperand(OpIdx).setIsDead(false); |

