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.
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,