diff options
| author | Fangrui Song <maskray@google.com> | 2019-12-29 15:53:46 -0800 |
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2019-12-29 16:50:42 -0800 |
| commit | 5edb40c0220e80fc4cdb726d30d1d8b8e8580892 (patch) | |
| tree | de4d76facba3a43fd169a68ae019ea66e9975690 /llvm/lib/CodeGen | |
| parent | b1fb07ddbaa539f9173e32dc27110168b165c1fe (diff) | |
| download | bcm5719-llvm-5edb40c0220e80fc4cdb726d30d1d8b8e8580892.tar.gz bcm5719-llvm-5edb40c0220e80fc4cdb726d30d1d8b8e8580892.zip | |
[SelectionDAG] Disallow indirect "i" constraint
This allows us to delete InlineAsm::Constraint_i workarounds in
SelectionDAGISel::SelectInlineAsmMemoryOperand overrides and
TargetLowering::getInlineAsmMemConstraint overrides.
They were introduced to X86 in r237517 to prevent crashes for
constraints like "=*imr". They were later copied to other targets.
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 155d68c0b22..ee2e40b3c59 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -4498,6 +4498,12 @@ static void ChooseConstraint(TargetLowering::AsmOperandInfo &OpInfo, TargetLowering::ConstraintType CType = TLI.getConstraintType(OpInfo.Codes[i]); + // Indirect 'other' or 'immediate' constraints are not allowed. + if (OpInfo.isIndirect && !(CType == TargetLowering::C_Memory || + CType == TargetLowering::C_Register || + CType == TargetLowering::C_RegisterClass)) + continue; + // If this is an 'other' or 'immediate' constraint, see if the operand is // valid for it. For example, on X86 we might have an 'rI' constraint. If // the operand is an integer in the range [0..31] we want to use I (saving a |

