diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2019-12-10 22:07:57 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2019-12-10 22:07:57 +0000 |
commit | 7436a1c6750d1d45487f666da94808f5b06d5ffd (patch) | |
tree | 75b58a637f57ab78d67ca56bb89c2da702305d23 /gcc/lra-constraints.c | |
parent | 0cc063af32311944d66b6537aeade08038cabba9 (diff) | |
download | gcc-7436a1c6750d1d45487f666da94808f5b06d5ffd.zip gcc-7436a1c6750d1d45487f666da94808f5b06d5ffd.tar.gz gcc-7436a1c6750d1d45487f666da94808f5b06d5ffd.tar.bz2 |
re PR rtl-optimization/92796 (ICE in lra_assign, at lra-assigns.c:1646 on powerpc64le-linux-gnu)
2019-12-10 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/92796
* lra-int.h (lra_risky_transformations_p): Rename to
check_and_force_assignment_correctness_p.
* lra-assigns.c: Ditto.
(lra_assign): Reset check_and_force_assignment_correctness_p.
* lra-constraints.c (lra_risky_transformations_p): Rename to
check_and_force_assignment_correctness_p.
(lra_constraints): Set up check_and_force_assignment_correctness_p
only for the 1st sub-pass.
* lra-eliminations.c (process_insn_for_elimination): Set up
check_and_force_assignment_correctness_p if the insn chnaged its
code.
2019-12-10 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/92796
* gcc.target/powerpc/pr92796.c: New test.
From-SVN: r279204
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 39d2d2c..9e0f50e 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -4665,11 +4665,14 @@ loc_equivalence_callback (rtx loc, const_rtx, void *data) /* The current iteration number of this LRA pass. */ int lra_constraint_iter; -/* True if we substituted equiv which needs checking register - allocation correctness because the equivalent value contains - allocatable hard registers or when we restore multi-register - pseudo. */ -bool lra_risky_transformations_p; +/* True if we should during assignment sub-pass check assignment + correctness for all pseudos and spill some of them to correct + conflicts. It can be necessary when we substitute equiv which + needs checking register allocation correctness because the + equivalent value contains allocatable hard registers, or when we + restore multi-register pseudo, or when we change the insn code and + its operand became INOUT operand when it was IN one before. */ +bool check_and_force_assignment_correctness_p; /* Return true if REGNO is referenced in more than one block. */ static bool @@ -4811,14 +4814,14 @@ lra_constraints (bool first_p) changed_p = false; if (pic_offset_table_rtx && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER) - lra_risky_transformations_p = true; - else + check_and_force_assignment_correctness_p = true; + else if (first_p) /* On the first iteration we should check IRA assignment correctness. In rare cases, the assignments can be wrong as early clobbers operands are ignored in IRA or usages of paradoxical sub-registers are not taken into account by IRA. */ - lra_risky_transformations_p = first_p; + check_and_force_assignment_correctness_p = true; new_insn_uid_start = get_max_uid (); new_regno_start = first_p ? lra_constraint_new_regno_start : max_reg_num (); /* Mark used hard regs for target stack size calulations. */ @@ -4994,7 +4997,7 @@ lra_constraints (bool first_p) dump_insn_slim (lra_dump_file, curr_insn); } if (contains_reg_p (x, true, false)) - lra_risky_transformations_p = true; + check_and_force_assignment_correctness_p = true; lra_set_insn_deleted (curr_insn); continue; } @@ -5507,7 +5510,7 @@ need_for_split_p (HARD_REG_SET potential_reload_hard_regs, int regno) /* Don't split call clobbered hard regs living through calls, otherwise we might have a check problem in the assign sub-pass as in the most cases (exception is a - situation when lra_risky_transformations_p value is + situation when check_and_force_assignment_correctness_p value is true) the assign pass assumes that all pseudos living through calls are assigned to call saved hard regs. */ && (regno >= FIRST_PSEUDO_REGISTER @@ -5799,7 +5802,7 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn, sub-register levels, LRA do this on pseudos level right now and this discrepancy may create allocation conflicts after splitting. */ - lra_risky_transformations_p = true; + check_and_force_assignment_correctness_p = true; if (lra_dump_file != NULL) fprintf (lra_dump_file, " ))))))))))))))))))))))))))))))))))))))))))))))))\n"); @@ -6561,7 +6564,7 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail) before_p, curr_insn, max_uid)) { if (reg->subreg_p) - lra_risky_transformations_p = true; + check_and_force_assignment_correctness_p = true; change_p = true; /* Invalidate. */ usage_insns[src_regno].check = 0; |