aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Shinwell <shinwell@codesourcery.com>2007-10-08 15:28:56 +0000
committerMark Shinwell <shinwell@gcc.gnu.org>2007-10-08 15:28:56 +0000
commitb4d4a7d4b09fe843af40348786bdaae7dac4281e (patch)
tree241c0b28f58afd35e1c47290cd6bc1891754036a /gcc
parentbd113227bf7da8dfe45b9f5db511dadc9b22cb00 (diff)
downloadgcc-b4d4a7d4b09fe843af40348786bdaae7dac4281e.zip
gcc-b4d4a7d4b09fe843af40348786bdaae7dac4281e.tar.gz
gcc-b4d4a7d4b09fe843af40348786bdaae7dac4281e.tar.bz2
combine.c (setup_incoming_promotions): Ensure that arguments that have not undergone mode promotions do not...
gcc/ * combine.c (setup_incoming_promotions): Ensure that arguments that have not undergone mode promotions do not incorrectly get marked as being sign- or zero-extended. From-SVN: r129131
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/combine.c10
2 files changed, 12 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b03f6d0..1cbfa8c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-08 Mark Shinwell <shinwell@codesourcery.com>
+
+ * combine.c (setup_incoming_promotions): Ensure that
+ arguments that have not undergone mode promotions do not
+ incorrectly get marked as being sign- or zero-extended.
+
2007-10-08 Richard Guenther <rguenther@suse.de>
PR middle-end/33693
diff --git a/gcc/combine.c b/gcc/combine.c
index 392dedb..ca378bd 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -1363,15 +1363,17 @@ setup_incoming_promotions (rtx first)
/* Eliminate sign extensions in the callee when possible. Only
do this when:
- (a) 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
- (b) the signedness does not change across any of the promotions; and
- (c) when no language-level promotions (which we cannot guarantee
+ (c) the signedness does not change across any of the promotions; and
+ (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 (mode3 == mode4
+ if (mode1 != mode3
+ && mode3 == mode4
&& uns1 == uns3
&& (mode1 == mode2 || strictly_local))
{