[ARM] Skip inline asm memory operands in DAGToDAGISel
authorDiana Picus <diana.picus@linaro.org>
Mon, 18 Jul 2016 07:35:14 +0000 (07:35 +0000)
committerDiana Picus <diana.picus@linaro.org>
Mon, 18 Jul 2016 07:35:14 +0000 (07:35 +0000)
commit73ed44d328a35780ac412d35ff9cf6f16f281ef6
treeea5cfe2facf217e64fb684313c13140f90983b8c
parenta3c55f59152cc62397e0420b48734c86162b2f29
[ARM] Skip inline asm memory operands in DAGToDAGISel

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: 275776
llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
llvm/test/CodeGen/ARM/inlineasm3.ll