https://gcc.gnu.org/g:231728b6dd7684e031f2a05e7e43bab54b7f2c5e

commit r12-10418-g231728b6dd7684e031f2a05e7e43bab54b7f2c5e
Author: Georg-Johann Lay <a...@gjlay.de>
Date:   Fri May 3 18:47:50 2024 +0200

    AVR: ipa/92606 - Don't optimize PROGMEM data against non-PROGMEM.
    
    ipa/92606: Inter-procedural analysis optimizes data across
    address-spaces and PROGMEM.  As of v14, the PROGMEM part is
    still not fixed (and there is still no target hook as proposed
    in PR92932).  Just disable respective bogus optimization.
    
            PR ipa/92606
    gcc/
            * config/avr/avr.cc (avr_option_override): Set
            flag_ipa_icf_variables = 0.
    gcc/testsuite/
            * gcc.target/avr/torture/pr92606.c: New test.
    
    (cherry picked from commit 08e752e72363ae7fd5a5fcb70913a0f7b240387b)

Diff:
---
 gcc/config/avr/avr.cc                          | 10 +++++
 gcc/testsuite/gcc.target/avr/torture/pr92606.c | 57 ++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index 1905ac5790c..bc15017c61c 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -1095,6 +1095,16 @@ avr_option_override (void)
       flag_omit_frame_pointer = 0;
     }
 
+  /* Disable flag_delete_null_pointer_checks if zero is a valid address. */
+  if (targetm.addr_space.zero_address_valid (ADDR_SPACE_GENERIC))
+    flag_delete_null_pointer_checks = 0;
+
+  /* PR ipa/92606: Inter-procedural analysis optimizes data across
+     address-spaces and PROGMEM.  As of v14, the PROGMEM part is
+     still not fixed (and there is still no target hook as proposed
+     in PR92932).  Just disable respective bogus optimization.  */
+  flag_ipa_icf_variables = 0;
+
   if (flag_pic == 1)
     warning (OPT_fpic, "%<-fpic%> is not supported");
   if (flag_pic == 2)
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr92606.c 
b/gcc/testsuite/gcc.target/avr/torture/pr92606.c
new file mode 100644
index 00000000000..cc07128c73b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr92606.c
@@ -0,0 +1,57 @@
+/* { dg-do run } */
+
+typedef __UINT16_TYPE__ uint16_t;
+typedef __UINT32_TYPE__ uint32_t;
+
+typedef uint32_t T;
+
+#define NI __attribute__((noinline,noclone))
+
+
+#ifndef __AVR_TINY__
+#define read_u32(X)                                                     \
+    (__extension__(                                                     \
+        {                                                               \
+            uint16_t __addr16 = (uint16_t)(X);                          \
+            uint32_t __result;                                          \
+            __asm__ __volatile__ ("lpm %A0, Z+" "\n\t"                  \
+                                  "lpm %B0, Z+" "\n\t"                  \
+                                  "lpm %C0, Z+" "\n\t"                  \
+                                  "lpm %D0, Z" "\n\t"                   \
+                                  : "=r" (__result), "+z" (__addr16));  \
+            __result;                                                   \
+        }))
+#else
+NI uint32_t read_u32 (const uint32_t *p)
+{
+       return *p;
+}
+#endif
+
+static const __attribute((progmem)) T xyz_prog[] = { 123, 123, 123 };
+T xyz[] = { 123, 123, 123 };
+volatile int x = 0;
+
+NI void prf (T f)
+{
+    if (f != 123)
+        __builtin_abort();
+}
+
+NI void func_progmem()
+{
+    prf (read_u32 (&xyz_prog[0]));
+}
+
+NI void func_ram()
+{
+    prf (xyz[x]);
+}
+
+int main (void)
+{
+    func_progmem();
+    func_ram();
+
+       return 0;
+}

Reply via email to