Hello,
(Having a great time in Ottawa :)
move_invariant_reg has this code:
/* Replace the uses we know to be dominated. It saves work for copy
propagation, and also it is necessary so that dependent invariants
are computed right. */
if (inv->def)
{
for (use = inv->def->uses; use; use = use->next)
{
*use->pos = reg;
df_insn_rescan (use->insn);
}
}
and we're observing a case where this updates only one of two
match_dup related ioperands. This is on i386-mingwin and the insn in
question is coming from this pattern:
(define_insn "allocate_stack_worker_32"
[(set (match_operand:SI 0 "register_operand" "+a")
(unspec_volatile:SI [(match_dup 0)] UNSPECV_STACK_PROBE))
(set (reg:SI SP_REG) (minus:SI (reg:SI SP_REG) (match_dup 0)))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && TARGET_STACK_PROBE"
"call\t___chkstk"
I think the intent is to convey that __chkstk is using eax as
an argument and is clobbering it.
Is this a valid pattern ?
FWIW, we're observing the anomaly on the Ada testcase below, which
produces
.152r.loop2_done
...
(insn 46 109 48 4 p.adb:10 (parallel [
(set (reg:SI 90)
(unspec_volatile:SI [
(reg:SI 105)
] 1))
...
when compiled by mainline with -O1.
Later on, we're observing bogus code calling __chkstk without reloading
eax with the proer value at a loop branch point:
.004t.gimple
...
D.1376 = __builtin_alloca (D.1363);
...
.s
...
movl -28(%ebp), %eax # D.1363, tmp102
addl $30, %eax #, tmp102
shrl $4, %eax #, tmp103
sall $4, %eax #, tmp104
movl %eax, -32(%ebp) # tmp104, <=== compute arg in
eax
L5:
movl %esi, %edi # ivtmp.34, J8b.7
movl %esp, -16(%ebp) # saved_stack.8, saved_stack.8
call ___chkstk <==== allocate
leal 27(%esp), %eax #, tmp91
movl %eax, %edx # tmp91, A14b.4
andl $-16, %edx #, A14b.4
testl %ebx, %ebx # l.0
jle L3 #,
movb $0, (%edx) #,* A14b.4
cmpl $1, %ebx #, l.0
je L3 #,
movl $1, %eax #, J15b.6
L4:
addl $1, %eax #, J15b.6
movb $0, -1(%edx,%eax) #,
cmpl %eax, %ebx # J15b.6, l.0
jne L4 #,
L3:
leal -1(%edi), %eax #, tmp94
imull -28(%ebp), %eax # D.1363, tmp95
addl -20(%ebp), %eax # blob.2, tmp96 <==== clobber eax
movl -28(%ebp), %ecx # D.1363,
movl %ecx, 8(%esp) #,
movl %edx, 4(%esp) # A14b.4,
movl %eax, (%esp) # tmp96,* saved_stack.8
call _memcpy #
movl -16(%ebp), %esp # saved_stack.8, saved_stack.8
cmpl -24(%ebp), %edi # D.1366, J8b.7
je L2 #,
addl $1, %esi #, ivtmp.34
jmp L5 # <=== branch back
here
eax clobbered