From 2dd36f90d8c4f5b86667cbb11c86f6c790bd784b Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 22 May 2002 23:35:56 +0200 Subject: [PATCH] combine.c (force_to_mode): Use gen_int_mode. * combine.c (force_to_mode): Use gen_int_mode. Don't clear CONST_INT bits outside of mode. * gcc.dg/20020517-1.c: New test. From-SVN: r53750 --- gcc/ChangeLog | 5 +++++ gcc/combine.c | 21 +-------------------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/20020517-1.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/20020517-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5393a7419b5..4c9bcc7c5b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-05-22 Jakub Jelinek + + * combine.c (force_to_mode): Use gen_int_mode. + Don't clear CONST_INT bits outside of mode. + 2002-05-22 Richard Henderson * fixinc/inclhack.def (thread_keyword): Match __thread as last arg. diff --git a/gcc/combine.c b/gcc/combine.c index bdb130ca055..f90460db479 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -6703,18 +6703,7 @@ force_to_mode (x, mode, mask, reg, just_select) /* If X is a CONST_INT, return a new one. Do this here since the test below will fail. */ if (GET_CODE (x) == CONST_INT) - { - HOST_WIDE_INT cval = INTVAL (x) & mask; - int width = GET_MODE_BITSIZE (mode); - - /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative - number, sign extend it. */ - if (width > 0 && width < HOST_BITS_PER_WIDE_INT - && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0) - cval |= (HOST_WIDE_INT) -1 << width; - - return GEN_INT (cval); - } + return gen_int_mode (INTVAL (x) & mask, mode); /* If X is narrower than MODE and we want all the bits in X's mode, just get X in the proper mode. */ @@ -6920,14 +6909,6 @@ force_to_mode (x, mode, mask, reg, just_select) force_to_mode (XEXP (x, 1), mode, mask, reg, next_select)); - /* If OP1 is a CONST_INT and X is an IOR or XOR, clear bits outside - MASK since OP1 might have been sign-extended but we never want - to turn on extra bits, since combine might have previously relied - on them being off. */ - if (GET_CODE (op1) == CONST_INT && (code == IOR || code == XOR) - && (INTVAL (op1) & mask) != 0) - op1 = GEN_INT (INTVAL (op1) & mask); - if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1)) x = gen_binary (code, op_mode, op0, op1); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0459deceec6..eb4547125ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-05-22 Jakub Jelinek + + * gcc.dg/20020517-1.c: New test. + 2002-05-21 Richard Henderson * gcc.dg/tls/tls.exp, gcc.dg/tls/trivial.c, gcc.dg/tls/diag-1.c, diff --git a/gcc/testsuite/gcc.dg/20020517-1.c b/gcc/testsuite/gcc.dg/20020517-1.c new file mode 100644 index 00000000000..04386d821ec --- /dev/null +++ b/gcc/testsuite/gcc.dg/20020517-1.c @@ -0,0 +1,28 @@ +/* This testcase caused ICE in do_SUBST on IA-32, because 0xf6 constant + was not sign-extended for QImode. */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-options "-O2 -mcpu=i686" { target i?86-*-* } } */ + +#include + +void abort (void); +void exit (int); + +void foo (void) +{ + int i; + char *p; + + p = (char *) &i; + *p = -10; + if (* (unsigned char *) p != 0x100 - 10) + abort (); +} + +int main (void) +{ + if (UCHAR_MAX == 255) + foo (); + exit (0); +}