re PR rtl-optimization/42269 (Extra sign extension instructions generated)

PR rtl-opt/42269
        * combine.c (setup_incoming_promotions): Improve the conditions
        under which we respect the promotions applied.

From-SVN: r155071
This commit is contained in:
Richard Henderson 2009-12-07 16:44:28 -08:00 committed by Richard Henderson
parent 9e7e65a08b
commit 6c0eaee7d2
4 changed files with 44 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2009-12-07 Richard Henderson <rth@redhat.com>
PR rtl-opt/42269
* combine.c (setup_incoming_promotions): Improve the conditions
under which we respect the promotions applied.
2009-12-07 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/linux.h (ASM_SPEC): Pass -K PIC if -findirect-dispatch.

View File

@ -1377,19 +1377,23 @@ setup_incoming_promotions (rtx first)
/* Eliminate sign extensions in the callee when possible. Only
do this when:
(a) a mode promotion has occurred;
(b) the mode of the register is the same as the mode of
(a) A mode promotion has occurred;
(b) The mode of the register is the same as the mode of
the argument as it is passed; and
(c) the signedness does not change across any of the promotions; and
(d) when no language-level promotions (which we cannot guarantee
(c) Either there's no language level extension, or the extension
from source to end result is valid. The later case is true
when the signedness of the extensions match, or when the
language level extension is unsigned. In the later case,
a zero extension followed by a sign extension is the same
as one big zero extension.
(d) When no language-level promotions (which we cannot guarantee
will have been done by an external caller) are necessary,
unless we know that this function is only ever called from
the current compilation unit -- all of whose call sites will
do the mode1 --> mode2 promotion. */
if (mode1 != mode3
&& mode3 == mode4
&& uns1 == uns3
&& (mode1 == mode2 || strictly_local))
&& (mode1 == mode2 || ((uns1 || !uns3) && strictly_local)))
{
/* Record that the value was promoted from mode1 to mode3,
so that any sign extension at the head of the current

View File

@ -0,0 +1,15 @@
/* Make sure that language + abi extensions in passing S interoperate. */
static long long __attribute__((noinline))
foo (unsigned short s)
{
return (short) s;
}
unsigned short s = 0xFFFF;
int
main (void)
{
return foo (s) + 1 != 0;
}

View File

@ -0,0 +1,13 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
/* { dg-final { scan-assembler-not "addl" } } */
unsigned
parity (unsigned x)
{
x ^= x >> 16;
x ^= x >> 8;
x ^= x >> 4;
x &= 0xf;
return (0x6996 >> x) & 1;
}