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

            Bug ID: 117547
           Summary: FAIL: gcc.target/i386/*-pr93673.c without
                    TARGET_PROMOTE_PROTOTYPES
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com
                CC: liuhongt at gcc dot gnu.org, rguenth at gcc dot gnu.org,
                    uros at gcc dot gnu.org
  Target Milestone: ---
            Target: x86

On i386, when TARGET_PROMOTE_PROTOTYPES is undefined, the C frontend doesn't
promote char/short argument to int, I got

FAIL: gcc.target/i386/avx512bw-pr93673.c (test for excess errors)
FAIL: gcc.target/i386/avx512dq-pr93673.c (test for excess errors)
FAIL: gcc.target/i386/avx512f-pr93673.c (test for excess errors)

$ cat /tmp/x.c
#include <x86intrin.h>

void
foo (__mmask32 *c, __mmask64 *d)
{
  d[8] = _kshiftli_mask64 (d[8], 0xff);
}
$ ./xgcc -B./
-B/export/build/gnu/tools-build/gcc-gitlab-debug/build-x86_64-linux/gcc/
/tmp/x.c -fdiagnostics-plain-output -O2 -mavx512bw -S
In file included from ./include/immintrin.h:61,
                 from ./include/x86intrin.h:32,
                 from /tmp/x.c:1:
In function ‘_kshiftli_mask64’,
    inlined from ‘foo’ at /tmp/x.c:6:10:
./include/avx512bwintrin.h:2846:10: error: the last argument must be an 8-bit
immediate
$ 

When passing 0xff as an unsigned char function argument, the C frontend
promotion will promote it to int:

<integer_cst 0x7fffe6aa23a8 type <integer_type 0x7fffe98225e8 int> constant
255>

and expand_normal always returns the rtx value using the sign-extended
representation,

(const_int 255 [0xff])

If the C frontend doesn't promote unsigned char to int, expand_normal will
get

<integer_cst 0x7fffe9824018 type <integer_type 0x7fffe9822348 unsigned char >
co
nstant 255>

and return

(const_int -1 [0xffffffffffffffff])

Reply via email to