From: Jakub Jelinek Date: Thu, 18 Jun 2015 14:06:04 +0000 (+0200) Subject: re PR tree-optimization/66233 (internal compiler error: in expand_fix, at optabs... X-Git-Tag: releases/gcc-4.8.5~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e25ba8531a2d83733997df73be1200bd0a90bd18;p=thirdparty%2Fgcc.git re PR tree-optimization/66233 (internal compiler error: in expand_fix, at optabs.c:5358) PR tree-optimization/66233 * fold-const.c (fold_unary_loc): Don't handle vector types. Simplify. * tree-ssa-forwprop.c (combine_conversions): Likewise. * gcc.c-torture/execute/pr66233.c: New test. From-SVN: r224611 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 263a8cec8b8a..4ee4479e2278 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-06-18 Jakub Jelinek + + PR tree-optimization/66233 + * fold-const.c (fold_unary_loc): Don't handle vector types. + Simplify. + * tree-ssa-forwprop.c (combine_conversions): Likewise. + 2015-06-16 Richard Biener Revert diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 117153175b61..f06bef615736 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7935,16 +7935,12 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) (for integers). Avoid this if the final type is a pointer since then we sometimes need the middle conversion. Likewise if the final type has a precision not equal to the size of its mode. */ - if (((inter_int && inside_int) - || (inter_float && inside_float) - || (inter_vec && inside_vec)) + if (((inter_int && inside_int) || (inter_float && inside_float)) + && (final_int || final_float) && inter_prec >= inside_prec - && (inter_float || inter_vec - || inter_unsignedp == inside_unsignedp) + && (inter_float || inter_unsignedp == inside_unsignedp) && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type)) - && TYPE_MODE (type) == TYPE_MODE (inter_type)) - && ! final_ptr - && (! final_vec || inter_prec == inside_prec)) + && TYPE_MODE (type) == TYPE_MODE (inter_type))) return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0)); /* If we have a sign-extension of a zero-extended value, we can diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6807d7683405..6331bcbdaeaf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-18 Jakub Jelinek + + PR tree-optimization/66233 + * gcc.c-torture/execute/pr66233.c: New test. + 2015-06-12 Jakub Jelinek PR middle-end/63608 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr66233.c b/gcc/testsuite/gcc.c-torture/execute/pr66233.c new file mode 100644 index 000000000000..b0d63b685849 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr66233.c @@ -0,0 +1,22 @@ +/* PR tree-optimization/66233 */ + +unsigned int v[8]; + +__attribute__((noinline, noclone)) void +foo (void) +{ + int i; + for (i = 0; i < 8; i++) + v[i] = (float) i; +} + +int +main () +{ + unsigned int i; + foo (); + for (i = 0; i < 8; i++) + if (v[i] != i) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index d617f5b625d4..14e01a81d3dc 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -2474,16 +2474,12 @@ combine_conversions (gimple_stmt_iterator *gsi) (for integers). Avoid this if the final type is a pointer since then we sometimes need the middle conversion. Likewise if the final type has a precision not equal to the size of its mode. */ - if (((inter_int && inside_int) - || (inter_float && inside_float) - || (inter_vec && inside_vec)) + if (((inter_int && inside_int) || (inter_float && inside_float)) + && (final_int || final_float) && inter_prec >= inside_prec - && (inter_float || inter_vec - || inter_unsignedp == inside_unsignedp) + && (inter_float || inter_unsignedp == inside_unsignedp) && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type)) - && TYPE_MODE (type) == TYPE_MODE (inter_type)) - && ! final_ptr - && (! final_vec || inter_prec == inside_prec)) + && TYPE_MODE (type) == TYPE_MODE (inter_type))) { gimple_assign_set_rhs1 (stmt, defop0); update_stmt (stmt);