diff options
author | Jakub Jelinek <jakub@redhat.com> | 2002-04-11 22:56:29 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-04-11 22:56:29 +0200 |
commit | 578fc63d144bcd49d723090a9c24f4cd69ce621d (patch) | |
tree | 575254a3262709e2caa696b88af2e2cf499d1cc8 /gcc | |
parent | b4f6d08917852c7180de99f354478d152f2392a3 (diff) | |
download | gcc-578fc63d144bcd49d723090a9c24f4cd69ce621d.zip gcc-578fc63d144bcd49d723090a9c24f4cd69ce621d.tar.gz gcc-578fc63d144bcd49d723090a9c24f4cd69ce621d.tar.bz2 |
re PR c/6223 (internal compiler error in Wine-20020310)
PR c/6223
* combine.c (if_then_else_cond): Use trunc_int_for_mode on nz.
* gcc.dg/20020411-1.c: New test.
From-SVN: r52176
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/combine.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20020411-1.c | 50 |
4 files changed, 63 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb2ba32..34c0f0f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-04-11 Jakub Jelinek <jakub@redhat.com> + + PR c/6223 + * combine.c (if_then_else_cond): Use trunc_int_for_mode on nz. + 2002-04-10 David O'Brien <obrien@FreeBSD.org> * config/alpha/freebsd.h: Minor reformatting. diff --git a/gcc/combine.c b/gcc/combine.c index 9a9d648..e051c61 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7382,7 +7382,7 @@ if_then_else_cond (x, ptrue, pfalse) && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT && exact_log2 (nz = nonzero_bits (x, mode)) >= 0) { - *ptrue = GEN_INT (nz), *pfalse = const0_rtx; + *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx; return x; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 93ef461..df40cb4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2002-04-11 Jakub Jelinek <jakub@redhat.com> + + PR c/6223 + * combine.c (if_then_else_cond): Use trunc_int_for_mode on nz. + + * gcc.dg/20020411-1.c: New test. + 2002-04-10 Janis Johnson <janis187@us.ibm.com> * g77.f-torture/execute/6177.f: New test. diff --git a/gcc/testsuite/gcc.dg/20020411-1.c b/gcc/testsuite/gcc.dg/20020411-1.c new file mode 100644 index 0000000..d8a9392 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20020411-1.c @@ -0,0 +1,50 @@ +/* PR c/6223 + This testcase ICEd in internal check because a constant was not truncated + for its mode. */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-options "-O2 -march=i686" { target i?86-*-* } } */ + +typedef struct +{ + unsigned a : 16; + unsigned b : 16; + unsigned c : 5; + unsigned d : 2; + unsigned e : 1; + unsigned f : 4; + unsigned g : 1; + unsigned h : 1; + unsigned i : 1; + unsigned j : 1; +} T; + +inline void +foo (T *x, unsigned int y) +{ + if ((x->j = (y >= 0x100000))) + y >>= 12; + x->a = y; + x->f = (y >> 16); +} + +void __attribute__((noinline)) +bar (T *x) +{ +} + +void +baz (unsigned int x, unsigned char y) +{ + T t; + + foo (&t, x - 1); + t.e = 1; + t.c = y; + t.g = 0; + t.h = 0; + t.i = (y & 0x40) != 0; + if (x == 1) + foo (&t, 1); + bar (&t); +} |