public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-4798] ifcvt: Don't lower bitfields with non-constant offsets [PR 111882]
@ 2023-10-20 16:03 Andre Simoes Dias Vieira
  0 siblings, 0 replies; only message in thread
From: Andre Simoes Dias Vieira @ 2023-10-20 16:03 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:24cf1f600b8ad34c68a51f48884e72d01f729893

commit r14-4798-g24cf1f600b8ad34c68a51f48884e72d01f729893
Author: Andre Vieira <andre.simoesdiasvieira@arm.com>
Date:   Fri Oct 20 17:02:32 2023 +0100

    ifcvt: Don't lower bitfields with non-constant offsets [PR 111882]
    
    This patch stops lowering of bitfields by ifcvt when they have non-constant
    offsets as we are not likely to be able to do anything useful with those during
    vectorization.  That also fixes the issue reported in PR 111882, which was
    being caused by an offset with a side-effect being lowered, but constants have
    no side-effects so we will no longer run into that problem.
    
    gcc/ChangeLog:
    
            PR tree-optimization/111882
            * tree-if-conv.cc (get_bitfield_rep): Return NULL_TREE for bitfields
            with non-constant offsets.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/vect/pr111882.c: New test.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr111882.c | 15 +++++++++++++++
 gcc/tree-if-conv.cc                  | 12 +++++++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/vect/pr111882.c b/gcc/testsuite/gcc.dg/vect/pr111882.c
new file mode 100644
index 000000000000..024ad57b6930
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr111882.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-additional-options { -fdump-tree-ifcvt-all } } */
+
+static void __attribute__((noipa)) f(int n) {
+  int i, j;
+  struct S { char d[n]; int a; int b : 17; int c : 12; };
+  struct S A[100][1111];
+  for (i = 0; i < 100; i++) {
+    asm volatile("" : : "g"(&A[0][0]) : "memory");
+    for (j = 0; j < 1111; j++) A[i][j].b = 2;
+  }
+}
+void g(void) { f(1); }
+
+/* { dg-final { scan-tree-dump-not "Bitfield OK to lower" "ifcvt" } } */
diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
index dab7eeb7707a..262765139ff3 100644
--- a/gcc/tree-if-conv.cc
+++ b/gcc/tree-if-conv.cc
@@ -3495,6 +3495,7 @@ get_bitfield_rep (gassign *stmt, bool write, tree *bitpos,
 			: gimple_assign_rhs1 (stmt);
 
   tree field_decl = TREE_OPERAND (comp_ref, 1);
+  tree ref_offset = component_ref_field_offset (comp_ref);
   tree rep_decl = DECL_BIT_FIELD_REPRESENTATIVE (field_decl);
 
   /* Bail out if the representative is not a suitable type for a scalar
@@ -3509,6 +3510,15 @@ get_bitfield_rep (gassign *stmt, bool write, tree *bitpos,
   if (compare_tree_int (DECL_SIZE (field_decl), bf_prec) != 0)
     return NULL_TREE;
 
+  if (TREE_CODE (DECL_FIELD_OFFSET (rep_decl)) != INTEGER_CST
+      || TREE_CODE (ref_offset) != INTEGER_CST)
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "\t Bitfield NOT OK to lower,"
+			    " offset is non-constant.\n");
+      return NULL_TREE;
+    }
+
   if (struct_expr)
     *struct_expr = TREE_OPERAND (comp_ref, 0);
 
@@ -3529,7 +3539,7 @@ get_bitfield_rep (gassign *stmt, bool write, tree *bitpos,
 	 the structure and the container from the number of bits from the start
 	 of the structure and the actual bitfield member. */
       tree bf_pos = fold_build2 (MULT_EXPR, bitsizetype,
-				 DECL_FIELD_OFFSET (field_decl),
+				 ref_offset,
 				 build_int_cst (bitsizetype, BITS_PER_UNIT));
       bf_pos = fold_build2 (PLUS_EXPR, bitsizetype, bf_pos,
 			    DECL_FIELD_BIT_OFFSET (field_decl));

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-20 16:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-20 16:03 [gcc r14-4798] ifcvt: Don't lower bitfields with non-constant offsets [PR 111882] Andre Simoes Dias Vieira

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).