Commit 6c0eaee7 by Richard Henderson Committed by Richard Henderson

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
parent 9e7e65a0
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> 2009-12-07 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/linux.h (ASM_SPEC): Pass -K PIC if -findirect-dispatch. * config/sparc/linux.h (ASM_SPEC): Pass -K PIC if -findirect-dispatch.
...@@ -1377,19 +1377,23 @@ setup_incoming_promotions (rtx first) ...@@ -1377,19 +1377,23 @@ setup_incoming_promotions (rtx first)
/* Eliminate sign extensions in the callee when possible. Only /* Eliminate sign extensions in the callee when possible. Only
do this when: do this when:
(a) a mode promotion has occurred; (a) A mode promotion has occurred;
(b) the mode of the register is the same as the mode of (b) The mode of the register is the same as the mode of
the argument as it is passed; and the argument as it is passed; and
(c) the signedness does not change across any of the promotions; and (c) Either there's no language level extension, or the extension
(d) when no language-level promotions (which we cannot guarantee 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, will have been done by an external caller) are necessary,
unless we know that this function is only ever called from unless we know that this function is only ever called from
the current compilation unit -- all of whose call sites will the current compilation unit -- all of whose call sites will
do the mode1 --> mode2 promotion. */ do the mode1 --> mode2 promotion. */
if (mode1 != mode3 if (mode1 != mode3
&& mode3 == mode4 && mode3 == mode4
&& uns1 == uns3 && (mode1 == mode2 || ((uns1 || !uns3) && strictly_local)))
&& (mode1 == mode2 || strictly_local))
{ {
/* Record that the value was promoted from mode1 to mode3, /* Record that the value was promoted from mode1 to mode3,
so that any sign extension at the head of the current so that any sign extension at the head of the current
......
/* 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;
}
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment