Accurately model hardware alignment rounding.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 10 Jan 2012 01:34:59 +0000 (01:34 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 10 Jan 2012 01:34:59 +0000 (01:34 +0000)
commitdae412bd320f1522bd1d850be0276212fca0331f
treeaddc865b66b7088f8f71d7839c70155a7dd1f55e
parent9cce24a257108ec50f65652d233b9ffadc691682
Accurately model hardware alignment rounding.

On Thumb, the displacement computation hardware uses the address of the
current instruction rouned down to a multiple of 4.  Include this
rounding in the UserOffset we compute for each instruction.

When inline asm is present, the instruction alignment may not be known.
Constrain the maximum displacement instead in that case.

This makes it possible for CreateNewWater() and OffsetIsInRange() to
agree about the valid displacements.  When they disagree, infinite
looping happens.

As always, test cases for this stuff are insane.

<rdar://problem/10660175>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147825 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMConstantIslandPass.cpp