Bug 101127 - d: Compile-time reflection for supported built-ins
Summary: d: Compile-time reflection for supported built-ins
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: d (show other bugs)
Version: 11.0
: P3 normal
Target Milestone: ---
Assignee: Iain Buclaw
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-06-18 15:51 UTC by Iain Buclaw
Modified: 2021-07-28 12:47 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Iain Buclaw 2021-06-18 15:51:42 UTC
With the 11 release, compile-time reflection support was added for vector types, but this does not extend to built-ins that use them.

e.g:
---

// This prints "Yes" with -mavx because vector(float[8]) also becomes available.
static if (__traits(compiles, __builtin_ia32_andps256 ))
    pragma(msg, "Yes AVX support");
else
    pragma(msg, "No AVX support");


// Always prints "Yes", because vector(short[8]) is available from -msse
static if (__traits(compiles, __builtin_ia32_pmulhrsw128))
    pragma(msg, "Yes SSSE3 support");
else
    pragma(msg, "No SSSE3 support");
Comment 1 Iain Buclaw 2021-06-18 17:41:50 UTC
There's the language hook LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE, which seems to do what we want on the surface, but then there's a question over whether this is to be correct.

---
// static condition is false
static if (__traits(compiles, __builtin_ia32_pmulhrsw128))
    pragma(msg, "Yes SSSE3 support");
else
{
    short8 truc(short8 a, short8 b) @target("ssse3") // adds SSSE3 built-ins.
    {
        return __builtin_ia32_pmulhrsw128(a, b);
    }
}

// static condition could be true, depending on order of evaluation.
static if (__traits(compiles, __builtin_ia32_pmaddubsw128))
    pragma(msg, "Yes SSSE3 support");
Comment 2 GCC Commits 2021-07-28 11:18:46 UTC
The master branch has been updated by Iain Buclaw <ibuclaw@gcc.gnu.org>:

https://gcc.gnu.org/g:b2f6e1de242fff5713763cd3146dcf3f9dee51ca

commit r12-2562-gb2f6e1de242fff5713763cd3146dcf3f9dee51ca
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sun Jul 25 23:19:36 2021 +0200

    d: Compile-time reflection for supported built-ins (PR101127)
    
    In order to allow user-code to determine whether a back-end builtin is
    available without error, LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE has been
    defined to delay putting back-end builtin functions until the ISA that
    defines them has been declared.
    
    However in D, there is no global namespace.  All builtins get pushed
    into the `gcc.builtins' module, which is constructed during the semantic
    analysis pass, which has already finished by the time target attributes
    are evaluated.  So builtins are not pushed by the new langhook because
    they would be ultimately ignored.  Builtins exposed to D code then can
    now only be altered by the command-line.
    
            PR d/101127
    
    gcc/d/ChangeLog:
    
            * d-builtins.cc (d_builtin_function_ext_scope): New function.
            * d-lang.cc (LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE): Define.
            * d-tree.h (d_builtin_function_ext_scope): Declare.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/pr101127a.d: New test.
            * gdc.dg/pr101127b.d: New test.
Comment 3 GCC Commits 2021-07-28 11:36:44 UTC
The releases/gcc-11 branch has been updated by Iain Buclaw <ibuclaw@gcc.gnu.org>:

https://gcc.gnu.org/g:89f0f83cdd1192f682f849e289b6188f9dbff961

commit r11-8807-g89f0f83cdd1192f682f849e289b6188f9dbff961
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sun Jul 25 23:19:36 2021 +0200

    d: Compile-time reflection for supported built-ins (PR101127)
    
    In order to allow user-code to determine whether a back-end builtin is
    available without error, LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE has been
    defined to delay putting back-end builtin functions until the ISA that
    defines them has been declared.
    
    However in D, there is no global namespace.  All builtins get pushed
    into the `gcc.builtins' module, which is constructed during the semantic
    analysis pass, which has already finished by the time target attributes
    are evaluated.  So builtins are not pushed by the new langhook because
    they would be ultimately ignored.  Builtins exposed to D code then can
    now only be altered by the command-line.
    
            PR d/101127
    
    gcc/d/ChangeLog:
    
            * d-builtins.cc (d_builtin_function_ext_scope): New function.
            * d-lang.cc (LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE): Define.
            * d-tree.h (d_builtin_function_ext_scope): Declare.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/pr101127a.d: New test.
            * gdc.dg/pr101127b.d: New test.
    
    (cherry picked from commit b2f6e1de242fff5713763cd3146dcf3f9dee51ca)
Comment 4 GCC Commits 2021-07-28 11:50:10 UTC
The releases/gcc-10 branch has been updated by Iain Buclaw <ibuclaw@gcc.gnu.org>:

https://gcc.gnu.org/g:4ae456dc2fcc5f12caa8abb5e5781839e2a0c7f7

commit r10-10005-g4ae456dc2fcc5f12caa8abb5e5781839e2a0c7f7
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sun Jul 25 23:19:36 2021 +0200

    d: Compile-time reflection for supported built-ins (PR101127)
    
    In order to allow user-code to determine whether a back-end builtin is
    available without error, LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE has been
    defined to delay putting back-end builtin functions until the ISA that
    defines them has been declared.
    
    However in D, there is no global namespace.  All builtins get pushed
    into the `gcc.builtins' module, which is constructed during the semantic
    analysis pass, which has already finished by the time target attributes
    are evaluated.  So builtins are not pushed by the new langhook because
    they would be ultimately ignored.  Builtins exposed to D code then can
    now only be altered by the command-line.
    
            PR d/101127
    
    gcc/d/ChangeLog:
    
            * d-builtins.cc (d_builtin_function_ext_scope): New function.
            * d-lang.cc (LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE): Define.
            * d-tree.h (d_builtin_function_ext_scope): Declare.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/pr101127a.d: New test.
            * gdc.dg/pr101127b.d: New test.
    
    (cherry picked from commit b2f6e1de242fff5713763cd3146dcf3f9dee51ca)
Comment 5 GCC Commits 2021-07-28 11:57:38 UTC
The releases/gcc-9 branch has been updated by Iain Buclaw <ibuclaw@gcc.gnu.org>:

https://gcc.gnu.org/g:58cae53cb1cf8971a9c9611680f373a43e7547b7

commit r9-9648-g58cae53cb1cf8971a9c9611680f373a43e7547b7
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sun Jul 25 23:19:36 2021 +0200

    d: Compile-time reflection for supported built-ins (PR101127)
    
    In order to allow user-code to determine whether a back-end builtin is
    available without error, LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE has been
    defined to delay putting back-end builtin functions until the ISA that
    defines them has been declared.
    
    However in D, there is no global namespace.  All builtins get pushed
    into the `gcc.builtins' module, which is constructed during the semantic
    analysis pass, which has already finished by the time target attributes
    are evaluated.  So builtins are not pushed by the new langhook because
    they would be ultimately ignored.  Builtins exposed to D code then can
    now only be altered by the command-line.
    
            PR d/101127
    
    gcc/d/ChangeLog:
    
            * d-builtins.cc (d_builtin_function_ext_scope): New function.
            * d-lang.cc (LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE): Define.
            * d-tree.h (d_builtin_function_ext_scope): Declare.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/pr101127a.d: New test.
            * gdc.dg/pr101127b.d: New test.
    
    (cherry picked from commit b2f6e1de242fff5713763cd3146dcf3f9dee51ca)
Comment 6 Iain Buclaw 2021-07-28 12:47:10 UTC
Fix committed.