Bug 96139 - Vector element extract mistypes long long int down to long int
Summary: Vector element extract mistypes long long int down to long int
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 9.3.1
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: wrong-code
: 85198 (view as bug list)
Depends on:
Blocks:
 
Reported: 2020-07-09 19:44 UTC by Steven Munroe
Modified: 2020-09-16 16:28 UTC (History)
4 users (show)

See Also:
Host:
Target: powerpc*-*-*
Build:
Known to work:
Known to fail:
Last reconfirmed: 2020-07-10 00:00:00


Attachments
Test case for printf of vector long long int elements (339 bytes, text/x-csrc)
2020-07-09 20:05 UTC, Steven Munroe
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Steven Munroe 2020-07-09 19:44:38 UTC
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.
Comment 1 Steven Munroe 2020-07-09 20:05:53 UTC
Created attachment 48851 [details]
Test case for printf of vector long long int elements
Comment 2 Bill Schmidt 2020-07-09 22:01:03 UTC
Have you tried it for -m32, out of curiosity?
Comment 3 Steven Munroe 2020-07-10 00:34:46 UTC
(In reply to Bill Schmidt from comment #2)
> Have you tried it for -m32, out of curiosity?

no
Comment 4 Richard Biener 2020-07-10 07:28:11 UTC
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.
Comment 5 Will Schmidt 2020-07-16 23:03:56 UTC
(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.
Comment 6 GCC Commits 2020-09-03 20:11:43 UTC
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.
Comment 7 GCC Commits 2020-09-15 17:17:47 UTC
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)
Comment 8 Will Schmidt 2020-09-15 20:50:15 UTC
*** Bug 85198 has been marked as a duplicate of this bug. ***
Comment 9 GCC Commits 2020-09-15 21:46:33 UTC
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.
Comment 10 Will Schmidt 2020-09-15 22:13:24 UTC
fix committed. closing out.
Comment 11 GCC Commits 2020-09-16 16:28:45 UTC
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.