On Fri, Sep 20, 2019 at 10:32 AM Richard Biener <[email protected]> wrote:
>
> On Fri, 20 Sep 2019, Uros Bizjak wrote:
>
> > On Thu, Sep 19, 2019 at 5:43 PM Uros Bizjak <[email protected]> wrote:
> > >
> > > On Thu, Sep 19, 2019 at 5:30 PM Richard Biener <[email protected]> wrote:
> > > >
> > > >
> > > > Boostrapped and tested on x86_64-unknown-linux-gnu.
> > > >
> > > > OK?
> > >
> > > OK.
> >
> > Hm, something is not working correctly here. For the testcase, I get:
> >
> > main:
> > vmovq %xmm0, %xmm0
> > vpxor %xmm1, %xmm1, %xmm1
> > vpsubq %xmm0, %xmm1, %xmm1
> > vpmaxsq %xmm1, %xmm0, %xmm0
> > vmovq %xmm0, %rax
> > movabsq %rax, .LC0+11532131096
> > xorl %eax, %eax
> > ret
> >
> > The first insn uses uninitialized reg.
> >
> > The _.stv pass misses initialization of r94 reg:
> >
> > (note 2 3 7 2 NOTE_INSN_FUNCTION_BEG)
> > (note 7 2 24 2 NOTE_INSN_DELETED)
> > (insn 24 7 8 2 (set (subreg:V2DI (reg:DI 93) 0)
> > (vec_concat:V2DI (reg:DI 94)
> > (const_int 0 [0]))) "pr67271.c":11:17 -1
> > (nil))
>
> Hmm, it emits the instruction in the wrong spot for the caller
>
> emit_insn_before (gen_rtx_SET (gen_rtx_SUBREG (vmode, tmp, 0),
> gen_gpr_to_xmm_move_src (vmode,
> *op)),
> insn);
>
> we can do the following which I am testing now.
How about the attached patch? The only place we process memory operand
is from convert_op (see the function comment), and by using
gen_rtx_SET directly, we can still generate MOVABS, which is otherwise
split by using emit_move_insn.
Can you please test the attached patch instead?
Thanks,
Uros.
diff --git a/gcc/config/i386/i386-features.c b/gcc/config/i386/i386-features.c
index 546d78d99b53..9b297bac1910 100644
--- a/gcc/config/i386/i386-features.c
+++ b/gcc/config/i386/i386-features.c
@@ -668,8 +668,6 @@ scalar_chain::emit_conversion_insns (rtx insns, rtx_insn
*after)
static rtx
gen_gpr_to_xmm_move_src (enum machine_mode vmode, rtx gpr)
{
- if (!nonimmediate_operand (gpr, GET_MODE_INNER (vmode)))
- gpr = force_reg (GET_MODE_INNER (vmode), gpr);
switch (GET_MODE_NUNITS (vmode))
{
case 1:
@@ -835,6 +833,15 @@ general_scalar_chain::convert_op (rtx *op, rtx_insn *insn)
{
rtx tmp = gen_reg_rtx (GET_MODE (*op));
+ /* Handle movabs. */
+ if (!memory_operand (*op, GET_MODE (*op)))
+ {
+ rtx tmp2 = gen_reg_rtx (GET_MODE (*op));
+
+ emit_insn_before (gen_rtx_SET (tmp2, *op), insn);
+ *op = tmp2;
+ }
+
emit_insn_before (gen_rtx_SET (gen_rtx_SUBREG (vmode, tmp, 0),
gen_gpr_to_xmm_move_src (vmode, *op)),
insn);