Fix use of boolean_true/false_node (PR 83979)

Message ID 87lggo4y18.fsf@linaro.org
State New
Headers show
Series
  • Fix use of boolean_true/false_node (PR 83979)
Related show

Commit Message

Richard Sandiford Jan. 23, 2018, 11:25 a.m.
r255913 changed some constant_boolean_node calls to boolean_true_node
and boolean_false_node, which meant that the returned tree didn't
always have the right type.

Tested on aarch64-linux-gnu.  Probably bordering on obvious, but just
in case: OK to install?

Richard


2018-01-23  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	PR tree-optimization/83979
	* fold-const.c (fold_comparison): Use constant_boolean_node
	instead of boolean_{true,false}_node.

gcc/testsuite/
	PR tree-optimization/83979
	* g++.dg/pr83979.c: New test.

Comments

Richard Biener Jan. 24, 2018, 2:35 p.m. | #1
On Tue, Jan 23, 2018 at 12:25 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> r255913 changed some constant_boolean_node calls to boolean_true_node

> and boolean_false_node, which meant that the returned tree didn't

> always have the right type.

>

> Tested on aarch64-linux-gnu.  Probably bordering on obvious, but just

> in case: OK to install?


Ok.

Richard.

> Richard

>

>

> 2018-01-23  Richard Sandiford  <richard.sandiford@linaro.org>

>

> gcc/

>         PR tree-optimization/83979

>         * fold-const.c (fold_comparison): Use constant_boolean_node

>         instead of boolean_{true,false}_node.

>

> gcc/testsuite/

>         PR tree-optimization/83979

>         * g++.dg/pr83979.c: New test.

>

> Index: gcc/fold-const.c

> ===================================================================

> --- gcc/fold-const.c    2018-01-16 15:13:19.643832679 +0000

> +++ gcc/fold-const.c    2018-01-23 11:23:59.982555852 +0000

> @@ -8572,39 +8572,39 @@ fold_comparison (location_t loc, enum tr

>                 {

>                 case EQ_EXPR:

>                   if (known_eq (bitpos0, bitpos1))

> -                   return boolean_true_node;

> +                   return constant_boolean_node (true, type);

>                   if (known_ne (bitpos0, bitpos1))

> -                   return boolean_false_node;

> +                   return constant_boolean_node (false, type);

>                   break;

>                 case NE_EXPR:

>                   if (known_ne (bitpos0, bitpos1))

> -                   return boolean_true_node;

> +                   return constant_boolean_node (true, type);

>                   if (known_eq (bitpos0, bitpos1))

> -                   return boolean_false_node;

> +                   return constant_boolean_node (false, type);

>                   break;

>                 case LT_EXPR:

>                   if (known_lt (bitpos0, bitpos1))

> -                   return boolean_true_node;

> +                   return constant_boolean_node (true, type);

>                   if (known_ge (bitpos0, bitpos1))

> -                   return boolean_false_node;

> +                   return constant_boolean_node (false, type);

>                   break;

>                 case LE_EXPR:

>                   if (known_le (bitpos0, bitpos1))

> -                   return boolean_true_node;

> +                   return constant_boolean_node (true, type);

>                   if (known_gt (bitpos0, bitpos1))

> -                   return boolean_false_node;

> +                   return constant_boolean_node (false, type);

>                   break;

>                 case GE_EXPR:

>                   if (known_ge (bitpos0, bitpos1))

> -                   return boolean_true_node;

> +                   return constant_boolean_node (true, type);

>                   if (known_lt (bitpos0, bitpos1))

> -                   return boolean_false_node;

> +                   return constant_boolean_node (false, type);

>                   break;

>                 case GT_EXPR:

>                   if (known_gt (bitpos0, bitpos1))

> -                   return boolean_true_node;

> +                   return constant_boolean_node (true, type);

>                   if (known_le (bitpos0, bitpos1))

> -                   return boolean_false_node;

> +                   return constant_boolean_node (false, type);

>                   break;

>                 default:;

>                 }

> Index: gcc/testsuite/g++.dg/pr83979.c

> ===================================================================

> --- /dev/null   2018-01-22 18:46:35.983712806 +0000

> +++ gcc/testsuite/g++.dg/pr83979.c      2018-01-23 11:23:59.982555852 +0000

> @@ -0,0 +1,7 @@

> +/* { dg-compile } */

> +

> +int

> +foo (char* p)

> +{

> +  return p + 1000 < p;

> +}

Patch

Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c	2018-01-16 15:13:19.643832679 +0000
+++ gcc/fold-const.c	2018-01-23 11:23:59.982555852 +0000
@@ -8572,39 +8572,39 @@  fold_comparison (location_t loc, enum tr
 		{
 		case EQ_EXPR:
 		  if (known_eq (bitpos0, bitpos1))
-		    return boolean_true_node;
+		    return constant_boolean_node (true, type);
 		  if (known_ne (bitpos0, bitpos1))
-		    return boolean_false_node;
+		    return constant_boolean_node (false, type);
 		  break;
 		case NE_EXPR:
 		  if (known_ne (bitpos0, bitpos1))
-		    return boolean_true_node;
+		    return constant_boolean_node (true, type);
 		  if (known_eq (bitpos0, bitpos1))
-		    return boolean_false_node;
+		    return constant_boolean_node (false, type);
 		  break;
 		case LT_EXPR:
 		  if (known_lt (bitpos0, bitpos1))
-		    return boolean_true_node;
+		    return constant_boolean_node (true, type);
 		  if (known_ge (bitpos0, bitpos1))
-		    return boolean_false_node;
+		    return constant_boolean_node (false, type);
 		  break;
 		case LE_EXPR:
 		  if (known_le (bitpos0, bitpos1))
-		    return boolean_true_node;
+		    return constant_boolean_node (true, type);
 		  if (known_gt (bitpos0, bitpos1))
-		    return boolean_false_node;
+		    return constant_boolean_node (false, type);
 		  break;
 		case GE_EXPR:
 		  if (known_ge (bitpos0, bitpos1))
-		    return boolean_true_node;
+		    return constant_boolean_node (true, type);
 		  if (known_lt (bitpos0, bitpos1))
-		    return boolean_false_node;
+		    return constant_boolean_node (false, type);
 		  break;
 		case GT_EXPR:
 		  if (known_gt (bitpos0, bitpos1))
-		    return boolean_true_node;
+		    return constant_boolean_node (true, type);
 		  if (known_le (bitpos0, bitpos1))
-		    return boolean_false_node;
+		    return constant_boolean_node (false, type);
 		  break;
 		default:;
 		}
Index: gcc/testsuite/g++.dg/pr83979.c
===================================================================
--- /dev/null	2018-01-22 18:46:35.983712806 +0000
+++ gcc/testsuite/g++.dg/pr83979.c	2018-01-23 11:23:59.982555852 +0000
@@ -0,0 +1,7 @@ 
+/* { dg-compile } */
+
+int
+foo (char* p)
+{
+  return p + 1000 < p;
+}