post_inc mem in parallel rtx
BELBACHIR Selim
selim.belbachir@fr.thalesgroup.com
Fri Nov 22 17:04:00 GMT 2013
Ok so I should avoid the auto_inc alternatives in PARALLEL. It's certainly a quite rare RTL and I doubt the effort worth it.
-----Message d'origine-----
De : Jeff Law [mailto:law@redhat.com]
Envoyé : vendredi 22 novembre 2013 17:55
À : BELBACHIR Selim; gcc@gcc.gnu.org
Objet : Re: post_inc mem in parallel rtx
On 11/22/13 09:43, BELBACHIR Selim wrote:
> Hi,
>
> I encountered a bug in cselib.c:2360 using gnat7.1.2 (gcc4.7.3)
>
> /* The register should have been invalidated. */
> gcc_assert (REG_VALUES (dreg)->elt == 0); <<== assert(false)
>
>
> I investigated the dump and found that the crash occurred during 207r.dse2 pass.
>
> Here is what I saw in the previous dump (206r.pro_and_epilogue) :
>
> (insn 104 47 105 7 (parallel [
> (set (reg:CC_NOOV 56 $CCI)
> (compare:CC_NOOV (minus:SI (reg/f:SI 22 $R6 [orig:133 D.3274 ] [133])
> (mem/f:SI (post_inc:SI (reg:SI 2 $R2 [orig:140 ivtmp.363 ] [140])) [0 MEM[base: D.4517_59, offset: 0B]+0 S4 A32]))
> (const_int 0 [0])))
> (set (reg:SI 16 $R0 [153])
> (minus:SI (reg/f:SI 22 $R6 [orig:133 D.3274 ] [133])
> (mem/f:SI (post_inc:SI (reg:SI 2 $R2 [orig:140 ivtmp.363 ] [140])) [0 MEM[base: D.4517_59, offset: 0B]+0 S4 A32])))
> ])
>
> Note the post_inc MEM on $R2 appearing twice
>
> This rtl match my pattern (predicate and contraint ok) below :
>
> (define_insn "subsi3_compare0"
> [(set (reg:CC_NOOV CCI_REG)
> (compare:CC_NOOV
> (minus:SI
> (match_operand:SI 1 "general_operand" "g")
> (match_operand:SI 2 " general_operand " " g"))
> (const_int 0)))
> (set (match_operand:SI 0 "register_operand" "=r ")
> (minus:SI
> (match_dup 1)
> (match_dup 2)))]
>
> But I think It may be an error to authorize post_inc MEM in this parallel rtx in operand 1 & 2.
> When I put a more restrictive constraint which forbid the use of post_inc, the crash in cselib.c disappear.
>
> Question : What does GCC understand when the md describes a pattern allowing the same post_inc MEM in 2 slot of a parallel rtx ?
> Is it forbidden ? the MEM address is supposed to be incremented twice ?
I think the semantics are defined by the PARALLEL. Namely that the uses are evaluated, then side effects are performed. So both sets use the value before incrementing.
The only question is what is the resulting value, and given the fundamental nature of PARALLEL, I think a single visible side effect is the most obvious answer.
Now having said that, there's a distinct possibility various passes don't handle this properly.
jeff
More information about the Gcc
mailing list