[ARM] Skip inline asm memory operands in DAGToDAGISel
authorDiana Picus <diana.picus@linaro.org>
Wed, 20 Jul 2016 09:48:24 +0000 (09:48 +0000)
committerDiana Picus <diana.picus@linaro.org>
Wed, 20 Jul 2016 09:48:24 +0000 (09:48 +0000)
commitf345d40ae2a94a00cdb881934f6dae78e0dd0786
tree3fc78286af92888fdafff0188ff1595800b46777
parent10f8472771c0eae5310b48b0efa48c99680e666d
[ARM] Skip inline asm memory operands in DAGToDAGISel

Retry r275776 (no changes, we suspect the issue was with another commit).

The current logic for handling inline asm operands in DAGToDAGISel interprets
the operands by looking for constants, which should represent the flags
describing the kind of operand we're dealing with (immediate, memory, register
def etc). The operands representing actual data are skipped only if they are
non-const, with the exception of immediate operands which are skipped explicitly
when a flag describing an immediate is found.

The oversight is that memory operands may be const too (e.g. for device drivers
reading a fixed address), so we should explicitly skip the operand following a
flag describing a memory operand. If we don't, we risk interpreting that
constant as a flag, which is definitely not intended.

Fixes PR26038

Differential Revision: https://reviews.llvm.org/D22103

llvm-svn: 276101
llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
llvm/test/CodeGen/ARM/inlineasm3.ll