This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix PR tree-optimization/86066


process_store was wrongly bypassing a BIT_NOT_EXPR if there was a NOP_EXPR 
right after it in the SSA chain.

Tested on x86-64/Linux, applied on the mainline as obvious.


2018-06-06  Eric Botcazou  <ebotcazou@adacore.com>

	PR tree-optimization/86066
	* gimple-ssa-store-merging.c (process_store): Do not bypass BIT_NOT_EXPR
	for BIT_INSERT_EXPR stores.

2018-06-06  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc.dg/torture/pr86066.c: New test.

-- 
Eric Botcazou
Index: gimple-ssa-store-merging.c
===================================================================
--- gimple-ssa-store-merging.c	(revision 261173)
+++ gimple-ssa-store-merging.c	(working copy)
@@ -4333,7 +4333,9 @@ pass_store_merging::process_store (gimpl
 	  && const_bitsize <= 64)
 	{
 	  /* Bypass a conversion to the bit-field type.  */
-	  if (is_gimple_assign (def_stmt) && CONVERT_EXPR_CODE_P (rhs_code))
+	  if (!bit_not_p
+	      && is_gimple_assign (def_stmt)
+	      && CONVERT_EXPR_CODE_P (rhs_code))
 	    {
 	      tree rhs1 = gimple_assign_rhs1 (def_stmt);
 	      if (TREE_CODE (rhs1) == SSA_NAME
@@ -4341,6 +4343,7 @@ pass_store_merging::process_store (gimpl
 		rhs = rhs1;
 	    }
 	  rhs_code = BIT_INSERT_EXPR;
+	  bit_not_p = false;
 	  ops[0].val = rhs;
 	  ops[0].base_addr = NULL_TREE;
 	  ops[1].base_addr = NULL_TREE;
/* PR tree-optimization/86066 */
/* Testcase by Zhendong Su <Zhendong Su> */

struct A
{
  int b:2;
  int c:2;
  unsigned d:8;
};

int main ()
{
  struct A t = { 0, 0, 2 };
 L:
  t.d = ~(~(~0 % t.d) % 2);
  if (!t.d)
    goto L;
  return 0;
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]