On 24/06/11 09:28, Richard Guenther wrote:
>> > To be clear, it only skips past NOP_EXPR. Is it not the case that what
>> > you're describing would need a CONVERT_EXPR?
> NOP_EXPR is the same as CONVERT_EXPR.
Are you sure?
I thought this was safe because the internals manual says:
NOP_EXPR
These nodes are used to represent conversions that do not require any
code-generation ....
CONVERT_EXPR
These nodes are similar to NOP_EXPRs, but are used in those
situations where code may need to be generated ....
So, I tried this example:
int
foo (int a, short b, short c)
{
int bc = b * c;
return a + (short)bc;
}
Both before and after my patch, GCC gives:
mul r2, r1, r2
sxtah r0, r0, r2
(where, SXTAH means sign-extend the third operand from HImode to SImode
and add to the second operand.)
The dump after the widening_mult pass is:
foo (int a, short int b, short int c)
{
int bc;
int D.2018;
short int D.2017;
int D.2016;
int D.2015;
int D.2014;
<bb 2>:
D.2014_2 = (int) b_1(D);
D.2015_4 = (int) c_3(D);
bc_5 = b_1(D) w* c_3(D);
D.2017_6 = (short int) bc_5;
D.2018_7 = (int) D.2017_6;
D.2016_9 = D.2018_7 + a_8(D);
return D.2016_9;
}
Where you can clearly see that the addition has not been recognised as a
multiply-and-accumulate.
When I step through convert_plusminus_to_widen, I can see that the
reason it has not matched is because "D.2017_6 = (short int) bc_5" is
encoded with a CONVERT_EXPR, just as the manual said it would be.
So, according to the manual, and my (admittedly limited) experiments,
skipping over NOP_EXPR does appear to be safe.
But you say that it isn't safe. So now I'm confused. :(
I can certainly add checks to make sure that the skipped operations
actually don't make any important changes to the value, but do I need to?
Andrew