From 578fc63d144bcd49d723090a9c24f4cd69ce621d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 11 Apr 2002 22:56:29 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 ++++ gcc/combine.c | 2 +- gcc/testsuite/ChangeLog | 7 +++++ gcc/testsuite/gcc.dg/20020411-1.c | 50 +++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/20020411-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb2ba3245a9..34c0f0faef5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-04-11 Jakub Jelinek + + PR c/6223 + * combine.c (if_then_else_cond): Use trunc_int_for_mode on nz. + 2002-04-10 David O'Brien * config/alpha/freebsd.h: Minor reformatting. diff --git a/gcc/combine.c b/gcc/combine.c index 9a9d6484f56..e051c618636 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 93ef461fc1b..df40cb497fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2002-04-11 Jakub Jelinek + + 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 * 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 00000000000..d8a939254a8 --- /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); +} -- 2.30.2