public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile
@ 2023-04-09 16:37 seeson at pku dot edu.cn
  2023-04-09 16:48 ` [Bug target/109457] " pinskia at gcc dot gnu.org
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: seeson at pku dot edu.cn @ 2023-04-09 16:37 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 109457
           Summary: %z[asmSymbolicName] in AssemblerTemplate fails to
                    compile
           Product: gcc
           Version: 11.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: seeson at pku dot edu.cn
  Target Milestone: ---

Created attachment 54820
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54820&action=edit
The code that fails to compile, with the .ii and .s files saved.

Ubuntu 22.04.2 LTS
g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0

When using modifier `z` on `[asmSymbolicName]`, the code won't compile.

----------------------------------------

// the one's complement addition on x86_64
template<class T>
inline T onec_add(T a, T b)
{
  asm(    "add%z[b]\t%[b], %[a]"
      "\n\tadc%z[b]\t$0, %[a]"
      : [a]"+g"(a)  // inputs
      : [b]"g"(b)   // outputs
      : "cc"        // clobbers
  );
  return a;
}

----------------------------------------

$ g++ -Wall -g -Og test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'
   42 |   asm(    "add%z[b]\t%[b], %[a]"
      |   ^~~
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'
   42 |   asm(    "add%z[b]\t%[b], %[a]"
      |   ^~~
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'
   42 |   asm(    "add%z[b]\t%[b], %[a]"
      |   ^~~
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'
   42 |   asm(    "add%z[b]\t%[b], %[a]"
      |   ^~~
test.cpp:42:3: error: invalid 'asm': invalid operand type used with operand
code 'Z'

----------------------------------------

Unexpectedly, the error report says the wrong modifier is 'Z', but what I use
is actually 'z'. I believe that something must go wrong when GCC addresses the
modifier 'z' followed by [asmSymbolicName].

I have pasted the error reporting of g++ in the code attached.

Above all, thanks a lot for the great compilers.

----------------------------------------

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
11.3.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs
--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr
--with-gcc-major-version-only --program-suffix=-11
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib
--enable-libphobos-checking=release --with-target-system-zlib=auto
--enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet
--with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32
--enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none=/build/gcc-11-xKiWfi/gcc-11-11.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-xKiWfi/gcc-11-11.3.0/debian/tmp-gcn/usr
--without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
--with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug target/109457] %z[asmSymbolicName] in AssemblerTemplate fails to compile
  2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
@ 2023-04-09 16:48 ` pinskia at gcc dot gnu.org
  2023-04-09 17:08 ` seeson at pku dot edu.cn
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-04-09 16:48 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|---                         |INVALID

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
This has nothing to do with [x] but rather the constraint g and z operand
modifier.

The g constraint is defined as:
Any register, memory or immediate integer operand is allowed, except for
registers that are not general registers.



So constant 1 will be allowed here.

While the modifier z says:
z       Print the opcode suffix for the size of the current integer operand
(one of b/w/l/q).   %z0     l

Note integer constants don't have a size ...


This is the corrected inline-asm:
template<class T>
inline T onec_add(T a, T b)
{
  asm(    "add%z[a]\t%[b], %[a]"
      "\n\tadc%z[a]\t$0, %[a]"
      : [a]"+g"(a)  // inputs
      : [b]"g"(b)   // outputs
      : "cc"        // clobbers
  );
  return a;
}



Note I see you did the replacement of [a] and [b] in your example but when you
replaced %z[b], you replaced it with %z0 rather than what it was originally
which was %z1.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug target/109457] %z[asmSymbolicName] in AssemblerTemplate fails to compile
  2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
  2023-04-09 16:48 ` [Bug target/109457] " pinskia at gcc dot gnu.org
@ 2023-04-09 17:08 ` seeson at pku dot edu.cn
  2023-04-09 17:09 ` pinskia at gcc dot gnu.org
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: seeson at pku dot edu.cn @ 2023-04-09 17:08 UTC (permalink / raw)
  To: gcc-bugs

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

lyazj <seeson at pku dot edu.cn> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|INVALID                     |FIXED
                 CC|                            |seeson at pku dot edu.cn

