diff options
author | Richard Guenther <rguenther@suse.de> | 2008-09-09 10:05:49 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-09-09 10:05:49 +0000 |
commit | 6e548df501d6447f40d294f8fc01b7d8f3b72887 (patch) | |
tree | dfe54048f3cb5947e6b5139fc262812481df1e33 /gcc/tree-ssa-ifcombine.c | |
parent | 18b0679f097a3656acf82ebbb7a703bd4c0bb174 (diff) | |
download | gcc-6e548df501d6447f40d294f8fc01b7d8f3b72887.zip gcc-6e548df501d6447f40d294f8fc01b7d8f3b72887.tar.gz gcc-6e548df501d6447f40d294f8fc01b7d8f3b72887.tar.bz2 |
re PR tree-optimization/37387 (ICE in extract_range_from_binary_expr, at tree-vrp.c:2145)
2008-09-09 Richard Guenther <rguenther@suse.de>
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
Diffstat (limited to 'gcc/tree-ssa-ifcombine.c')
-rw-r--r-- | gcc/tree-ssa-ifcombine.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index a4a74ee..eedeb62 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); |