From 6e548df501d6447f40d294f8fc01b7d8f3b72887 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 9 Sep 2008 10:05:49 +0000 Subject: [PATCH] re PR tree-optimization/37387 (ICE in extract_range_from_binary_expr, at tree-vrp.c:2145) 2008-09-09 Richard Guenther PR tree-optimization/37387 * tree-ssa-ifcombine.c (ifcombine_iforif): Convert the name and bits to a common type. * gcc.c-torture/compile/pr37387.c: New testcase. From-SVN: r140142 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr37387.c | 11 +++++++++++ gcc/tree-ssa-ifcombine.c | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr37387.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 480ee534cc5..c7848ff20a4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-09 Richard Guenther + + PR tree-optimization/37387 + * tree-ssa-ifcombine.c (ifcombine_iforif): Convert the name + and bits to a common type. + 2008-09-09 Nick Clifton * config/v850/v850.md (return): Restore frame size restriction. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 02f91122da7..c83bb25f402 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-09 Richard Guenther + + PR tree-optimization/37387 + * gcc.c-torture/compile/pr37387.c: New testcase. + 2008-09-09 Daniel Kraft PR fortran/37411 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37387.c b/gcc/testsuite/gcc.c-torture/compile/pr37387.c new file mode 100644 index 00000000000..d338933e6ec --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37387.c @@ -0,0 +1,11 @@ +typedef long int Int; +void FuncMakeConsequencesPres (long *objDefs1) +{ + long a = (long)objDefs1; + int c = a & 0x01; + int b = 0; + if (! ( 13 <= ( c ? 0 : (((int) objDefs1 & 0x02) ? 0 : *objDefs1 )) + && b <= 0)) + ErrorQuit (); +} + diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index a4a74ee6be4..eedeb62938d 100644 --- a/gcc/tree-ssa-ifcombine.c +++ b/gcc/tree-ssa-ifcombine.c @@ -440,6 +440,25 @@ ifcombine_iforif (basic_block inner_cond_bb, basic_block outer_cond_bb) else return false; + /* As we strip non-widening conversions in finding a common + name that is tested make sure to end up with an integral + type for building the bit operations. */ + if (TYPE_PRECISION (TREE_TYPE (bits1)) + >= TYPE_PRECISION (TREE_TYPE (bits2))) + { + bits1 = fold_convert (unsigned_type_for (TREE_TYPE (bits1)), bits1); + name1 = fold_convert (TREE_TYPE (bits1), name1); + bits2 = fold_convert (unsigned_type_for (TREE_TYPE (bits2)), bits2); + bits2 = fold_convert (TREE_TYPE (bits1), bits2); + } + else + { + bits2 = fold_convert (unsigned_type_for (TREE_TYPE (bits2)), bits2); + name1 = fold_convert (TREE_TYPE (bits2), name1); + bits1 = fold_convert (unsigned_type_for (TREE_TYPE (bits1)), bits1); + bits1 = fold_convert (TREE_TYPE (bits2), bits1); + } + /* Do it. */ gsi = gsi_for_stmt (inner_cond); t = fold_build2 (BIT_IOR_EXPR, TREE_TYPE (name1), bits1, bits2);