[llvm] r352152 - hwasan: If we split the entry block, move static allocas back into the entry block.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 24 18:08:46 PST 2019


Author: pcc
Date: Thu Jan 24 18:08:46 2019
New Revision: 352152

URL: http://llvm.org/viewvc/llvm-project?rev=352152&view=rev
Log:
hwasan: If we split the entry block, move static allocas back into the entry block.

Otherwise they are treated as dynamic allocas, which ends up increasing
code size significantly. This reduces size of Chromium base_unittests
by 2MB (6.7%).

Differential Revision: https://reviews.llvm.org/D57205

Modified:
    llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
    llvm/trunk/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll

Modified: llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp?rev=352152&r1=352151&r2=352152&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp Thu Jan 24 18:08:46 2019
@@ -1038,6 +1038,21 @@ bool HWAddressSanitizer::runOnFunction(F
     Changed |= instrumentStack(AllocasToInstrument, RetVec, StackTag);
   }
 
+  // If we split the entry block, move any allocas that were originally in the
+  // entry block back into the entry block so that they aren't treated as
+  // dynamic allocas.
+  if (EntryIRB.GetInsertBlock() != &F.getEntryBlock()) {
+    InsertPt = &*F.getEntryBlock().begin();
+    for (auto II = EntryIRB.GetInsertBlock()->begin(),
+              IE = EntryIRB.GetInsertBlock()->end();
+         II != IE;) {
+      Instruction *I = &*II++;
+      if (auto *AI = dyn_cast<AllocaInst>(I))
+        if (isa<ConstantInt>(AI->getArraySize()))
+          I->moveBefore(InsertPt);
+    }
+  }
+
   for (auto Inst : ToInstrument)
     Changed |= instrumentMemAccess(Inst);
 

Modified: llvm/trunk/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll?rev=352152&r1=352151&r2=352152&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll (original)
+++ llvm/trunk/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll Thu Jan 24 18:08:46 2019
@@ -2,9 +2,10 @@
 
 target triple = "aarch64--linux-android"
 
-declare void @bar([16 x i32]* %p)
+declare i32 @bar([16 x i32]* %p)
 
 define void @alloca() sanitize_hwaddress "hwasan-abi"="interceptor" {
+  ; CHECK: alloca [16 x i32]
   ; CHECK: [[A:%[^ ]*]] = call i8* @llvm.thread.pointer()
   ; CHECK: [[B:%[^ ]*]] = getelementptr i8, i8* [[A]], i32 48
   ; CHECK: [[C:%[^ ]*]] = bitcast i8* [[B]] to i64*
@@ -19,9 +20,11 @@ define void @alloca() sanitize_hwaddress
 
   ; CHECK: [[CONT]]:
   ; CHECK: phi i64 [ [[LOAD]], %0 ], [ [[RELOAD]], %[[INIT]] ]
+  ; CHECK: alloca i8
 
   %p = alloca [16 x i32]
-  call void @bar([16 x i32]* %p)
+  %size = call i32 @bar([16 x i32]* %p)
+  %q = alloca i8, i32 %size
   ret void
 }
 




More information about the llvm-commits mailing list