[Bug tree-optimization/97053] [10/11 Regression] an O2, O3 codegen bug

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Sep 15 06:21:07 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97053

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |10.3
             Status|UNCONFIRMED                 |NEW
            Summary|an O2, O3 codegen bug       |[10/11 Regression] an O2,
                   |                            |O3 codegen bug
          Component|c++                         |tree-optimization
                 CC|                            |ebotcazou at gcc dot gnu.org,
                   |                            |jakub at gcc dot gnu.org
   Last reconfirmed|                            |2020-09-15
           Priority|P3                          |P2
     Ever confirmed|0                           |1
           Keywords|                            |wrong-code

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  It is store-mergings wrong-doing:

> diff -u t.ii.194t.widening_mul t.ii.195t.store-merging
--- t.ii.194t.widening_mul      2020-09-15 08:15:39.824282586 +0200
+++ t.ii.195t.store-merging     2020-09-15 08:15:39.824282586 +0200
@@ -1,6 +1,10 @@

 ;; Function main (main, funcdef_no=26, decl_uid=3207, cgraph_uid=27,
symbol_order=26) (executed once)

+Coalescing successful!
+Merged into 1 stores
+New sequence of 2 stores to replace old one of 3 stores
+Merging successful!
 main (int argc, char * * argv)
 {
   const size_t len;
@@ -11,12 +15,11 @@
   <bb 2> [local count: 1073741824]:
   orig = "XXXXXXXX";
   memcpy (&orig, "ABCD", 4);
-  MEM <char[12]> [(struct Data *)&data + 8B] = {};
   data.n = 5;
   _7 = MEM <long unsigned int> [(char * {ref-all})&orig];
   MEM <long unsigned int> [(char * {ref-all})&data + 2B] = _7;
-  data.s = 88;
-  data.b = 1;
+  MEM <unsigned long> [(struct Data *)&data + 8B] = 0;
+  MEM <unsigned long> [(void *)&data + 16B] = 4294967384;
   len_11 = strlen (&data.name);
   printf ("runtime len=%lu\n", len_11);
   printf ("orig=%s\ncopy=%s\n", &orig, &data.name);

we merge data + 8 = {} "across" data + 2 = _7 but fail to see they alias.


More information about the Gcc-bugs mailing list