Commit 4df6a906 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/88274 (ICE in check, at tree-vrp.c:188)

	PR tree-optimization/88274
	* tree-ssa-reassoc.c (optimize_range_tests_xor,
	optimize_range_tests_diff): If type has smaller precision than
	corresponding mode or if it has non-standard min/max, compute
	everything in a standard type for the precision.

From-SVN: r266701
parent e26584b2
2018-11-30 Jakub Jelinek <jakub@redhat.com> 2018-11-30 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/88274
* tree-ssa-reassoc.c (optimize_range_tests_xor,
optimize_range_tests_diff): If type has smaller precision than
corresponding mode or if it has non-standard min/max, compute
everything in a standard type for the precision.
PR testsuite/85368 PR testsuite/85368
* params.def (PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT): New param. * params.def (PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT): New param.
* tree-ssa-ifcombine.c (ifcombine_ifandif): If * tree-ssa-ifcombine.c (ifcombine_ifandif): If
...@@ -2537,8 +2537,23 @@ optimize_range_tests_xor (enum tree_code opcode, tree type, ...@@ -2537,8 +2537,23 @@ optimize_range_tests_xor (enum tree_code opcode, tree type,
if (!tree_int_cst_equal (lowxor, highxor)) if (!tree_int_cst_equal (lowxor, highxor))
return false; return false;
exp = rangei->exp;
scalar_int_mode mode = as_a <scalar_int_mode> (TYPE_MODE (type));
int prec = GET_MODE_PRECISION (mode);
if (TYPE_PRECISION (type) < prec
|| (wi::to_wide (TYPE_MIN_VALUE (type))
!= wi::min_value (prec, TYPE_SIGN (type)))
|| (wi::to_wide (TYPE_MAX_VALUE (type))
!= wi::max_value (prec, TYPE_SIGN (type))))
{
type = build_nonstandard_integer_type (prec, TYPE_UNSIGNED (type));
exp = fold_convert (type, exp);
lowxor = fold_convert (type, lowxor);
lowi = fold_convert (type, lowi);
highi = fold_convert (type, highi);
}
tem = fold_build1 (BIT_NOT_EXPR, type, lowxor); tem = fold_build1 (BIT_NOT_EXPR, type, lowxor);
exp = fold_build2 (BIT_AND_EXPR, type, rangei->exp, tem); exp = fold_build2 (BIT_AND_EXPR, type, exp, tem);
lowj = fold_build2 (BIT_AND_EXPR, type, lowi, tem); lowj = fold_build2 (BIT_AND_EXPR, type, lowi, tem);
highj = fold_build2 (BIT_AND_EXPR, type, highi, tem); highj = fold_build2 (BIT_AND_EXPR, type, highi, tem);
if (update_range_test (rangei, rangej, NULL, 1, opcode, ops, exp, if (update_range_test (rangei, rangej, NULL, 1, opcode, ops, exp,
...@@ -2581,6 +2596,15 @@ optimize_range_tests_diff (enum tree_code opcode, tree type, ...@@ -2581,6 +2596,15 @@ optimize_range_tests_diff (enum tree_code opcode, tree type,
if (!integer_pow2p (tem1)) if (!integer_pow2p (tem1))
return false; return false;
scalar_int_mode mode = as_a <scalar_int_mode> (TYPE_MODE (type));
int prec = GET_MODE_PRECISION (mode);
if (TYPE_PRECISION (type) < prec
|| (wi::to_wide (TYPE_MIN_VALUE (type))
!= wi::min_value (prec, TYPE_SIGN (type)))
|| (wi::to_wide (TYPE_MAX_VALUE (type))
!= wi::max_value (prec, TYPE_SIGN (type))))
type = build_nonstandard_integer_type (prec, 1);
else
type = unsigned_type_for (type); type = unsigned_type_for (type);
tem1 = fold_convert (type, tem1); tem1 = fold_convert (type, tem1);
tem2 = fold_convert (type, tem2); tem2 = fold_convert (type, tem2);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment