diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2018-01-30 20:28:59 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2018-01-30 20:28:59 +0000 |
commit | 634c3ff01847a2b0918d13d85205779075b86c31 (patch) | |
tree | 80ec5d75979b1179464142a01e1cd8a450c8d4aa /gcc/lra-constraints.c | |
parent | c5370327b043595a13cda2237cf2007b690440ef (diff) | |
download | gcc-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.c | 12 |
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; |