aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2018-01-30 20:28:59 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2018-01-30 20:28:59 +0000
commit634c3ff01847a2b0918d13d85205779075b86c31 (patch)
tree80ec5d75979b1179464142a01e1cd8a450c8d4aa /gcc/lra-constraints.c
parentc5370327b043595a13cda2237cf2007b690440ef (diff)
downloadgcc-634c3ff01847a2b0918d13d85205779075b86c31.zip
gcc-634c3ff01847a2b0918d13d85205779075b86c31.tar.gz
gcc-634c3ff01847a2b0918d13d85205779075b86c31.tar.bz2
re PR target/84112 (powerpc64le ICE in LRA on openjdk)
2018-01-30 Vladimir Makarov <vmakarov@redhat.com> PR target/84112 * lra-constraints.c (curr_insn_transform): Process AND in the address. 2018-01-30 Vladimir Makarov <vmakarov@redhat.com> PR target/84112 * pr84112.c: New. From-SVN: r257204
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index c244312..4f5474e 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4216,7 +4216,17 @@ curr_insn_transform (bool check_only_p)
GET_MODE_SIZE (GET_MODE (op)));
else if (get_reload_reg (OP_IN, Pmode, *loc, rclass, FALSE,
"offsetable address", &new_reg))
- lra_emit_move (new_reg, *loc);
+ {
+ rtx addr = *loc;
+ enum rtx_code code = GET_CODE (addr);
+
+ if (code == AND && CONST_INT_P (XEXP (addr, 1)))
+ /* (and ... (const_int -X)) is used to align to X bytes. */
+ addr = XEXP (*loc, 0);
+ lra_emit_move (new_reg, addr);
+ if (addr != *loc)
+ emit_move_insn (new_reg, gen_rtx_AND (GET_MODE (new_reg), new_reg, XEXP (*loc, 1)));
+ }
before = get_insns ();
end_sequence ();
*loc = new_reg;