aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/trans.c14
2 files changed, 14 insertions, 6 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 7022201..62a6d5c 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,11 @@
2016-10-11 Eric Botcazou <ebotcazou@adacore.com>
+ * gcc-interface/trans.c (gnat_to_gnu) <N_Op_Add>: Adjust comment.
+ <N_Op_Minus>: Add comment and missing guard.
+ * gcc-interface/trans.c (build_binary_op_trapv): Use an explicit test.
+
+2016-10-11 Eric Botcazou <ebotcazou@adacore.com>
+
* gcc-interface/utils.c (type_unsigned_for_rm): New predicate.
(make_type_from_size): Use it.
(unchecked_convert): Likewise. Do not skip the extension step if the
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index b5be373..930725b 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -6680,10 +6680,7 @@ gnat_to_gnu (Node_Id gnat_node)
/* Instead of expanding overflow checks for addition, subtraction
and multiplication itself, the front end will leave this to
- the back end when Backend_Overflow_Checks_On_Target is set.
- As the back end itself does not know yet how to properly
- do overflow checking, do it here. The goal is to push
- the expansions further into the back end over time. */
+ the back end when Backend_Overflow_Checks_On_Target is set. */
if (Do_Overflow_Check (gnat_node)
&& Backend_Overflow_Checks_On_Target
&& (code == PLUS_EXPR || code == MINUS_EXPR || code == MULT_EXPR)
@@ -6754,7 +6751,11 @@ gnat_to_gnu (Node_Id gnat_node)
gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
gnu_result_type = get_unpadded_type (Etype (gnat_node));
+ /* Instead of expanding overflow checks for negation and absolute
+ value itself, the front end will leave this to the back end
+ when Backend_Overflow_Checks_On_Target is set. */
if (Do_Overflow_Check (gnat_node)
+ && Backend_Overflow_Checks_On_Target
&& !TYPE_UNSIGNED (gnu_result_type)
&& !FLOAT_TYPE_P (gnu_result_type))
gnu_result
@@ -8937,8 +8938,9 @@ build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left,
lhs, rhs);
tree tgt = save_expr (call);
gnu_expr = build1 (REALPART_EXPR, gnu_type, tgt);
- check
- = convert (boolean_type_node, build1 (IMAGPART_EXPR, gnu_type, tgt));
+ check = fold_build2 (NE_EXPR, boolean_type_node,
+ build1 (IMAGPART_EXPR, gnu_type, tgt),
+ build_int_cst (gnu_type, 0));
return
emit_check (check, gnu_expr, CE_Overflow_Check_Failed, gnat_node);
}