[llvm] r258149 - Use larger write sizes for MCFillFragment.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 19 09:47:49 PST 2016


Author: rafael
Date: Tue Jan 19 11:47:48 2016
New Revision: 258149

URL: http://llvm.org/viewvc/llvm-project?rev=258149&view=rev
Log:
Use larger write sizes for MCFillFragment.

This brings the pr26208 testcase down to 3.2 seconds. Not checking it in
since it does create a 4GB .o file.

Modified:
    llvm/trunk/lib/MC/MCAssembler.cpp

Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=258149&r1=258148&r2=258149&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Tue Jan 19 11:47:48 2016
@@ -488,9 +488,20 @@ static void writeFragment(const MCAssemb
   case MCFragment::FT_Fill: {
     ++stats::EmittedFillFragments;
     const MCFillFragment &FF = cast<MCFillFragment>(F);
+    uint8_t V = FF.getValue();
+    const unsigned MaxChunkSize = 16;
+    char Data[MaxChunkSize];
+    memcpy(Data, &V, 1);
+    for (unsigned I = 1; I < MaxChunkSize; ++I)
+      Data[I] = Data[0];
 
-    for (uint64_t I = 0, E = FF.getSize(); I != E; ++I)
-      OW->write8(FF.getValue());
+    uint64_t Size = FF.getSize();
+    for (unsigned ChunkSize = MaxChunkSize; ChunkSize; ChunkSize /= 2) {
+      StringRef Ref(Data, ChunkSize);
+      for (uint64_t I = 0, E = Size / ChunkSize; I != E; ++I)
+        OW->writeBytes(Ref);
+      Size = Size % ChunkSize;
+    }
     break;
   }
 




More information about the llvm-commits mailing list