Переглянути джерело

Support case memcpy has multiple overloads. (#2573)

Xiang Li 5 роки тому
батько
коміт
f09333ba88

+ 3 - 5
lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

@@ -2092,15 +2092,13 @@ void MemcpySplitter::SplitMemCpy(MemCpyInst *MI, const DataLayout &DL,
 
 void MemcpySplitter::Split(llvm::Function &F) {
   const DataLayout &DL = F.getParent()->getDataLayout();
-
-  Function *memcpy = nullptr;
+  SmallVector<Function *, 2> memcpys;
   for (Function &Fn : F.getParent()->functions()) {
     if (Fn.getIntrinsicID() == Intrinsic::memcpy) {
-      memcpy = &Fn;
-      break;
+      memcpys.emplace_back(&Fn);
     }
   }
-  if (memcpy) {
+  for (Function *memcpy : memcpys) {
     for (auto U = memcpy->user_begin(); U != memcpy->user_end();) {
       MemCpyInst *MI = cast<MemCpyInst>(*(U++));
       if (MI->getParent()->getParent() != &F)

+ 30 - 0
tools/clang/test/HLSLFileCheck/passes/hl/sroa_hlsl/multi_memcpy_overloads.hlsl

@@ -0,0 +1,30 @@
+// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
+
+//Make sure support case memcpy has multiple overloads.
+
+// CHECK: @main
+
+struct S
+{
+	float3 f;
+	uint i;
+};
+
+StructuredBuffer<S> b0;
+RWStructuredBuffer<S> u0;
+
+groupshared S s;
+
+
+[numthreads(64,1,1)]
+void main(uint id : SV_GroupThreadID) {
+ if (id==0) {
+   s = b0[id];
+   s.i += 2;
+ }
+ S s0 = b0[id];
+ s0.i += id;
+
+ u0[id] = s0;
+ u0[id*2] = b0[id*2];
+}