https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114437
Bug ID: 114437
Summary: Inline asm with "+m,r" operand ignores input value
Product: gcc
Version: 13.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: [email protected]
Target Milestone: ---
In the following snippet, GCC seems to assume that `arg` is not read by the asm
statement and optimizes out previous stores when compiling on -O3:
```
extern int external_fn(int);
extern int arg;
int fn() {
arg = 123;
asm volatile("" : "+m,r"(arg) : : "memory");
return external_fn(arg);
}
```
Resulting asm (123 is not stored, leaving `arg` uninitialized):
```
0000000000000000 <fn>:
0: f3 0f 1e fa endbr64
4: 8b 3d 00 00 00 00 mov edi,DWORD PTR [rip+0x0] # a
<fn+0xa>
a: e9 00 00 00 00 jmp f <fn+0xf>
```
The asm snippet comes from the `DoNotOptimize` function in Google Benchmark,
where it is intended to prevent the compiler from optimizing away parts of a
micro-benchmark:
https://github.com/google/benchmark/blob/main/include/benchmark/benchmark.h#L518
Godbolt reproduction: https://godbolt.org/z/3W97dM9eW