This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: conflict matrix vs reload
- To: Joern Rennecke <amylaar at cygnus dot co dot uk>
- Subject: Re: conflict matrix vs reload
- From: Jeffrey A Law <law at cygnus dot com>
- Date: Wed, 17 Nov 1999 10:17:51 -0700
- cc: amylaar at cygnus dot com, gcc at gcc dot gnu dot org
- Reply-To: law at cygnus dot com
In message <199911171612.QAA02006@phal.cygnus.co.uk>you write:
> Mostly right. Except that the initialized / uninitialized property is a
> property that depends on the path that the program took to reach the place
> where a pseudo dies. So you have to consider the possibility that each
> pseudo is initialized - but not at the same point of time.
You're missing the entire point. Sigh. See below.
> consider this rtl fragment:
>
> (2 1 3 (set (reg:SI 42) (and:SI (reg:SI 43) (reg:SI 44)))
> ...
> (expr_list:REG_DEAD (reg:SI 44)))
>
> (3 2 4 (set (reg:SI 45) (and:SI (not:SI (reg:SI 43)) (reg:SI 46)))
> ...
> (expr_list:REG_DEAD (reg:SI 43) (expr_list:REG_DEAD (reg:SI 46))))
>
> (4 3 5 (set (reg:SI 47) (or:SI (reg:SI 42) (reg:SI 45)))
> ...
> (expr_list:REG_DEAD (reg:SI 42) (expr_list:REG_DEAD (reg:SI 45))))
>
> Now assume that there are two paths to insn 2; on coming from one path,
> (reg:SI 43) is ~0, (reg:SI 44) is initialized, and (reg:SI 46) is
> uninitialized; on coming from the other path, (reg:SI 43) is 0, (reg:SI 44)
> is uninitialized, and (reg:SI 46) is initialized.
But those registers would be considered live on both paths. Thus, on path
A when we initialize reg44, we would create a conflict with reg46 because
reg46 was live at the point where reg44 was set.
Similarly on the path where we initialized reg46 we would have created a
conflict with reg44 because reg44 was live.
Go back to my original message, it discussed these precise issues.
jeff