[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