diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 14 |
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); } |