https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92090

Xiong Hu XS Luo <luoxhu at cn dot ibm.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |linkw at gcc dot gnu.org

--- Comment #9 from Xiong Hu XS Luo <luoxhu at cn dot ibm.com> ---
(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");
              }

Reply via email to