@@ -1140,6 +1140,12 @@ avr_option_override (void)
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)
b/gcc/testsuite/gcc.target/avr/torture/pr92606.c
new file mode 100644
@@ -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;
+}