diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3520,6 +3520,8 @@ // Add the default headers if dxc_no_stdinc is not set. if (!Args.hasArg(options::OPT_dxc_no_stdinc)) CmdArgs.push_back("-finclude-default-header"); + // Preserve vec3 for HLSL. + CmdArgs.push_back("-fpreserve-vec3-type"); } static void RenderARCMigrateToolOptions(const Driver &D, const ArgList &Args, diff --git a/clang/test/CodeGenHLSL/float3.hlsl b/clang/test/CodeGenHLSL/float3.hlsl new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenHLSL/float3.hlsl @@ -0,0 +1,11 @@ +// RUN: %clang --driver-mode=dxc -Tlib_6_7 -fcgl -Fo - %s | FileCheck %s + +// Make sure float3 is not changed into float4. +// CHECK:<3 x float> @"?foo@@YAT?$__vector@M$02@__clang@@T12@@Z"(<3 x float> noundef %a) +// CHECK:%[[A_ADDR:.+]] = alloca <3 x float>, align 16 +// CHECK-NEXT:store <3 x float> %a, ptr %[[A_ADDR]], align 16 +// CHECK-NEXT:%[[V:[0-9]+]] = load <3 x float>, ptr %[[A_ADDR]], align 16 +// CHECK-NEXT:ret <3 x float> %[[V]] +float3 foo(float3 a) { + return a; +}