https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102733
Bug ID: 102733
Summary: missing fs:0 store when followed by one to gs:0
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
While testing r12-4376 I noticed that when a fs:0 store is followed by one to
gs:0 the former is not emitted, otherwise when each is done on its own each is
also emitted on its own. My very basic understanding is that the FS and GS
namespaces are distinct with null being a valid address of a distinct location
in each (and so I would expect both stores to be emitted) but I leave it
experts to confirm or resolve this as invalid.
$ cat z.c && gcc -O -S -Wall -o/dev/stdout z.c
void test_null_store_fs (void)
{
int __seg_fs *fs = (int __seg_fs *)0;
*fs = 1; // fs:0 store emitted
}
void test_null_store_gs (void)
{
int __seg_gs *gs = (int __seg_gs *)0;
*gs = 2; // gs:0 store emitted
}
void test_null_store_fs_gs (void)
{
int __seg_fs *fs = (int __seg_fs *)0;
*fs = 1; // store missing
int __seg_gs *gs = (int __seg_gs *)0;
*gs = 2; // gs:0 store emitted
}
.file "z.c"
.text
.globl test_null_store_fs
.type test_null_store_fs, @function
test_null_store_fs:
.LFB0:
.cfi_startproc
movl $1, %fs:0
ret
.cfi_endproc
.LFE0:
.size test_null_store_fs, .-test_null_store_fs
.globl test_null_store_gs
.type test_null_store_gs, @function
test_null_store_gs:
.LFB1:
.cfi_startproc
movl $2, %gs:0
ret
.cfi_endproc
.LFE1:
.size test_null_store_gs, .-test_null_store_gs
.globl test_null_store_fs_gs
.type test_null_store_fs_gs, @function
test_null_store_fs_gs:
.LFB2:
.cfi_startproc
movl $2, %gs:0
ret
.cfi_endproc
.LFE2:
.size test_null_store_fs_gs, .-test_null_store_fs_gs
.ident "GCC: (GNU) 12.0.0 20211013 (experimental)"
.section .note.GNU-stack,"",@progbits