[llvm] r223347 - Restrict somewhat the memory-allocation pointer cmp opt from r223093

Alexander Potapenko glider at google.com
Thu Dec 4 06:22:03 PST 2014


Yeah, looks like the same code position. Reverting.

FAILED: /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build_msan/bin/clang++
  -DCLANG_ENABLE_ARCMT -DCLANG_ENABLE_OBJC_REWRITER
-DCLANG_ENABLE_STATIC_ANALYZER -DGTEST_HAS_RTTI=0 -D_DEBUG
-D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
-D__STDC_LIMIT_MACROS -fPIC -fvisibility-inlines-hidden -Wall -W
-Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wmissing-field-initializers -pedantic -Wno-long-long
-Wcovered-switch-default -Wnon-virtual-dtor -std=c++11
-fcolor-diagnostics -ffunction-sections -fdata-sections -fno-common
-Woverloaded-virtual -fno-strict-aliasing -Wno-nested-anon-types -O3
-Itools/clang/lib/Sema
-I/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Sema
-I/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/include
-Itools/clang/include -Iinclude
-I/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/include
   -UNDEBUG -fno-exceptions -fno-rtti -MMD -MT
tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaOpenMP.cpp.o -MF
tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaOpenMP.cpp.o.d -o
tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaOpenMP.cpp.o -c
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Sema/SemaOpenMP.cpp
0  clang-3.6       0x00007f175a2426ac backtrace + 108
1  clang-3.6       0x00007f175d070ff7
llvm::sys::PrintStackTrace(_IO_FILE*) + 1383
2  clang-3.6       0x00007f175d0750ec
3  clang-3.6       0x00007f175a23003c
4  libpthread.so.0 0x00007f17590e10a0
5  clang-3.6       0x00007f175c634ead
llvm::AllocaInst::isStaticAlloca() const + 173
6  clang-3.6       0x00007f175bad52ae
7  clang-3.6       0x00007f175bae2016
llvm::SimplifyInstruction(llvm::Instruction*, llvm::DataLayout const*,
llvm::TargetLibraryInfo const*, llvm::DominatorTree const*,
llvm::AssumptionTracker*) + 8902
8  clang-3.6       0x00007f175d0a6be4
llvm::CloneAndPruneFunctionInto(llvm::Function*, llvm::Function
const*, llvm::ValueMap<llvm::Value const*, llvm::WeakVH,
llvm::ValueMapConfig<llvm::Value const*, llvm::sys::SmartMutex<false>
> >&, bool, llvm::SmallVectorImpl<llvm::ReturnInst*>&, char const*,
llvm::ClonedCodeInfo*, llvm::DataLayout const*, llvm::Instruction*) +
4644
9  clang-3.6       0x00007f175d0cf535
llvm::InlineFunction(llvm::CallSite, llvm::InlineFunctionInfo&, bool)
+ 10949
10 clang-3.6       0x00007f175c809ca2
llvm::Inliner::runOnSCC(llvm::CallGraphSCC&) + 10626
11 clang-3.6       0x00007f175e8738bc
12 clang-3.6       0x00007f175c68dba0
llvm::legacy::PassManagerImpl::run(llvm::Module&) + 3712
13 clang-3.6       0x00007f175deba80d
clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::CodeGenOptions const&, clang::TargetOptions const&,
clang::LangOptions const&, llvm::StringRef, llvm::Module*,
clang::BackendAction, llvm::raw_ostream*) + 19389
14 clang-3.6       0x00007f175de954ff
15 clang-3.6       0x00007f175f2da9c3 clang::ParseAST(clang::Sema&,
bool, bool) + 1891
16 clang-3.6       0x00007f175d5ca3d6 clang::FrontendAction::Execute() + 278
17 clang-3.6       0x00007f175d5466a3
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 3107
18 clang-3.6       0x00007f175d79365d
clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 9021
19 clang-3.6       0x00007f175a298bdc cc1_main(llvm::ArrayRef<char
const*>, char const*, void*) + 1868
20 clang-3.6       0x00007f175a293800 main + 33360
21 libc.so.6       0x00007f1758537ead __libc_start_main + 253
22 clang-3.6       0x00007f175a229a11
Stack dump:
0. Program arguments:
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build_msan/bin/clang-3.6
-cc1 -triple x86_64-unknown-linux-gnu -emit-obj -disable-free
-main-file-name SemaOpenMP.cpp -mrelocation-model pic -pic-level 2
-mthread-model posix -relaxed-aliasing -fmath-errno -masm-verbose
-mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu
x86-64 -momit-leaf-frame-pointer -dwarf-column-info
-ffunction-sections -fdata-sections -coverage-file
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build2_msan/tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaOpenMP.cpp.o
-resource-dir /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build_msan/bin/../lib/clang/3.6.0
-dependency-file
tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaOpenMP.cpp.o.d -MT
tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaOpenMP.cpp.o -D
CLANG_ENABLE_ARCMT -D CLANG_ENABLE_OBJC_REWRITER -D
CLANG_ENABLE_STATIC_ANALYZER -D GTEST_HAS_RTTI=0 -D _DEBUG -D
_GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D
__STDC_LIMIT_MACROS -U NDEBUG -I tools/clang/lib/Sema -I
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Sema
-I /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/include
-I tools/clang/include -I include -I
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/include
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/x86_64-linux-gnu
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/backward
-internal-isystem /usr/local/include -internal-isystem
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build_msan/bin/../lib/clang/3.6.0/include
-internal-externc-isystem /usr/include/x86_64-linux-gnu
-internal-externc-isystem /include -internal-externc-isystem
/usr/include -O3 -Wall -W -Wno-unused-parameter -Wwrite-strings
-Wcast-qual -Wmissing-field-initializers -Wno-long-long
-Wcovered-switch-default -Wnon-virtual-dtor -Woverloaded-virtual
-Wno-nested-anon-types -pedantic -std=c++11 -fdeprecated-macro
-fdebug-compilation-dir
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build2_msan
-ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden
-mstackrealign -fno-rtti -fobjc-runtime=gcc -fno-common
-fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops
-vectorize-slp -o
tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaOpenMP.cpp.o -x c++
/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Sema/SemaOpenMP.cpp
1. <eof> parser at end of file
2. Per-module optimization passes
3. Running pass 'CallGraph Pass Manager' on module
'/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Sema/SemaOpenMP.cpp'.
clang-3.6: error: unable to execute command: Segmentation fault
clang-3.6: error: clang frontend command failed due to signal (use -v
to see invocation)
clang version 3.6.0 (trunk 223352)
Target: x86_64-unknown-linux-gnu
Thread model: posix
clang-3.6: note: diagnostic msg: PLEASE submit a bug report to
http://llvm.org/bugs/ and include the crash backtrace, preprocessed
source, and associated run script.
clang-3.6: note: diagnostic msg:
********************

(http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/5243/steps/build%20stage3%2Fmsan%20clang/logs/stdio)

On Thu, Dec 4, 2014 at 2:11 PM, Evgeniy Stepanov
<eugeni.stepanov at gmail.com> wrote:
> 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
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



-- 
Alexander Potapenko
Software Engineer
Google Moscow



More information about the llvm-commits mailing list