fold-const.c (fold_ternary_loc): Preserve the location (if any) of the argument in...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 24 Mar 2011 16:15:22 +0000 (16:15 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 24 Mar 2011 16:15:22 +0000 (16:15 +0000)
* fold-const.c (fold_ternary_loc): Preserve the location (if any) of
the argument in calls to fold_truth_not_expr.

From-SVN: r171403

gcc/ChangeLog
gcc/fold-const.c

index 0bc1e9fd92bf1afb7e2c4620c2d34db913b33c39..20181f70c1247432593a88e51854d9165c8f2ebb 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * fold-const.c (fold_ternary_loc): Preserve the location (if any) of
+       the argument in calls to fold_truth_not_expr.
+
 2011-03-24  Nathan Froyd  <froydnj@codesourcery.com>
 
        * tree.c (record_node_allocation_statistics): New function.
index 9baa9eb24bc5eccd966f308cb8109620e75572bf..32b7a276bbc2509a549bd9783baa0d07f159917d 100644 (file)
@@ -13327,7 +13327,10 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
                                             TREE_OPERAND (arg0, 1))
          && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op2))))
        {
-         tem = fold_truth_not_expr (loc, arg0);
+         location_t loc0 = EXPR_LOCATION (arg0);
+         if (loc0 == UNKNOWN_LOCATION)
+           loc0 = loc;
+         tem = fold_truth_not_expr (loc0, arg0);
          if (tem && COMPARISON_CLASS_P (tem))
            {
              tem = fold_cond_expr_with_comparison (loc, type, tem, op2, op1);
@@ -13341,10 +13344,13 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
       if (truth_value_p (TREE_CODE (arg0))
          && tree_swap_operands_p (op1, op2, false))
        {
+         location_t loc0 = EXPR_LOCATION (arg0);
+         if (loc0 == UNKNOWN_LOCATION)
+           loc0 = loc;
          /* See if this can be inverted.  If it can't, possibly because
             it was a floating-point inequality comparison, don't do
             anything.  */
-         tem = fold_truth_not_expr (loc, arg0);
+         tem = fold_truth_not_expr (loc0, arg0);
          if (tem)
            return fold_build3_loc (loc, code, type, tem, op2, op1);
        }
@@ -13489,8 +13495,11 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
          && truth_value_p (TREE_CODE (arg0))
          && truth_value_p (TREE_CODE (arg1)))
        {
+         location_t loc0 = EXPR_LOCATION (arg0);
+         if (loc0 == UNKNOWN_LOCATION)
+           loc0 = loc;
          /* Only perform transformation if ARG0 is easily inverted.  */
-         tem = fold_truth_not_expr (loc, arg0);
+         tem = fold_truth_not_expr (loc0, arg0);
          if (tem)
            return fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
                                fold_convert_loc (loc, type, tem),
@@ -13502,8 +13511,11 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
          && truth_value_p (TREE_CODE (arg0))
          && truth_value_p (TREE_CODE (op2)))
        {
+         location_t loc0 = EXPR_LOCATION (arg0);
+         if (loc0 == UNKNOWN_LOCATION)
+           loc0 = loc;
          /* Only perform transformation if ARG0 is easily inverted.  */
-         tem = fold_truth_not_expr (loc, arg0);
+         tem = fold_truth_not_expr (loc0, arg0);
          if (tem)
            return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
                                fold_convert_loc (loc, type, tem),