[Bug other/92090] [10 regression] ICE in gcc.dg/atomic/c11-atomic-exec-5.c starting with r276469
luoxhu at cn dot ibm.com
gcc-bugzilla@gcc.gnu.org
Thu Nov 7 07:35:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92090
--- Comment #10 from Xiong Hu XS Luo <luoxhu at cn dot ibm.com> ---
(In reply to Xiong Hu XS Luo from comment #9)
> (In reply to Segher Boessenkool from comment #7)
> > LRA creates
> >
> > ;; Insn is not within a basic block
> > (insn 7037 0 0 (set (reg:PTI 3703)
> > (const_wide_int 0x3ff00000000000000000000000000000)) -1
> > (nil))
> >
> > but that is not a valid insn.
> >
> > This started as
> >
> > (insn 3756 3755 3757 363 (set (reg:TI 2388)
> > (const_wide_int 0x3ff00000000000000000000000000000))
> > "c11-atomic-exec-5.c":406:1 1179 {vsx_movti_64bit}
> > (expr_list:REG_EQUIV (const_wide_int 0x3ff00000000000000000000000000000)
> > (nil)))
> >
> > (insn 3758 3757 3759 363 (set (reg:PTI 2389)
> > (subreg:PTI (reg:TI 2388) 0)) "c11-atomic-exec-5.c":406:1 623
> > {*movpti_ppc64}
> > (expr_list:REG_EQUIV (const_wide_int 0x3ff00000000000000000000000000000)
> > (nil)))
> >
> > which is fine. But we have no insns (in the md) to load an immediate into
> > a PTI reg.
>
>
> This instruction is generated in function curr_insn_transform of
> lra-constraints.c, maybe need add a target hook to avoid it if subst is
> immediate and old is PTI register?
>
> for (i = 0; i < n_operands; i++)
> {
> rtx op, subst, old;
> bool op_change_p = false;
>
> if (curr_static_id->operand[i].is_operator)
> continue;
>
> old = op = *curr_id->operand_loc[i];
> if (GET_CODE (old) == SUBREG)
> old = SUBREG_REG (old);
> subst = get_equiv_with_elimination (old, curr_insn);
> original_subreg_reg_mode[i] = VOIDmode;
> equiv_substition_p[i] = false;
> if (subst != old)
> {
> equiv_substition_p[i] = true;
> subst = copy_rtx (subst);
> lra_assert (REG_P (old));
> if (GET_CODE (op) != SUBREG)
> *curr_id->operand_loc[i] = subst;
> else
> {
> SUBREG_REG (op) = subst;
> if (GET_MODE (subst) == VOIDmode)
> original_subreg_reg_mode[i] = GET_MODE (old);
> }
> if (lra_dump_file != NULL)
> {
> fprintf (lra_dump_file,
> "Changing pseudo %d in operand %i of insn %u on equiv ",
> REGNO (old), i, INSN_UID (curr_insn));
> dump_value_slim (lra_dump_file, subst, 1);
> fprintf (lra_dump_file, "\n");
> }
This could fix the ICE, but I am not sure whether it is reasonable:
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 0db6d3151cd..325904ac473 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -3886,7 +3886,9 @@ curr_insn_transform (bool check_only_p)
subst = get_equiv_with_elimination (old, curr_insn);
original_subreg_reg_mode[i] = VOIDmode;
equiv_substition_p[i] = false;
- if (subst != old)
+ if (subst != old
+ && !(GET_MODE (old) == E_PTImode && GET_CODE (old) == REG
+ && GET_CODE (subst) == CONST_WIDE_INT))
{
equiv_substition_p[i] = true;
subst = copy_rtx (subst);
More information about the Gcc-bugs
mailing list