aboutsummaryrefslogtreecommitdiff
path: root/install-sh
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-13 17:50:01 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-13 17:50:01 +0000
commit729f495ad78e2596d166707444941b382dbfc29a (patch)
tree1256fd0967af1cfab5a7885b74b6bbf4ce8cadb3 /install-sh
parentb4923738ef57a441f6f9248260848bde5af165fa (diff)
downloadgcc-729f495ad78e2596d166707444941b382dbfc29a.zip
gcc-729f495ad78e2596d166707444941b382dbfc29a.tar.gz
gcc-729f495ad78e2596d166707444941b382dbfc29a.tar.bz2
Improve canonicalisation of TARGET_MEM_REFs
A general TARGET_MEM_REF is: BASE + STEP * INDEX + INDEX2 + OFFSET After classifying the address in this way, the code that builds TARGET_MEM_REFs tries to simplify the address until it's valid for the current target and for the mode of memory being addressed. It does this in a fixed order: (1) add SYMBOL to BASE (2) add INDEX * STEP to the base, if STEP != 1 (3) add OFFSET to INDEX or BASE (reverted if unsuccessful) (4) add INDEX to BASE (5) add OFFSET to BASE So suppose we had an address: &symbol + offset + index * 8 (e.g. a[i + 1] for a global "a") on a target only allows an index or an offset, not both. Following the steps above, we'd first create: tmp = symbol tmp2 = tmp + index * 8 Then if the given offset value was valid for the mode being addressed, we'd create: MEM[base:tmp2, offset:offset] while if it was invalid we'd create: tmp3 = tmp2 + offset MEM[base:tmp3, offset:0] The problem is that this could happen if ivopts had decided to use a scaled index for an address that happens to have a constant base. The old procedure failed to give an indexed TARGET_MEM_REF in that case, and adding the offset last prevented later passes from being able to fold the index back in. The patch avoids this by checking at (2) whether the offset is the only component that causes the address to be invalid, folding it into the base if so. 2018-01-13 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree-ssa-address.c (mem_ref_valid_without_offset_p): New function. (add_offset_to_base): New function, split out from... (create_mem_ref): ...here. When handling a scale other than 1, check first whether the address is valid without the offset. Add it into the base if so, leaving the index and scale as-is. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r256609
Diffstat (limited to 'install-sh')
0 files changed, 0 insertions, 0 deletions