https://github.com/spall created https://github.com/llvm/llvm-project/pull/136576
Reverts llvm/llvm-project#134174 Revert due to test error breaking a lot of bots. >From e35cf35feff443c6dd9fbc0b5ab00efa8e282fa0 Mon Sep 17 00:00:00 2001 From: Sarah Spall <sp...@planetbauer.com> Date: Mon, 21 Apr 2025 09:27:45 -0700 Subject: [PATCH] Revert "[HLSL] Make it possible to assign an array from a cbuffer (#134174)" This reverts commit 52a5332a710d4db22327c3777ebf6873ff20732f. --- clang/lib/Sema/SemaExprCXX.cpp | 14 +++-- clang/lib/Sema/SemaOverload.cpp | 11 ++-- clang/test/CodeGenHLSL/ArrayAssignable.hlsl | 63 +-------------------- 3 files changed, 17 insertions(+), 71 deletions(-) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index f5a10e0db85ad..d46322d75721e 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -4745,13 +4745,19 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType, case ICK_HLSL_Array_RValue: if (ToType->isArrayParameterType()) { FromType = Context.getArrayParameterType(FromType); - } else if (FromType->isArrayParameterType()) { + From = ImpCastExprToType(From, FromType, CK_HLSLArrayRValue, VK_PRValue, + /*BasePath=*/nullptr, CCK) + .get(); + } else { // FromType must be ArrayParameterType + assert(FromType->isArrayParameterType() && + "FromType must be ArrayParameterType in ICK_HLSL_Array_RValue \ + if it is not ToType"); const ArrayParameterType *APT = cast<ArrayParameterType>(FromType); FromType = APT->getConstantArrayType(Context); + From = ImpCastExprToType(From, FromType, CK_HLSLArrayRValue, VK_PRValue, + /*BasePath=*/nullptr, CCK) + .get(); } - From = ImpCastExprToType(From, FromType, CK_HLSLArrayRValue, VK_PRValue, - /*BasePath=*/nullptr, CCK) - .get(); break; case ICK_Function_To_Pointer: diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 5b224b6c08fef..e4ff8c5489df3 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -2275,16 +2275,17 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType, // handling here. if (ToType->isArrayParameterType()) { FromType = S.Context.getArrayParameterType(FromType); + SCS.First = ICK_HLSL_Array_RValue; } else if (FromType->isArrayParameterType()) { const ArrayParameterType *APT = cast<ArrayParameterType>(FromType); FromType = APT->getConstantArrayType(S.Context); + SCS.First = ICK_HLSL_Array_RValue; + } else { + SCS.First = ICK_Identity; } - SCS.First = ICK_HLSL_Array_RValue; - - // Don't consider qualifiers, which include things like address spaces - if (FromType.getCanonicalType().getUnqualifiedType() != - ToType.getCanonicalType().getUnqualifiedType()) + if (S.Context.getCanonicalType(FromType) != + S.Context.getCanonicalType(ToType)) return false; SCS.setAllToTypes(ToType); diff --git a/clang/test/CodeGenHLSL/ArrayAssignable.hlsl b/clang/test/CodeGenHLSL/ArrayAssignable.hlsl index 723d521596baf..e2ff2de68ed99 100644 --- a/clang/test/CodeGenHLSL/ArrayAssignable.hlsl +++ b/clang/test/CodeGenHLSL/ArrayAssignable.hlsl @@ -1,23 +1,4 @@ -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -finclude-default-header -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s - -struct S { - int x; - float f; -}; - -// CHECK: [[CBLayout:%.*]] = type <{ [2 x float], [2 x <4 x i32>], [2 x [2 x i32]], [1 x target("dx.Layout", %S, 8, 0, 4)] }> -// CHECK: @CBArrays.cb = global target("dx.CBuffer", target("dx.Layout", [[CBLayout]], 136, 0, 32, 64, 128)) -// CHECK: @c1 = external addrspace(2) global [2 x float], align 4 -// CHECK: @c2 = external addrspace(2) global [2 x <4 x i32>], align 16 -// CHECK: @c3 = external addrspace(2) global [2 x [2 x i32]], align 4 -// CHECK: @c4 = external addrspace(2) global [1 x target("dx.Layout", %S, 8, 0, 4)], align 4 - -cbuffer CBArrays { - float c1[2]; - int4 c2[2]; - int c3[2][2]; - S c4[1]; -} +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --enable-var-scope // CHECK-LABEL: define void {{.*}}arr_assign1 // CHECK: [[Arr:%.*]] = alloca [2 x i32], align 4 @@ -135,45 +116,3 @@ void arr_assign7() { int Arr2[2][2] = {{0, 0}, {1, 1}}; (Arr = Arr2)[0] = {6, 6}; } - -// Verify you can assign from a cbuffer array - -// CHECK-LABEL: define void {{.*}}arr_assign8 -// CHECK: [[C:%.*]] = alloca [2 x float], align 4 -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[C]], ptr align 4 {{.*}}, i32 8, i1 false) -// CHECK-NEXT: call void @llvm.memcpy.p0.p2.i32(ptr align 4 [[C]], ptr addrspace(2) align 4 @c1, i32 8, i1 false) -// CHECK-NEXT: ret void -void arr_assign8() { - float C[2] = {1.0, 2.0}; - C = c1; -} - -// CHECK-LABEL: define void {{.*}}arr_assign9 -// CHECK: [[C:%.*]] = alloca [2 x <4 x i32>], align 16 -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 16 [[C]], ptr align 16 {{.*}}, i32 32, i1 false) -// CHECK-NEXT: call void @llvm.memcpy.p0.p2.i32(ptr align 16 [[C]], ptr addrspace(2) align 16 @c2, i32 32, i1 false) -// CHECK-NEXT: ret void -void arr_assign9() { - int4 C[2] = {1,2,3,4,5,6,7,8}; - C = c2; -} - -// CHECK-LABEL: define void {{.*}}arr_assign10 -// CHECK: [[C:%.*]] = alloca [2 x [2 x i32]], align 4 -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[C]], ptr align 4 {{.*}}, i32 16, i1 false) -// CHECK-NEXT: call void @llvm.memcpy.p0.p2.i32(ptr align 4 [[C]], ptr addrspace(2) align 4 @c3, i32 16, i1 false) -// CHECK-NEXT: ret void -void arr_assign10() { - int C[2][2] = {1,2,3,4}; - C = c3; -} - -// CHECK-LABEL: define void {{.*}}arr_assign11 -// CHECK: [[C:%.*]] = alloca [1 x %struct.S], align 4 -// CHECK: call void @llvm.memcpy.p0.p2.i32(ptr align 4 [[C]], ptr addrspace(2) align 4 @c4, i32 8, i1 false) -// CHECK-NEXT: ret void -void arr_assign11() { - S s = {1, 2.0}; - S C[1] = {s}; - C = c4; -} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits