Skip to content

Commit 69a3ae7

Browse files
committed
Merge branch 'main' of github.com:llvm/llvm-project into loop-vectorize/evl-exit-cond-avlnext-zero
2 parents d8b01f9 + a53e73e commit 69a3ae7

File tree

93 files changed

+3013
-8195
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+3013
-8195
lines changed

clang/docs/LanguageExtensions.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,6 +1763,7 @@ Hexadecimal floating constants (N308) C
17631763
Compound literals (N716) C99 C89, C++
17641764
``//`` comments (N644) C99 C89
17651765
Mixed declarations and code (N740) C99 C89
1766+
init-statement in for (N740) C99 C89
17661767
Variadic macros (N707) C99 C89
17671768
Empty macro arguments (N570) C99 C89
17681769
Trailing comma in enum declaration C99 C89

clang/include/clang/Driver/Options.td

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9468,8 +9468,12 @@ def fspv_target_env_EQ : Joined<["-"], "fspv-target-env=">, Group<dxc_Group>,
94689468
def fspv_extension_EQ
94699469
: Joined<["-"], "fspv-extension=">,
94709470
Group<dxc_Group>,
9471-
HelpText<"Specify the available SPIR-V extensions. If this option is not "
9472-
"specified, then all extensions are available.">;
9471+
HelpText<
9472+
"Specify the available SPIR-V extensions. If this option is not "
9473+
"specified, then all extensions are available. If KHR is specified, "
9474+
"then all KHR extensions will be available. If DXC is specifided, "
9475+
"then all extensions implemented by the DirectX Shader compiler will "
9476+
"be available. This option is useful for moving from DXC to Clang.">;
94739477
def fvk_use_dx_layout
94749478
: DXCFlag<"fvk-use-dx-layout">,
94759479
HelpText<"Use DirectX memory layout for Vulkan resources.">;

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2683,9 +2683,10 @@ static bool interp__builtin_ia32_pmul(InterpState &S, CodePtr OpPC,
26832683
const auto *VT = Call->getArg(0)->getType()->castAs<VectorType>();
26842684
PrimType ElemT = *S.getContext().classify(VT->getElementType());
26852685
unsigned SourceLen = VT->getNumElements();
2686-
SmallVector<APValue, 4> ResultElements;
2687-
ResultElements.reserve(SourceLen / 2);
26882686

2687+
PrimType DstElemT = *S.getContext().classify(
2688+
Call->getType()->castAs<VectorType>()->getElementType());
2689+
unsigned DstElem = 0;
26892690
for (unsigned I = 0; I != SourceLen; I += 2) {
26902691
APSInt Elem1;
26912692
APSInt Elem2;
@@ -2699,16 +2700,19 @@ static bool interp__builtin_ia32_pmul(InterpState &S, CodePtr OpPC,
26992700
case clang::X86::BI__builtin_ia32_pmuludq128:
27002701
case clang::X86::BI__builtin_ia32_pmuludq256:
27012702
case clang::X86::BI__builtin_ia32_pmuludq512:
2702-
Result = APSInt(llvm::APIntOps::muluExtended(Elem1, Elem2), true);
2703+
Result = APSInt(llvm::APIntOps::muluExtended(Elem1, Elem2),
2704+
/*IsUnsigned=*/true);
27032705
break;
27042706
case clang::X86::BI__builtin_ia32_pmuldq128:
27052707
case clang::X86::BI__builtin_ia32_pmuldq256:
27062708
case clang::X86::BI__builtin_ia32_pmuldq512:
2707-
Result = APSInt(llvm::APIntOps::mulsExtended(Elem1, Elem2), false);
2709+
Result = APSInt(llvm::APIntOps::mulsExtended(Elem1, Elem2),
2710+
/*IsUnsigned=*/false);
27082711
break;
27092712
}
2710-
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2711-
{ Dst.elem<T>(I) = static_cast<T>(Result); });
2713+
INT_TYPE_SWITCH_NO_BOOL(DstElemT,
2714+
{ Dst.elem<T>(DstElem) = static_cast<T>(Result); });
2715+
++DstElem;
27122716
}
27132717

