diff options
author | Falk Hueffner <falk@debian.org> | 2003-10-20 09:59:45 +0200 |
---|---|---|
committer | Falk Hueffner <falk@gcc.gnu.org> | 2003-10-20 09:59:45 +0200 |
commit | e006ced29a861befefecbb9acb828a5ce8289a34 (patch) | |
tree | 63f17f5aeda65008c0cc5ad0b0897006c4dfc4c2 | |
parent | 8b7ebc31f26c15615c810c708f8098c49721df98 (diff) | |
download | gcc-e006ced29a861befefecbb9acb828a5ce8289a34.zip gcc-e006ced29a861befefecbb9acb828a5ce8289a34.tar.gz gcc-e006ced29a861befefecbb9acb828a5ce8289a34.tar.bz2 |
re PR target/12654 (Incorrect comparison code generated for Alpha)
PR target/12654
* config/alpha/alpha.c (alpha_emit_conditional_branch): Don't do
comparison against constant by adjusting the argument except for
EQ and NE.
From-SVN: r72696
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20031020-1.c | 23 |
3 files changed, 34 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ebb882..20a8abc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-10-20 Falk Hueffner <falk@debian.org> + + PR target/12654 + * config/alpha/alpha.c (alpha_emit_conditional_branch): Don't do + comparison against constant by adjusting the argument except for + EQ and NE. + 2003-10-19 Mark Mitchell <mark@codesourcery.com> * config.gcc: Add support for arm926ejs, arm1026ejs, arm1136js, diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index c79a0b5..69d996a 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -3160,10 +3160,10 @@ alpha_emit_conditional_branch (enum rtx_code code) if (op1 == const0_rtx) cmp_code = NIL, branch_code = code; - /* We want to use cmpcc/bcc when we can, since there is a zero delay - bypass between logicals and br/cmov on EV5. But we don't want to - force valid immediate constants into registers needlessly. */ - else if (GET_CODE (op1) == CONST_INT) + /* If the constants doesn't fit into an immediate, but can + be generated by lda/ldah, we adjust the argument and + compare against zero, so we can use beq/bne directly. */ + else if (GET_CODE (op1) == CONST_INT && (code == EQ || code == NE)) { HOST_WIDE_INT v = INTVAL (op1), n = -v; diff --git a/gcc/testsuite/gcc.c-torture/execute/20031020-1.c b/gcc/testsuite/gcc.c-torture/execute/20031020-1.c new file mode 100644 index 0000000..526ca04 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20031020-1.c @@ -0,0 +1,23 @@ +/* PR target/12654 + The Alpha backend tried to do a >= 1024 as (a - 1024) >= 0, which fails + for very large negative values. */ +/* Origin: tg@swox.com */ + +#include <limits.h> + +extern void abort (void); + +void __attribute__((noinline)) +foo (long x) +{ + if (x >= 1024) + abort (); +} + +int +main () +{ + foo (LONG_MIN); + foo (LONG_MIN + 10000); + return 0; +} |