https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92606
--- Comment #18 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Here is a x86_64 testcase:
```
typedef __UINT16_TYPE__ T;
#define NI __attribute__((noinline,noclone,no_icf))
static const __seg_fs T xyz_prog[] = { 123, 123, 123 };
static __seg_gs T xyz[] = { 123, 123, 123 };
volatile int x = 0;
NI void prf (T f)
{
if (f != 123)
__builtin_abort();
}
NI void func_progmem()
{
prf(xyz_prog[x]);
}
NI void func_ram()
{
prf(xyz[x]);
}
int main()
{
func_progmem();
func_ram();
}
```
We get:
movzwl %fs:xyz_prog(%rax,%rax), %edi
...
movzwl %gs:xyz(%rax,%rax), %edi
...
.section .rodata
.align 2
.type xyz_prog, @object
.size xyz_prog, 6
xyz_prog:
.value 123
.value 123
.value 123
.set xyz,xyz_prog
Maybe for x86_64, it is less of an issue because the fs/gs address space
overlap with the main address space.