Hi Kewen, On 9/28/21 9:34 PM, Kewen.Lin wrote: > Hi Bill, > > Thanks for your prompt comments! > > on 2021/9/29 上午3:24, Bill Schmidt wrote: >> Hi Kewen, >> >> Although I agree that what we do now is tragically bad (and will be fixed in >> the builtin rewrite), this seems a little too cavalier to remove all >> checking during initialization without adding any checking somewhere else. >> :-) We still need to check for invalid usage when the builtin is expanded, >> and I don't think the old code does this at all. >> > If I read the code right, there are some following places to check the > invalid usage or not. > 1) for folding, rs6000_gimple_fold_builtin -> rs6000_builtin_is_supported_p > -> check mask > -> defer to expand if invalid. > 2) for expanding, obtain func_valid_p, error in rs6000_invalid_builtin. > > Both places seem to exist before the builtin rewrite, am I missing something? > > btw, I remembered I used one built gcc with my fix to compile one test case > which is supposed to fail > due to its invalid usage builtin at option -flto, it failed (errored) as > expected but at LTRANS phase > since it's the time to do expansion for no-fat-objs scenario.
OK. If you are comfortable that this will be caught when the builtin is actually not valid, then I'll withdraw my objection. Can you test it? I know that we've been trying to fix these cases piecemeal in the old support, and as Peter says it's important to backport this, we need the solution. I just want to be sure we're not breaking something, and test coverage in this area is pretty terrible. Thanks! Bill > >> Unless you are planning to do a backport, I think the proper way forward >> here is to just wait for the new builtin support to land. In the new code, >> we initialize all built-ins up front, and check properly at expansion time >> whether the builtin is enabled in the environment that obtains during expand. > Good to know that! Nice! btw, for this issue itself, the current > implementation (without rewriting) > also initializes the built-ins in the table since MMA built-ins guarded in > TARGET_EXTRA_BUILTINS, > the root cause is the rs6000_builtin_mask can't set up (be switched) > expectedly since the checking > time is too early right when the built-in function_decl being created. > > BR, > Kewen > >> My two cents, >> Bill >> >> On 9/28/21 3:13 AM, Kewen.Lin wrote: >>> Hi, >>> >>> As the discussion in PR102347, currently builtin_decl is invoked so >>> early, it's when making up the function_decl for builtin functions, >>> at that time the rs6000_builtin_mask could be wrong for those >>> builtins sitting in #pragma/attribute target functions, though it >>> will be updated properly later when LTO processes all nodes. >>> >>> This patch is to align with the practice i386 port adopts, also >>> align with r10-7462 by relaxing builtin mask checking in some places. >>> >>> Bootstrapped and regress-tested on powerpc64le-linux-gnu P9 and >>> powerpc64-linux-gnu P8. >>> >>> Is it ok for trunk? >>> >>> BR, >>> Kewen >>> ----- >>> gcc/ChangeLog: >>> >>> PR target/102347 >>> * config/rs6000/rs6000-call.c (rs6000_builtin_decl): Remove builtin >>> mask check. >>> >>> gcc/testsuite/ChangeLog: >>> >>> PR target/102347 >>> * gcc.target/powerpc/pr102347.c: New test. >>> >>> --- >>> gcc/config/rs6000/rs6000-call.c | 14 ++++---------- >>> gcc/testsuite/gcc.target/powerpc/pr102347.c | 15 +++++++++++++++ >>> 2 files changed, 19 insertions(+), 10 deletions(-) >>> create mode 100644 gcc/testsuite/gcc.target/powerpc/pr102347.c >>> >>> diff --git a/gcc/config/rs6000/rs6000-call.c >>> b/gcc/config/rs6000/rs6000-call.c >>> index fd7f24da818..15e0e09c07d 100644 >>> --- a/gcc/config/rs6000/rs6000-call.c >>> +++ b/gcc/config/rs6000/rs6000-call.c >>> @@ -13775,23 +13775,17 @@ rs6000_init_builtins (void) >>> } >>> } >>> >>> -/* Returns the rs6000 builtin decl for CODE. */ >>> +/* Returns the rs6000 builtin decl for CODE. Note that we don't check >>> + the builtin mask here since there could be some #pragma/attribute >>> + target functions and the rs6000_builtin_mask could be wrong when >>> + this checking happens, though it will be updated properly later. */ >>> >>> tree >>> rs6000_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED) >>> { >>> - HOST_WIDE_INT fnmask; >>> - >>> if (code >= RS6000_BUILTIN_COUNT) >>> return error_mark_node; >>> >>> - fnmask = rs6000_builtin_info[code].mask; >>> - if ((fnmask & rs6000_builtin_mask) != fnmask) >>> - { >>> - rs6000_invalid_builtin ((enum rs6000_builtins)code); >>> - return error_mark_node; >>> - } >>> - >>> return rs6000_builtin_decls[code]; >>> } >>> >>> diff --git a/gcc/testsuite/gcc.target/powerpc/pr102347.c >>> b/gcc/testsuite/gcc.target/powerpc/pr102347.c >>> new file mode 100644 >>> index 00000000000..05c439a8dac >>> --- /dev/null >>> +++ b/gcc/testsuite/gcc.target/powerpc/pr102347.c >>> @@ -0,0 +1,15 @@ >>> +/* { dg-do link } */ >>> +/* { dg-require-effective-target power10_ok } */ >>> +/* { dg-require-effective-target lto } */ >>> +/* { dg-options "-flto -mdejagnu-cpu=power9" } */ >>> + >>> +/* Verify there are no error messages in LTO mode. */ >>> + >>> +#pragma GCC target "cpu=power10" >>> +int main () >>> +{ >>> + float *b; >>> + __vector_quad c; >>> + __builtin_mma_disassemble_acc (b, &c); >>> + return 0; >>> +} >>> -- >>> 2.27.0 >>> >