diff options
author | Richard Henderson <rth@redhat.com> | 2003-06-12 17:34:04 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2003-06-12 17:34:04 -0700 |
commit | 8433f113b64cc38f12215561ac79bddba6051b4c (patch) | |
tree | 6fc709a43bab07b0b7c9276aac590b950fb4ab81 | |
parent | 974c7cc67f1a4b606853c3abd0f87f60aec4339e (diff) | |
download | gcc-8433f113b64cc38f12215561ac79bddba6051b4c.zip gcc-8433f113b64cc38f12215561ac79bddba6051b4c.tar.gz gcc-8433f113b64cc38f12215561ac79bddba6051b4c.tar.bz2 |
re PR middle-end/10475 (ICE in subreg_highpart_offset for code with long long)
PR middle-end/10475
* expmed.c (emit_store_flag): Use simplify_gen_subreg directly
for extracting sub-words.
* gcc.c-torture/compile/20030612-1.c: New.
From-SVN: r67865
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expmed.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20030612-1.c | 11 |
3 files changed, 32 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d2df27..da431d5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2003-06-12 Richard Henderson <rth@redhat.com> + PR middle-end/10475 + * expmed.c (emit_store_flag): Use simplify_gen_subreg directly + for extracting sub-words. + +2003-06-12 Richard Henderson <rth@redhat.com> + PR target/7594 * config/m68k/m68k.md (zero_extendhisi2): Use gen_lowpart_SUBREG. (zero_extendqihi2, zero_extendqisi2): Likewise. diff --git a/gcc/expmed.c b/gcc/expmed.c index 5cc0894..4300756 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -4354,19 +4354,27 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep) { if (code == EQ || code == NE) { + rtx op00, op01, op0both; + /* Do a logical OR of the two words and compare the result. */ - rtx op0h = gen_highpart (word_mode, op0); - rtx op0l = gen_lowpart (word_mode, op0); - rtx op0both = expand_binop (word_mode, ior_optab, op0h, op0l, - NULL_RTX, unsignedp, OPTAB_DIRECT); + op00 = simplify_gen_subreg (word_mode, op0, mode, 0); + op01 = simplify_gen_subreg (word_mode, op0, mode, UNITS_PER_WORD); + op0both = expand_binop (word_mode, ior_optab, op00, op01, + NULL_RTX, unsignedp, OPTAB_DIRECT); if (op0both != 0) return emit_store_flag (target, code, op0both, op1, word_mode, unsignedp, normalizep); } else if (code == LT || code == GE) - /* If testing the sign bit, can just test on high word. */ - return emit_store_flag (target, code, gen_highpart (word_mode, op0), - op1, word_mode, unsignedp, normalizep); + { + rtx op0h; + + /* If testing the sign bit, can just test on high word. */ + op0h = simplify_gen_subreg (word_mode, op0, mode, + subreg_highpart_offset (word_mode, mode)); + return emit_store_flag (target, code, op0h, op1, word_mode, + unsignedp, normalizep); + } } /* From now on, we won't change CODE, so set ICODE now. */ diff --git a/gcc/testsuite/gcc.c-torture/compile/20030612-1.c b/gcc/testsuite/gcc.c-torture/compile/20030612-1.c new file mode 100644 index 0000000..8edbd92 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20030612-1.c @@ -0,0 +1,11 @@ +static inline void +foo (long long const v0, long long const v1) +{ + bar (v0 == v1); +} + +void +test (void) +{ + foo (0, 1); +} |