27142718
Dst.initializeAllElements();
@@ -2774,6 +2778,40 @@ static bool interp__builtin_elementwise_fma(InterpState &S, CodePtr OpPC,
27742778
return true;
27752779
}
27762780

2781+
/// AVX512 predicated move: "Result = Mask[] ? LHS[] : RHS[]".
2782+
static bool interp__builtin_select(InterpState &S, CodePtr OpPC,
2783+
const CallExpr *Call) {
2784+
const Pointer &RHS = S.Stk.pop<Pointer>();
2785+
const Pointer &LHS = S.Stk.pop<Pointer>();
2786+
PrimType MaskT = *S.getContext().classify(Call->getArg(0));
2787+
APSInt Mask = popToAPSInt(S.Stk, MaskT);
2788+
const Pointer &Dst = S.Stk.peek<Pointer>();
2789+
2790+
assert(LHS.getNumElems() == RHS.getNumElems());
2791+
assert(LHS.getNumElems() == Dst.getNumElems());
2792+
unsigned NumElems = LHS.getNumElems();
2793+
PrimType ElemT = LHS.getFieldDesc()->getPrimType();
2794+
PrimType DstElemT = Dst.getFieldDesc()->getPrimType();
2795+
2796+
for (unsigned I = 0; I != NumElems; ++I) {
2797+
if (ElemT == PT_Float) {
2798+
assert(DstElemT == PT_Float);
2799+
Dst.elem<Floating>(I) =
2800+
Mask[I] ? LHS.elem<Floating>(I) : RHS.elem<Floating>(I);
2801+
} else {
2802+
APSInt Elem;
2803+
INT_TYPE_SWITCH(ElemT, {
2804+
Elem = Mask[I] ? LHS.elem<T>(I).toAPSInt() : RHS.elem<T>(I).toAPSInt();
2805+
});
2806+
INT_TYPE_SWITCH_NO_BOOL(DstElemT,
2807+
{ Dst.elem<T>(I) = static_cast<T>(Elem); });
2808+
}
2809+
}
2810+
Dst.initializeAllElements();
2811+
2812+
return true;
2813+
}
2814+
27772815
bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
27782816
uint32_t BuiltinID) {
27792817
if (!S.getASTContext().BuiltinInfo.isConstantEvaluated(BuiltinID))
@@ -3204,10 +3242,38 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
32043242
case clang::X86::BI__builtin_ia32_pmuldq512:
32053243
case clang::X86::BI__builtin_ia32_pmuludq128:
32063244
case clang::X86::BI__builtin_ia32_pmuludq256:
3245+
case clang::X86::BI__builtin_ia32_pmuludq512:
32073246
return interp__builtin_ia32_pmul(S, OpPC, Call, BuiltinID);
3247+
32083248
case Builtin::BI__builtin_elementwise_fma:
32093249
return interp__builtin_elementwise_fma(S, OpPC, Call);
32103250

3251+
case X86::BI__builtin_ia32_selectb_128:
3252+
case X86::BI__builtin_ia32_selectb_256:
3253+
case X86::BI__builtin_ia32_selectb_512:
3254+
case X86::BI__builtin_ia32_selectw_128:
3255+
case X86::BI__builtin_ia32_selectw_256:
3256+
case X86::BI__builtin_ia32_selectw_512:
3257+
case X86::BI__builtin_ia32_selectd_128:
3258+
case X86::BI__builtin_ia32_selectd_256:
3259+
case X86::BI__builtin_ia32_selectd_512:
3260+
case X86::BI__builtin_ia32_selectq_128:
3261+
case X86::BI__builtin_ia32_selectq_256:
3262+
case X86::BI__builtin_ia32_selectq_512:
3263+
case X86::BI__builtin_ia32_selectph_128:
3264+
case X86::BI__builtin_ia32_selectph_256:
3265+
case X86::BI__builtin_ia32_selectph_512:
3266+
case X86::BI__builtin_ia32_selectpbf_128:
3267+
case X86::BI__builtin_ia32_selectpbf_256:
3268+
case X86::BI__builtin_ia32_selectpbf_512:
3269+
case X86::BI__builtin_ia32_selectps_128:
3270+
case X86::BI__builtin_ia32_selectps_256:
3271+
case X86::BI__builtin_ia32_selectps_512:
3272+
case X86::BI__builtin_ia32_selectpd_128:
3273+
case X86::BI__builtin_ia32_selectpd_256:
3274+
case X86::BI__builtin_ia32_selectpd_512:
3275+
return interp__builtin_select(S, OpPC, Call);
3276+
32113277
default:
32123278
S.FFDiag(S.Current->getLocation(OpPC),
32133279
diag::note_invalid_subexpr_in_const_expr)

clang/lib/Driver/ToolChains/HLSL.cpp

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -173,24 +173,72 @@ bool isLegalValidatorVersion(StringRef ValVersionStr, const Driver &D) {
173173
return true;
174174
}
175175

176-
std::string getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
176+
void getSpirvExtOperand(StringRef SpvExtensionArg, raw_ostream &out) {
177+
// The extensions that are commented out are supported in DXC, but the SPIR-V
178+
// backend does not know about them yet.
179+
static const std::vector<StringRef> DxcSupportedExtensions = {
180+
"SPV_KHR_16bit_storage", "SPV_KHR_device_group",
181+
"SPV_KHR_fragment_shading_rate", "SPV_KHR_multiview",
182+
"SPV_KHR_post_depth_coverage", "SPV_KHR_non_semantic_info",
183+
"SPV_KHR_shader_draw_parameters", "SPV_KHR_ray_tracing",
184+
"SPV_KHR_shader_clock", "SPV_EXT_demote_to_helper_invocation",
185+
"SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered",
186+
"SPV_EXT_fragment_invocation_density",
187+
"SPV_EXT_fragment_shader_interlock", "SPV_EXT_mesh_shader",
188+
"SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer",
189+
// "SPV_AMD_shader_early_and_late_fragment_tests",
190+
"SPV_GOOGLE_hlsl_functionality1", "SPV_GOOGLE_user_type",
191+
"SPV_KHR_ray_query", "SPV_EXT_shader_image_int64",
192+
"SPV_KHR_fragment_shader_barycentric", "SPV_KHR_physical_storage_buffer",
193+
"SPV_KHR_vulkan_memory_model",
194+
// "SPV_KHR_compute_shader_derivatives",
195+
// "SPV_KHR_maximal_reconvergence",
196+
"SPV_KHR_float_controls", "SPV_NV_shader_subgroup_partitioned",
197+
// "SPV_KHR_quad_control"
198+
};
199+
200+
if (SpvExtensionArg.starts_with("SPV_")) {
201+
out << "+" << SpvExtensionArg;
202+
return;
203+
}
204+
205+
if (SpvExtensionArg.compare_insensitive("DXC") == 0) {
206+
bool first = true;
207+
std::string Operand;
208+
for (StringRef E : DxcSupportedExtensions) {
209+
if (!first)
210+
out << ",";
211+
else
212+
first = false;
213+
out << "+" << E;
214+
}
215+
return;
216+
}
217+
out << SpvExtensionArg;
218+
return;
219+
}
220+
221+
SmallString<1024> getSpirvExtArg(ArrayRef<std::string> SpvExtensionArgs) {
177222
if (SpvExtensionArgs.empty()) {
178-
return "-spirv-ext=all";
223+
return StringRef("-spirv-ext=all");
179224
}
180225

181-
std::string LlvmOption =
182-
(Twine("-spirv-ext=+") + SpvExtensionArgs.front()).str();
226+
llvm::SmallString<1024> LlvmOption;
227+
raw_svector_ostream out(LlvmOption);
228+
229+
out << "-spirv-ext=";
230+
getSpirvExtOperand(SpvExtensionArgs[0], out);
231+
183232
SpvExtensionArgs = SpvExtensionArgs.slice(1);
184-
for (auto Extension : SpvExtensionArgs) {
185-
if (Extension != "KHR")
186-
Extension = (Twine("+") + Extension).str();
187-
LlvmOption = (Twine(LlvmOption) + "," + Extension).str();
233+
for (StringRef Extension : SpvExtensionArgs) {
234+
out << ",";
235+
getSpirvExtOperand(Extension, out);
188236
}
189237
return LlvmOption;
190238
}
191239

192240
bool isValidSPIRVExtensionName(const std::string &str) {
193-
std::regex pattern("KHR|SPV_[a-zA-Z0-9_]+");
241+
std::regex pattern("dxc|DXC|khr|KHR|SPV_[a-zA-Z0-9_]+");
194242
return std::regex_match(str, pattern);
195243
}
196244

@@ -371,7 +419,7 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
371419
std::vector<std::string> SpvExtensionArgs =
372420
Args.getAllArgValues(options::OPT_fspv_extension_EQ);
373421
if (checkExtensionArgsAreValid(SpvExtensionArgs, getDriver())) {
374-
std::string LlvmOption = getSpirvExtArg(SpvExtensionArgs);
422+
SmallString<1024> LlvmOption = getSpirvExtArg(SpvExtensionArgs);
375423
DAL->AddSeparateArg(nullptr, Opts.getOption(options::OPT_mllvm),
376424
LlvmOption);
377425
}

clang/test/CodeGen/X86/avx512f-builtins.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512f -emit-llvm -o - -Wall -Werror -Wsign-conversion | FileCheck %s
44
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +avx512f -emit-llvm -o - -Wall -Werror -Wsign-conversion | FileCheck %s
55

6+
// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512f -emit-llvm -o - -Wall -Werror -Wsign-conversion -fexperimental-new-constant-interpreter | FileCheck %s
7+
// RUN: %clang_cc1 -x c -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +avx512f -emit-llvm -o - -Wall -Werror -Wsign-conversion -fexperimental-new-constant-interpreter | FileCheck %s
8+
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512f -emit-llvm -o - -Wall -Werror -Wsign-conversion -fexperimental-new-constant-interpreter | FileCheck %s
9+
// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +avx512f -emit-llvm -o - -Wall -Werror -Wsign-conversion -fexperimental-new-constant-interpreter | FileCheck %s
10+
611
#include <immintrin.h>
712
#include "builtin_test_helpers.h"
813

clang/test/Driver/dxc_fspv_extension.hlsl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414
// RUN: %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=SPV_TEST1 -fspv-extension=KHR -fspv-extension=SPV_TEST2 2>&1 | FileCheck %s -check-prefix=TEST3
1515
// TEST3: "-spirv-ext=+SPV_TEST1,KHR,+SPV_TEST2"
1616

17+
// Merge KHR with other extensions.
18+
// RUN: %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=KHR -fspv-extension=SPV_TEST2 2>&1 | FileCheck %s -check-prefix=TEST4
19+
// TEST4: "-spirv-ext=KHR,+SPV_TEST2"
20+
21+
// Convert DXC to a list of SPV extensions.
22+
// RUN: %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=DXC 2>&1 | FileCheck %s -check-prefix=TEST5
23+
// TEST5: "-spirv-ext={{(\+SPV_[a-zA-Z0-9_]+,?)+}}"
24+
1725
// Check for the error message if the extension name is not properly formed.
1826
// RUN: not %clang_dxc -spirv -Tlib_6_7 -### %s -fspv-extension=KHR_BAD -fspv-extension=TEST1 -fspv-extension=SPV_GOOD -fspv-extension=TEST2 2>&1 | FileCheck %s -check-prefix=FAIL
1927
// FAIL: invalid value 'KHR_BAD' in '-fspv-extension'

clang/www/c_status.html

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,15 +1302,10 @@ <h2 id="c99">C99 implementation status</h2>
13021302
<td class="full" align="center">Yes</td>
13031303
</tr>
13041304
<tr>
1305-
<td>mixed declarations and code</td>
1305+
<td>mixed declarations and code<br \>new block scopes for selection and iteration statements</td>
13061306
<td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n740.htm">N740</a></td>
13071307
<td class="full" align="center">Yes</td>
13081308
</tr>
1309-
<tr>
1310-
<td>new block scopes for selection and iteration statements</td>
1311-
<td>Unknown</td>
1312-
<td class="full" align="center">Yes</td>
1313-
</tr>
13141309
<tr>
13151310
<td>integer constant type rules</td>
13161311
<td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n629.htm">N629</a></td>

0 commit comments

Comments
 (0)