https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92346

--- Comment #2 from wierton <141242068 at smail dot nju.edu.cn> ---
(In reply to Andrew Pinski from comment #1)
> This code is clearly undefined.
> 
> First you say eax is in eax and then then you say the register gets
> clobbered by the inline-asm (and is set by the inline-asm).
> But you only set the lower bits of the eax to be 1 in the inline-asm.
> 
> In the -O0 case, what is happening is eax is both the output register and
> the clobbered.
> In the -O2 case, the eax is not used as the output register but rather a
> different one as eax would conflict with the clobber register.
> 
> You can see that effect by outputing %0 and %1 in the inline-asm template.
> 
> Basically the inline-asm is broken and is not expected to work the way you
> expected it to work.

I feel so sorry for my previous manner of speaking, finding a bug in big
project such as gcc makes me a little excited. I simplified the code as
following:
```
#include <stdio.h>

int set_eax(int val) { return val; }

int main() {
  int ax, tmp;
  register int eax asm("eax") = set_eax(0x23232323);
  asm volatile("movl $1, %%eax\n" ::: "eax");
  printf("%08x\n", eax);
  return 0;
}
```

This code can reproduce the phenomenon and there are no output constraints. I
do understand that the declaration %eax in eax is conflict with the inline
assembly clobber list, but in compiler such as clang, this dependency will be
detected and clang will extraly generate a move instruction to save the eax and
the resume it. I think gcc is a mostly widely used compiler, we as users expect
this compiler becomes better and better, and this feature will help improve the
usability, so I post it here. Very sorry for previous post.

The binary code generated by clang:
```
 8048451: 89 45 f0           mov    %eax,-0x10(%ebp)  // save eax
 8048454: b8 01 00 00 00     mov    $0x1,%eax   // inline assembly
 8048459: 8d 05 00 85 04 08  lea    0x8048500,%eax
 804845f: 8b 4d f0           mov    -0x10(%ebp),%ecx // restore the value to
ecx
 8048462: 89 04 24           mov    %eax,(%esp)
 8048465: 89 4c 24 04        mov    %ecx,0x4(%esp)
 8048469: e8 52 fe ff ff     call   80482c0 <printf@plt>
```

Reply via email to