diff mbox

Handle BIT_INSERT_EXPR in hashable_expr_equal_p

Message ID CA+=Sn1=4BKP+AtVxWOZAyfjQEaAR=bnL0FAswFQ-Kd=0_NGPEQ@mail.gmail.com
State New
Headers show

Commit Message

Andrew Pinski July 29, 2017, 6:48 p.m. UTC
Hi,
  When I was playing around where lowering of bit-field accesses go in
the pass order, I found that DOM had the same issue as PRE had when it
came to comparing BIT_INSERT_EXPR for equality.  The same exact
testcase was showing the wrong code; gcc.dg/tree-ssa/20040324-1.c.

This fixes DOM the same way as I had fixed PRE, by special casing
BIT_INSERT_EXPR due to the implicit operand.

OK?  Bootstrapped and tested on aarch64-linux-gnu with no regressions.

Thanks,
Andrew Pinski

ChangeLog:
* tree-ssa-scopedtables.c (hashable_expr_equal_p): Check
BIT_INSERT_EXPR's operand 1
to see if the types precision matches.

Comments

Richard Biener July 31, 2017, 8:45 a.m. UTC | #1
On Sat, Jul 29, 2017 at 8:48 PM, Andrew Pinski <apinski@cavium.com> wrote:
> Hi,
>   When I was playing around where lowering of bit-field accesses go in
> the pass order, I found that DOM had the same issue as PRE had when it
> came to comparing BIT_INSERT_EXPR for equality.  The same exact
> testcase was showing the wrong code; gcc.dg/tree-ssa/20040324-1.c.
>
> This fixes DOM the same way as I had fixed PRE, by special casing
> BIT_INSERT_EXPR due to the implicit operand.
>
> OK?  Bootstrapped and tested on aarch64-linux-gnu with no regressions.

Watch excess vertical space:

+        return false;
+
+
       if (operand_equal_p (expr0->ops.ternary.opnd0,


Ok with that fixed.

Thanks,
Richard.

> Thanks,
> Andrew Pinski
>
> ChangeLog:
> * tree-ssa-scopedtables.c (hashable_expr_equal_p): Check
> BIT_INSERT_EXPR's operand 1
> to see if the types precision matches.
diff mbox

Patch

Index: tree-ssa-scopedtables.c
===================================================================
--- tree-ssa-scopedtables.c	(revision 250712)
+++ tree-ssa-scopedtables.c	(working copy)
@@ -502,6 +502,16 @@  hashable_expr_equal_p (const struct hash
 			       expr1->ops.ternary.opnd2, 0))
 	return false;
 
+      /* BIT_INSERT_EXPR has an implict operand as the type precision
+         of op1.  Need to check to make sure they are the same.  */
+      if (expr0->ops.ternary.op == BIT_INSERT_EXPR
+	  && TREE_CODE (expr0->ops.ternary.opnd1) == INTEGER_CST
+          && TREE_CODE (expr1->ops.ternary.opnd1) == INTEGER_CST
+          && TYPE_PRECISION (TREE_TYPE (expr0->ops.ternary.opnd1))
+              != TYPE_PRECISION (TREE_TYPE (expr1->ops.ternary.opnd1)))
+        return false;
+
+
       if (operand_equal_p (expr0->ops.ternary.opnd0,
 			   expr1->ops.ternary.opnd0, 0)
 	  && operand_equal_p (expr0->ops.ternary.opnd1,