bounds checking: add support for byval arguments
authorNuno Lopes <nunoplopes@sapo.pt>
Fri, 25 May 2012 21:15:17 +0000 (21:15 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Fri, 25 May 2012 21:15:17 +0000 (21:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157498 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/BoundsChecking.cpp
test/Transforms/BoundsChecking/simple.ll

index 4c3dea2317a0263459035ae0f0a5147c0dac1d44..7b1a4170408a19670159420e3c86599b88beb384 100644 (file)
@@ -104,7 +104,6 @@ void BoundsChecking::emitBranchToTrap(Value *Cmp) {
   BasicBlock *Cont = OldBB->splitBasicBlock(Inst);
   OldBB->getTerminator()->eraseFromParent();
 
-  // FIXME: add unlikely branch taken metadata?
   if (Cmp)
     BranchInst::Create(getTrapBB(), Cont, Cmp, OldBB);
   else
@@ -152,6 +151,15 @@ ConstTriState BoundsChecking::computeAllocSize(Value *Alloc, uint64_t &Size,
     SizeValue = Builder->CreateMul(SizeValue, ArraySize);
     return NotConst;
 
+  // function arguments
+  } else if (Argument *A = dyn_cast<Argument>(Alloc)) {
+    if (!A->hasByValAttr())
+      return Dunno;
+
+    PointerType *PT = cast<PointerType>(A->getType());
+    Size = TD->getTypeAllocSize(PT->getElementType());
+    return Const;
+
   // ptr = select(ptr1, ptr2)
   } else if (SelectInst *SI = dyn_cast<SelectInst>(Alloc)) {
     uint64_t SizeFalse;
index f24d9e1f8df33b15931f7dded54a7d44d1cc2bd9..62c2e9026bc23569b5bccf7e747dcf8aad5533ef 100644 (file)
@@ -107,3 +107,12 @@ define void @f10(i64 %x, i64 %y) nounwind {
   %4 = load i128* %3, align 4
   ret void
 }
+
+; CHECK: @f11
+define void @f11(i128* byval %x) nounwind {
+  %1 = bitcast i128* %x to i8*
+  %2 = getelementptr inbounds i8* %1, i64 16
+; CHECK: br label
+  %3 = load i8* %2, align 4
+  ret void
+}