[llvm] r223347 - Restrict somewhat the memory-allocation pointer cmp opt from r223093
Evgeniy Stepanov
eugeni.stepanov at gmail.com
Thu Dec 4 03:11:15 PST 2014
This is crashing llvm bootstrap:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/14396/steps/bootstrap%20clang/logs/stdio
On Thu, Dec 4, 2014 at 12:22 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> Author: hfinkel
> Date: Thu Dec 4 03:22:28 2014
> New Revision: 223347
>
> URL: http://llvm.org/viewvc/llvm-project?rev=223347&view=rev
> Log:
> Restrict somewhat the memory-allocation pointer cmp opt from r223093
>
> Based on review comments from Richard Smith, restrict this optimization from
> applying to globals that might resolve lazily to other dynamically-loaded
> modules, and also from dynamic allocas (which might be transformed into malloc
> calls). In short, take extra care that the compared-to pointer is really
> simultaneously live with the memory allocation.
>
> Modified:
> llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> llvm/trunk/test/Transforms/InstSimplify/noalias-ptr.ll
>
> Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=223347&r1=223346&r2=223347&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Thu Dec 4 03:22:28 2014
> @@ -2026,12 +2026,22 @@ static Constant *computePointerICmp(cons
> };
>
> // Is the set of underlying objects all things which must be disjoint from
> - // noalias calls.
> + // noalias calls. For allocas, we consider only static ones (dynamic
> + // allocas might be transformed into calls to malloc not simultaneously
> + // live with the compared-to allocation). For globals, we exclude symbols
> + // that might be resolve lazily to symbols in another dynamically-loaded
> + // library (and, thus, could be malloc'ed by the implementation).
> auto IsAllocDisjoint = [](SmallVectorImpl<Value *> &Objects) {
> return std::all_of(Objects.begin(), Objects.end(),
> [](Value *V){
> - if (isa<AllocaInst>(V) || isa<GlobalValue>(V))
> - return true;
> + if (const AllocaInst *AI = dyn_cast<AllocaInst>(V))
> + return AI->isStaticAlloca();
> + if (const GlobalValue *GV = dyn_cast<GlobalValue>(V))
> + return (GV->hasLocalLinkage() ||
> + GV->hasHiddenVisibility() ||
> + GV->hasProtectedVisibility() ||
> + GV->hasUnnamedAddr()) &&
> + !GV->isThreadLocal();
> if (const Argument *A = dyn_cast<Argument>(V))
> return A->hasByValAttr();
> return false;
>
> Modified: llvm/trunk/test/Transforms/InstSimplify/noalias-ptr.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/noalias-ptr.ll?rev=223347&r1=223346&r2=223347&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstSimplify/noalias-ptr.ll (original)
> +++ llvm/trunk/test/Transforms/InstSimplify/noalias-ptr.ll Thu Dec 4 03:22:28 2014
> @@ -3,6 +3,11 @@ target datalayout = "e-m:e-i64:64-f80:12
> target triple = "x86_64-unknown-linux-gnu"
>
> @g1 = global i32 0, align 4
> + at g2 = internal global i32 0, align 4
> + at g3 = unnamed_addr global i32 0, align 4
> + at g4 = hidden global i32 0, align 4
> + at g5 = protected global i32 0, align 4
> + at g6 = thread_local unnamed_addr global i32 0, align 4
>
> ; Make sure we can simplify away a pointer comparison between
> ; dynamically-allocated memory and a local stack allocation.
> @@ -43,7 +48,7 @@ define void @_Z2p2bb(i1 zeroext %b1, i1
> %mStackData = alloca [10 x i32], align 16
> %1 = bitcast [10 x i32]* %mStackData to i8*
> %2 = getelementptr inbounds [10 x i32]* %mStackData, i64 0, i64 0
> - %3 = select i1 %b1, i32* %2, i32* @g1
> + %3 = select i1 %b1, i32* %2, i32* @g2
> %4 = tail call noalias i8* @_Znam(i64 48) #4
> %5 = tail call noalias i8* @_Znam(i64 48) #4
> %.v = select i1 %b2, i8* %4, i8* %5
> @@ -64,6 +69,81 @@ define void @_Z2p2bb(i1 zeroext %b1, i1
> ret void
> }
>
> +define void @_Z2p4bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
> + %mStackData = alloca [10 x i32], align 16
> + %1 = bitcast [10 x i32]* %mStackData to i8*
> + %2 = getelementptr inbounds [10 x i32]* %mStackData, i64 0, i64 0
> + %3 = select i1 %b1, i32* %2, i32* @g3
> + %4 = tail call noalias i8* @_Znam(i64 48) #4
> + %5 = tail call noalias i8* @_Znam(i64 48) #4
> + %.v = select i1 %b2, i8* %4, i8* %5
> + %6 = bitcast i8* %.v to i32*
> + %7 = icmp eq i32* %6, %3
> + br i1 %7, label %9, label %8
> +
> +; CHECK-LABEL: @_Z2p4bb
> +; CHECK-NOT: icmp
> +; CHECK: ret void
> +
> +; <label>:8 ; preds = %0
> + call void @_ZdaPv(i8* %4) #5
> + call void @_ZdaPv(i8* %5) #5
> + br label %9
> +
> +; <label>:9 ; preds = %0, %8
> + ret void
> +}
> +
> +define void @_Z2p5bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
> + %mStackData = alloca [10 x i32], align 16
> + %1 = bitcast [10 x i32]* %mStackData to i8*
> + %2 = getelementptr inbounds [10 x i32]* %mStackData, i64 0, i64 0
> + %3 = select i1 %b1, i32* %2, i32* @g4
> + %4 = tail call noalias i8* @_Znam(i64 48) #4
> + %5 = tail call noalias i8* @_Znam(i64 48) #4
> + %.v = select i1 %b2, i8* %4, i8* %5
> + %6 = bitcast i8* %.v to i32*
> + %7 = icmp eq i32* %6, %3
> + br i1 %7, label %9, label %8
> +
> +; CHECK-LABEL: @_Z2p5bb
> +; CHECK-NOT: icmp
> +; CHECK: ret void
> +
> +; <label>:8 ; preds = %0
> + call void @_ZdaPv(i8* %4) #5
> + call void @_ZdaPv(i8* %5) #5
> + br label %9
> +
> +; <label>:9 ; preds = %0, %8
> + ret void
> +}
> +
> +define void @_Z2p6bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
> + %mStackData = alloca [10 x i32], align 16
> + %1 = bitcast [10 x i32]* %mStackData to i8*
> + %2 = getelementptr inbounds [10 x i32]* %mStackData, i64 0, i64 0
> + %3 = select i1 %b1, i32* %2, i32* @g5
> + %4 = tail call noalias i8* @_Znam(i64 48) #4
> + %5 = tail call noalias i8* @_Znam(i64 48) #4
> + %.v = select i1 %b2, i8* %4, i8* %5
> + %6 = bitcast i8* %.v to i32*
> + %7 = icmp eq i32* %6, %3
> + br i1 %7, label %9, label %8
> +
> +; CHECK-LABEL: @_Z2p6bb
> +; CHECK-NOT: icmp
> +; CHECK: ret void
> +
> +; <label>:8 ; preds = %0
> + call void @_ZdaPv(i8* %4) #5
> + call void @_ZdaPv(i8* %5) #5
> + br label %9
> +
> +; <label>:9 ; preds = %0, %8
> + ret void
> +}
> +
> ; Here's another case involving multiple underlying objects, but this time we
> ; must keep the comparison (it might involve a regular pointer-typed function
> ; argument).
> @@ -93,6 +173,77 @@ define void @_Z4nopebbPi(i1 zeroext %b1,
> ret void
> }
>
> +define void @_Z2p3bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
> + %mStackData = alloca [10 x i32], align 16
> + %1 = bitcast [10 x i32]* %mStackData to i8*
> + %2 = getelementptr inbounds [10 x i32]* %mStackData, i64 0, i64 0
> + %3 = select i1 %b1, i32* %2, i32* @g1
> + %4 = tail call noalias i8* @_Znam(i64 48) #4
> + %5 = tail call noalias i8* @_Znam(i64 48) #4
> + %.v = select i1 %b2, i8* %4, i8* %5
> + %6 = bitcast i8* %.v to i32*
> + %7 = icmp eq i32* %6, %3
> + br i1 %7, label %9, label %8
> +
> +; CHECK-LABEL: @_Z2p3bb
> +; CHECK: icmp
> +; CHECK: ret void
> +
> +; <label>:8 ; preds = %0
> + call void @_ZdaPv(i8* %4) #5
> + call void @_ZdaPv(i8* %5) #5
> + br label %9
> +
> +; <label>:9 ; preds = %0, %8
> + ret void
> +}
> +
> +define void @_Z2p7bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
> + %mStackData = alloca [10 x i32], align 16
> + %1 = bitcast [10 x i32]* %mStackData to i8*
> + %2 = getelementptr inbounds [10 x i32]* %mStackData, i64 0, i64 0
> + %3 = select i1 %b1, i32* %2, i32* @g6
> + %4 = tail call noalias i8* @_Znam(i64 48) #4
> + %5 = tail call noalias i8* @_Znam(i64 48) #4
> + %.v = select i1 %b2, i8* %4, i8* %5
> + %6 = bitcast i8* %.v to i32*
> + %7 = icmp eq i32* %6, %3
> + br i1 %7, label %9, label %8
> +
> +; CHECK-LABEL: @_Z2p7bb
> +; CHECK: icmp
> +; CHECK: ret void
> +
> +; <label>:8 ; preds = %0
> + call void @_ZdaPv(i8* %4) #5
> + call void @_ZdaPv(i8* %5) #5
> + br label %9
> +
> +; <label>:9 ; preds = %0, %8
> + ret void
> +}
> +
> +define void @_Z2p2v(i32 %c) #0 {
> + %mStackData = alloca [10 x i32], i32 %c, align 16
> + %1 = bitcast [10 x i32]* %mStackData to i8*
> + %2 = tail call noalias i8* @_Znam(i64 48) #4
> + %3 = bitcast i8* %2 to i32*
> + %4 = getelementptr inbounds [10 x i32]* %mStackData, i64 0, i64 0
> + %5 = icmp eq i32* %3, %4
> + br i1 %5, label %7, label %6
> +
> +; CHECK-LABEL: @_Z2p2v
> +; CHECK: icmp
> +; CHECK: ret void
> +
> +; <label>:6 ; preds = %0
> + call void @_ZdaPv(i8* %2) #5
> + br label %7
> +
> +; <label>:7 ; preds = %0, %6
> + ret void
> +}
> +
> ; Function Attrs: nobuiltin
> declare noalias i8* @_Znam(i64) #2
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list