From 91f8389c1b40190eee416a559f99a9e767698c11 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 16 Dec 2003 07:50:31 +0000 Subject: re PR rtl-optimization/13313 (Wrong code generated) PR optimization/13313 * combine.c (make_extraction) [REG]: Do not use gen_lowpart_for_combine when POS is non-zero. From-SVN: r74676 --- gcc/ChangeLog | 6 ++++++ gcc/combine.c | 7 ++++--- gcc/testsuite/ChangeLog | 12 ++++++++---- gcc/testsuite/gcc.c-torture/execute/20031216-1.c | 23 +++++++++++++++++++++++ 4 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20031216-1.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 45e05a8..733c289f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-12-16 Eric Botcazou + + PR optimization/13313 + * combine.c (make_extraction) [REG]: Do not use + gen_lowpart_for_combine when POS is non-zero. + 2003-12-16 Hartmut Penner * altivec.h (vec_cmple, vec_all_numeric): Fix typo. diff --git a/gcc/combine.c b/gcc/combine.c index 02a92c1..2c92d24 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -6043,10 +6043,11 @@ make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos, { if (tmode != inner_mode) { - if (in_dest) + /* We can't call gen_lowpart_for_combine in a DEST since we + always want a SUBREG (see below) and it would sometimes + return a new hard register. */ + if (pos || in_dest) { - /* We can't call gen_lowpart_for_combine here since we always want - a SUBREG and it would sometimes return a new hard register. */ HOST_WIDE_INT final_word = pos / BITS_PER_WORD; if (WORDS_BIG_ENDIAN diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6e1f126..3dd3a02 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-12-16 Eric Botcazou + + * gcc.c-torture/execute/20031216-1.c: New test. + 2003-12-16 Giovanni Bajo * g++.dg/template/ptrmem7.C: Simplified the test case to not hit @@ -134,10 +138,10 @@ * g++.dg/ext/visibility-5.C: Likewise. * g++.dg/ext/visibility-6.C: Likewise. -2003-12-07 Giovanni Bajo - - * g++.dg/lookup/java1.C: New test. - * g++.dg/lookup/java2.C: New test. +2003-12-07 Giovanni Bajo + + * g++.dg/lookup/java1.C: New test. + * g++.dg/lookup/java2.C: New test. 2003-12-07 Falk Hueffner diff --git a/gcc/testsuite/gcc.c-torture/execute/20031216-1.c b/gcc/testsuite/gcc.c-torture/execute/20031216-1.c new file mode 100644 index 0000000..709f016 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20031216-1.c @@ -0,0 +1,23 @@ +/* PR optimization/13313 */ +/* Origin: Mike Lerwill */ + +extern void abort(void); + +void DisplayNumber (unsigned long v) +{ + if (v != 0x9aL) + abort(); +} + +unsigned long ReadNumber (void) +{ + return 0x009a0000L; +} + +int main (void) +{ + unsigned long tmp; + tmp = (ReadNumber() & 0x00ff0000L) >> 16; + DisplayNumber (tmp); + return 0; +} -- cgit v1.1