--- Comment #2 from lyazj <seeson at pku dot edu.cn> ---
](In reply to Andrew Pinski from comment #1)
> This has nothing to do with [x] but rather the constraint g and z operand
> modifier.
> 
> The g constraint is defined as:
> Any register, memory or immediate integer operand is allowed, except for
> registers that are not general registers.
> 
> 
> 
> So constant 1 will be allowed here.
> 
> While the modifier z says:
> z	Print the opcode suffix for the size of the current integer operand (one
> of b/w/l/q).	%z0	l
> 
> Note integer constants don't have a size ...
> 
> 
> This is the corrected inline-asm:
> template<class T>
> inline T onec_add(T a, T b)
> {
>   asm(    "add%z[a]\t%[b], %[a]"
>       "\n\tadc%z[a]\t$0, %[a]"
>       : [a]"+g"(a)  // inputs
>       : [b]"g"(b)   // outputs
>       : "cc"        // clobbers
>   );
>   return a;
> }
> 
> 
> 
> Note I see you did the replacement of [a] and [b] in your example but when
> you replaced %z[b], you replaced it with %z0 rather than what it was
> originally which was %z1.

Thanks very much for the quick and concise solution. I'm sorry that I missed
the truth that I could have probably put the modifier `z` on an immediate and
did the substitution that broke the equivalence to the original code. However,
since the modifier is case-sensitive, I suggest revising the error reporting
routines to report the improper modifier 'z' instead of 'Z' looked like a bug.
:)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug target/109457] %z[asmSymbolicName] in AssemblerTemplate fails to compile
  2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
  2023-04-09 16:48 ` [Bug target/109457] " pinskia at gcc dot gnu.org
  2023-04-09 17:08 ` seeson at pku dot edu.cn
@ 2023-04-09 17:09 ` pinskia at gcc dot gnu.org
  2023-04-09 17:11 ` pinskia at gcc dot gnu.org
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-04-09 17:09 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|FIXED                       |INVALID

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug target/109457] %z[asmSymbolicName] in AssemblerTemplate fails to compile
  2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
                   ` (2 preceding siblings ...)
  2023-04-09 17:09 ` pinskia at gcc dot gnu.org
@ 2023-04-09 17:11 ` pinskia at gcc dot gnu.org
  2023-04-09 17:14 ` pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-04-09 17:11 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to lyazj from comment #2)
> Thanks very much for the quick and concise solution. I'm sorry that I missed
> the truth that I could have probably put the modifier `z` on an immediate
> and did the substitution that broke the equivalence to the original code.
> However, since the modifier is case-sensitive, I suggest revising the error
> reporting routines to report the improper modifier 'z' instead of 'Z' looked
> like a bug. :)

The issue there is the code which implements 'z' is shared with 'Z' and the
error message only references 'Z' and missed that it is shared with 'z'. Let me
file a bug for that.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug target/109457] %z[asmSymbolicName] in AssemblerTemplate fails to compile
  2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
                   ` (3 preceding siblings ...)
  2023-04-09 17:11 ` pinskia at gcc dot gnu.org
@ 2023-04-09 17:14 ` pinskia at gcc dot gnu.org
  2023-04-09 17:25 ` seeson at pku dot edu.cn
  2023-04-09 17:26 ` pinskia at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-04-09 17:14 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #3)
> The issue there is the code which implements 'z' is shared with 'Z' and the
> error message only references 'Z' and missed that it is shared with 'z'. Let
> me file a bug for that.

Filed as PR 109458.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug target/109457] %z[asmSymbolicName] in AssemblerTemplate fails to compile
  2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
                   ` (4 preceding siblings ...)
  2023-04-09 17:14 ` pinskia at gcc dot gnu.org
@ 2023-04-09 17:25 ` seeson at pku dot edu.cn
  2023-04-09 17:26 ` pinskia at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: seeson at pku dot edu.cn @ 2023-04-09 17:25 UTC (permalink / raw)
  To: gcc-bugs

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

lyazj <seeson at pku dot edu.cn> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|INVALID                     |---

--- Comment #5 from lyazj <seeson at pku dot edu.cn> ---
Thanks a lot! Please feel free to tell me if needing any help or have further
progress.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug target/109457] %z[asmSymbolicName] in AssemblerTemplate fails to compile
  2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
                   ` (5 preceding siblings ...)
  2023-04-09 17:25 ` seeson at pku dot edu.cn
@ 2023-04-09 17:26 ` pinskia at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-04-09 17:26 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |INVALID
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=109458
             Status|UNCONFIRMED                 |RESOLVED

--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Invalid as explained, the diagnostic issue was filed seperately as PR 109458.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-04-09 17:26 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-09 16:37 [Bug c++/109457] New: %z[asmSymbolicName] in AssemblerTemplate fails to compile seeson at pku dot edu.cn
2023-04-09 16:48 ` [Bug target/109457] " pinskia at gcc dot gnu.org
2023-04-09 17:08 ` seeson at pku dot edu.cn
2023-04-09 17:09 ` pinskia at gcc dot gnu.org
2023-04-09 17:11 ` pinskia at gcc dot gnu.org
2023-04-09 17:14 ` pinskia at gcc dot gnu.org
2023-04-09 17:25 ` seeson at pku dot edu.cn
2023-04-09 17:26 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).