[LLVMdev] Can simplifycfg kill llvm.lifetime intrinsics?

Alexey Samsonov samsonov at google.com
Mon Dec 24 01:02:45 PST 2012


This looks like a bug in simplifycfg. We should preserve lifetime
intrinsics due to the reasons I described.
The code in //lib/Transforms/Utils/Local.cpp:

  if (Succ->getSinglePredecessor()) {
    // BB is the only predecessor of Succ, so Succ will end up with exactly
    // the same predecessors BB had.

    // Copy over any phi, debug or lifetime instruction.
    BB->getTerminator()->eraseFromParent();
    Succ->getInstList().splice(Succ->getFirstNonPHI(), BB->getInstList());
  }

does this only when successor of basic block being removed has a single
predecessor.
This is not the case even for simple test in
/test/Transforms/SimplifyCFG/lifetime.ll.

That said, I think for now we should just apply the patch attached to this
mail. Please take a look.

On Mon, Dec 17, 2012 at 6:59 PM, Alexey Samsonov <samsonov at google.com>wrote:

> Hi!
>
> I'm working on ASan option that uses llvm.lifetime intrinsics to detect
> use-after-scope bugs. In short, the idea is to
> insert calls into ASan runtime that would mark the memory as "addressable"
> or "unaddressable".
> I see the following problem with the following "trivial" basic block:
>
> for.body.lr.ph.i:                                 ; preds = %for.body.i310
>   call void @llvm.lifetime.start(i64 24, i8* %174)
>   call void @llvm.lifetime.start(i64 4, i8* %175)
>   call void @llvm.lifetime.start(i64 24, i8* %176)
>   br label %for.body.i318
>
> r134182 by Rafael explicitly allows simplifycfg pass to merge this block
> into its successor, and drop "side-effect free" lifetime.start
> intrinsics. However, llvm.lifetime.end intrinsics for the same memory are
> preserved, which is not only weird, but triggers ASan false positives:
> 1) function goes into for-loop with local variable declared in it
> 2) llvm.lifetime.end() at the end of the loop allows ASan to mark this
> memory as unaddressable
> 3) at the next loop iteration access to this memory will be reported as
> error.
>
> Shouldn't simplifycfg somehow preserve / move lifetime intrinsics in its
> transformations?
>
> --
> Alexey Samsonov, MSK
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121224/2a388d2c/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: zdiff.lifetime-simplifycfg
Type: application/octet-stream
Size: 1231 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121224/2a388d2c/attachment.obj>


More information about the llvm-dev mailing list