[Bug middle-end/85344] Constant constraint check sign extends unsigned constant input operands
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85344 --- Comment #5 from Thomas Preud'homme --- (In reply to Thomas Preud'homme from comment #4) > (In reply to Thomas Preud'homme from comment #3) > > More worrying is that this code compiles without error when it should error > > out: > > > > void > > foo (void) > > { > > __asm( "%0" :: "J" ((unsigned char) 0x80)); > > } > > In which case we end up with #-128 in the assembly which is not what the > user wrote. Thus adding wrong-code tag. I have difficulty to make up my mind about what is the expected behavior for constant input in inline asm, esp. for immediate constraint. But first let's look at register constraint: asm ("mov %0, %0" : "=r"(result) : "0"((signed char) -128)); will put 0x0080 in the register holding result. It basically set the register in the mode of the immediate, so QImode here. I would have expected for a 32bit register to have the immediate as 2-complement 32bit value, ie 0xFF80 in this case. The documentation says that a general register should be used which is true in both case. Now what about asm ("%0" :: "i"((unsigned char) 128)); This gives -128 in the assembly code, on at least ARM and x86_64 targets but I would expect likewise on all targets. Likewise: asm ("%0" :: "i"(0x8000)); gives #-2147483648 in assembly for the similar reason. Here my expectation is that provided that the constant can be represented in a const_int its value as a C level constant is what should be printed in assembly and the constraint check (eg for constraint I in ARM backend) should be based on that value as well. Thoughts?
[Bug middle-end/85344] Constant constraint check sign extends unsigned constant input operands
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85344 Thomas Preud'homme changed: What|Removed |Added Keywords||wrong-code --- Comment #4 from Thomas Preud'homme --- (In reply to Thomas Preud'homme from comment #3) > More worrying is that this code compiles without error when it should error > out: > > void > foo (void) > { > __asm( "%0" :: "J" ((unsigned char) 0x80)); > } In which case we end up with #-128 in the assembly which is not what the user wrote. Thus adding wrong-code tag.
[Bug middle-end/85344] Constant constraint check sign extends unsigned constant input operands
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85344 --- Comment #3 from Thomas Preud'homme --- More worrying is that this code compiles without error when it should error out: void foo (void) { __asm( "%0" :: "J" ((unsigned char) 0x80)); }
[Bug middle-end/85344] Constant constraint check sign extends unsigned constant input operands
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85344 --- Comment #2 from Thomas Preud'homme --- I have a patch, starting testing.
[Bug middle-end/85344] Constant constraint check sign extends unsigned constant input operands
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85344 Thomas Preud'homme changed: What|Removed |Added Status|UNCONFIRMED |ASSIGNED Last reconfirmed||2018-04-11 Ever confirmed|0 |1 Known to fail||6.4.1, 7.3.1, 8.0.1 --- Comment #1 from Thomas Preud'homme --- It believe that the problem is in expand_asm_stmt (). The code calls into expand for the operand which will create a const_int of -128 with the assumption that an outer RTX will tell how to interpret that constant (eg. zero_extend:SI (const_int -128)). However the code uses that value directly calling INTVAL on it. It should instead extend it according to the signedness of the operand so that INTVAL returns the initial value.