From db247aed5ebb6e8995f24f5e12f4acde8ee52ce5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 15 Oct 2014 12:33:02 +0200 Subject: [PATCH] tree-ssa-reassoc.c (optimize_range_tests_diff): Perform MINUS_EXPR in unsigned type to avoid undefined behavior. * tree-ssa-reassoc.c (optimize_range_tests_diff): Perform MINUS_EXPR in unsigned type to avoid undefined behavior. From-SVN: r216252 --- gcc/ChangeLog | 5 +++++ gcc/tree-ssa-reassoc.c | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5bc3571e39f..211b1daf8c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-10-15 Jakub Jelinek + + * tree-ssa-reassoc.c (optimize_range_tests_diff): Perform + MINUS_EXPR in unsigned type to avoid undefined behavior. + 2014-10-15 Eric Botcazou * stor-layout.c (self_referential_size): Do not promote arguments. diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 2e8337c8e6f..4714a389eb3 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -2250,8 +2250,13 @@ optimize_range_tests_diff (enum tree_code opcode, tree type, if (tree_log2 (tem1) < 0) return false; + type = unsigned_type_for (type); + tem1 = fold_convert (type, tem1); + tem2 = fold_convert (type, tem2); + lowi = fold_convert (type, lowi); mask = fold_build1 (BIT_NOT_EXPR, type, tem1); - tem1 = fold_binary (MINUS_EXPR, type, rangei->exp, lowi); + tem1 = fold_binary (MINUS_EXPR, type, + fold_convert (type, rangei->exp), lowi); tem1 = fold_build2 (BIT_AND_EXPR, type, tem1, mask); lowj = build_int_cst (type, 0); if (update_range_test (rangei, rangej, 1, opcode, ops, tem1, -- 2.30.2