When printing vector element for example: printf ("%s %016llx,%016llx\n", prefix, val[1], val[0]); where val is a vector unsigned long long int -Wall reports: ../src/printll.c: In function ‘print_v2xint64’: ../src/printll.c:20:21: warning: format ‘%llx’ expects argument of type ‘long long unsigned int’, but argument 3 has type ‘long unsigned int’ [-Wformat=] printf ("%s %016llx,%016llx\n", prefix, val[1], val[0]); ^ Here gcc claims that val[1] is a ‘long unsigned int’ then it is actually typed as: typedef __vector unsigned long long int vui64_t; Some how the vector element extract has dropped the long long int type to long int. This should not be an issue for PPC64 as long long int and long int are both 64-bit but would matter for PPC32.
Created attachment 48851 [details] Test case for printf of vector long long int elements
Have you tried it for -m32, out of curiosity?
(In reply to Bill Schmidt from comment #2) > Have you tried it for -m32, out of curiosity? no
The issue is that 'val' has <vector_type 0x7ffff69f8c78 vui64_t type <integer_type 0x7ffff6bc97e0 long unsigned int public unsigned DI size <integer_cst 0x7ffff6bc7030 constant 64> unit-size <integer_cst 0x7ffff6bc7048 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff6bc97e0 precision:64 min <integer_cst 0x7ffff6bc7300 0> max <integer_cst 0x7ffff6bb85a0 18446744073709551615> pointer_to_this <pointer_type 0x7ffff6bd7e70>> unsigned V2DI size <integer_cst 0x7ffff6bc7078 type <integer_type 0x7ffff6bc90a8 bitsizetype> constant 128> unit-size <integer_cst 0x7ffff6bc7090 type <integer_type 0x7ffff6bc9000 sizetype> constant 16> align:128 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff6cae000 nunits:2> so the error is in processing of the __vector typedef, not in the element extract. IIRC __vector is a ppc specific keyword thus target code is likely the culprit here. It's also wrong-code for TBAA btw, accessing a unsigned long long[] via ui64_t would be invalid.
(In reply to Bill Schmidt from comment #2) > Have you tried it for -m32, out of curiosity? Local experimentation indicates building with -m32 does not report the warning.
The master branch has been updated by Will Schmidt <willschm@gcc.gnu.org>: https://gcc.gnu.org/g:d8f3474ff81b07fd2e758337957711db17eb801e commit r11-3002-gd8f3474ff81b07fd2e758337957711db17eb801e Author: Will Schmidt <will_schmidt@vnet.ibm.com> Date: Mon Jul 20 10:51:37 2020 -0500 [PATCH, rs6000] Fix vector long long subtype (PR96139) Hi, This corrects an issue with the powerpc vector long long subtypes. As reported by SjMunroe, when building some code with -Wall, and attempting to print an element of a "long long vector" with a long long printf format string, we will report an error because the vector sub-type was improperly defined as int. When defining a V2DI_type_node we use a TARGET_POWERPC64 ternary to define the V2DI_type_node with "vector long" or "vector long long". We also need to specify the proper sub-type when we define the type. PR target/96139 2020-09-03 Will Schmidt <will_schmidt@vnet.ibm.com> gcc/ChangeLog: * config/rs6000/rs6000-call.c (rs6000_init_builtin): Update V2DI_type_node and unsigned_V2DI_type_node definitions. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr96139-a.c: New test. * gcc.target/powerpc/pr96139-b.c: New test. * gcc.target/powerpc/pr96139-c.c: New test.
The releases/gcc-10 branch has been updated by Will Schmidt <willschm@gcc.gnu.org>: https://gcc.gnu.org/g:ba0bc8fa005921832c4665e5b5a18932d3f4ccf4 commit r10-8766-gba0bc8fa005921832c4665e5b5a18932d3f4ccf4 Author: Will Schmidt <will_schmidt@vnet.ibm.com> Date: Mon Jul 20 10:51:37 2020 -0500 [PATCH, rs6000] Fix vector long long subtype (PR96139) Hi, This corrects an issue with the powerpc vector long long subtypes. As reported by SjMunroe, when building some code with -Wall, and attempting to print an element of a "long long vector" with a long long printf format string, we will report an error because the vector sub-type was improperly defined as int. When defining a V2DI_type_node we use a TARGET_POWERPC64 ternary to define the V2DI_type_node with "vector long" or "vector long long". We also need to specify the proper sub-type when we define the type. PR target/96139 2020-09-03 Will Schmidt <will_schmidt@vnet.ibm.com> gcc/ChangeLog: * config/rs6000/rs6000-call.c (rs6000_init_builtin): Update V2DI_type_node and unsigned_V2DI_type_node definitions. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr96139-a.c: New test. * gcc.target/powerpc/pr96139-b.c: New test. * gcc.target/powerpc/pr96139-c.c: New test. (cherry picked from commit d8f3474ff81b07fd2e758337957711db17eb801e)
*** Bug 85198 has been marked as a duplicate of this bug. ***
The releases/gcc-9 branch has been updated by Will Schmidt <willschm@gcc.gnu.org>: https://gcc.gnu.org/g:04a9b796436c68a07c052805631e962a1126dcca commit r9-8872-g04a9b796436c68a07c052805631e962a1126dcca Author: Will Schmidt <will_schmidt@vnet.ibm.com> Date: Tue Sep 15 15:06:08 2020 -0500 [PATCH, rs6000] Fix vector long long subtype (PR96139) Hi, This corrects an issue with the powerpc vector long long subtypes. As reported by SjMunroe, when building some code with -Wall, and attempting to print an element of a "long long vector" with a long long printf format string, we will report an error because the vector sub-type was improperly defined as int. When defining a V2DI_type_node we use a TARGET_POWERPC64 ternary to define the V2DI_type_node with "vector long" or "vector long long". We also need to specify the proper sub-type when we define the type. Due to some file renames, This is a backport and rework of both [PATCH, rs6000] Fix vector long long subtype (PR96139) and [PATCH, rs6000] Testsuite fixup pr96139 tests PR target/96139 2020-09-03 Will Schmidt <will_schmidt@vnet.ibm.com> gcc/ChangeLog: * config/rs6000/rs6000.c (rs6000_init_builtin): Update V2DI_type_node and unsigned_V2DI_type_node definitions. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr96139-a.c: New test. * gcc.target/powerpc/pr96139-b.c: New test. * gcc.target/powerpc/pr96139-c.c: New test.
fix committed. closing out.
The releases/gcc-8 branch has been updated by Will Schmidt <willschm@gcc.gnu.org>: https://gcc.gnu.org/g:74c624523bdbe4329c7cb77bff222ac695e36c95 commit r8-10453-g74c624523bdbe4329c7cb77bff222ac695e36c95 Author: Will Schmidt <will_schmidt@vnet.ibm.com> Date: Wed Sep 16 11:21:04 2020 -0500 [PATCH, rs6000] Fix vector long long subtype (PR96139) Hi, This corrects an issue with the powerpc vector long long subtypes. As reported by SjMunroe, when building some code with -Wall, and attempting to print an element of a "long long vector" with a long long printf format string, we will report an error because the vector sub-type was improperly defined as int. When defining a V2DI_type_node we use a TARGET_POWERPC64 ternary to define the V2DI_type_node with "vector long" or "vector long long". We also need to specify the proper sub-type when we define the type. Due to some file renames, This is a backport and rework of both [PATCH, rs6000] Fix vector long long subtype (PR96139) and [PATCH, rs6000] Testsuite fixup pr96139 tests PR target/96139 gcc/ChangeLog: * config/rs6000/rs6000.c (rs6000_init_builtin): Update V2DI_type_node and unsigned_V2DI_type_node definitions. gcc/testsuite/ChangeLog: * gcc.target/powerpc/pr96139-a.c: New test. * gcc.target/powerpc/pr96139-b.c: New test. * gcc.target/powerpc/pr96139-c.c: New test.