瀏覽代碼

Fix memcpy size calculation in ScalarReplAggregatesHLSL::ReplaceMemcpy (#2298)

Multiplying by the alignment made no sense, and fixed a case where the alignment also made no sense.
Tristan Labelle 6 年之前
父節點
當前提交
33d5f9cecf
共有 1 個文件被更改,包括 2 次插入4 次删除
  1. 2 4
      lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

+ 2 - 4
lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

@@ -1506,7 +1506,7 @@ static void EltMemCpy(Type *Ty, Value *Dest, Value *Src,
   Value *DestGEP = CreateMergedGEP(Dest, idxList, Builder);
   Value *DestGEP = CreateMergedGEP(Dest, idxList, Builder);
   Value *SrcGEP = CreateMergedGEP(Src, idxList, Builder);
   Value *SrcGEP = CreateMergedGEP(Src, idxList, Builder);
   unsigned size = DL.getTypeAllocSize(Ty);
   unsigned size = DL.getTypeAllocSize(Ty);
-  Builder.CreateMemCpy(DestGEP, SrcGEP, size, size);
+  Builder.CreateMemCpy(DestGEP, SrcGEP, size, /* Align */ 1);
 }
 }
 
 
 static bool IsMemCpyTy(Type *Ty, DxilTypeSystem &typeSys) {
 static bool IsMemCpyTy(Type *Ty, DxilTypeSystem &typeSys) {
@@ -3346,9 +3346,7 @@ static void ReplaceMemcpy(Value *V, Value *Src, MemCpyInst *MC,
         const DataLayout &DL = SrcBCI->getModule()->getDataLayout();
         const DataLayout &DL = SrcBCI->getModule()->getDataLayout();
         unsigned SrcSize = DL.getTypeAllocSize(
         unsigned SrcSize = DL.getTypeAllocSize(
             SrcBCI->getOperand(0)->getType()->getPointerElementType());
             SrcBCI->getOperand(0)->getType()->getPointerElementType());
-        unsigned MemcpySize =
-            cast<ConstantInt>(MC->getLength())->getZExtValue() *
-            MC->getAlignment();
+        unsigned MemcpySize = cast<ConstantInt>(MC->getLength())->getZExtValue();
         if (SrcSize != MemcpySize) {
         if (SrcSize != MemcpySize) {
           DXASSERT(0, "Cannot handle partial memcpy");
           DXASSERT(0, "Cannot handle partial memcpy");
           return;
           return;