[llvm] r222039 - Reapply r221924: "[GVN] Perform Scalar PRE on gep indices that feed loads before
Chad Rosier
mcrosier at codeaurora.org
Tue Nov 18 18:08:41 PST 2014
Thanks, Manman. Balaram or another one of our team members will investigate.
Chad
>
> Hi Chad,
>
> I reverted the commit in r222287.
>
> The lto self host of r222239 without this commit succeeded.
> And I have finished the lto self host of r222239 including this commit, it
> failed. If you need any more files, let me know.
>
> Thanks,
> Manman
>
> clang(59539,0x7fff7c035300) malloc: *** error for object 0x7fa438648450:
> pointer being freed was not allocated
> *** set a breakpoint in malloc_error_break to debug
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/fixxfti.c
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/x86_64/floatdidf.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/fixxfti.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/fixxfti.c
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/x86_64/floatdisf.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins__x86_64/floatdisf.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/x86_64/floatdisf.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins__x86_64/floatdidf.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/x86_64/floatdidf.c
> clang(59547,0x7fff7c035300) malloc: *** error for object 0x7f9410f1c0d0:
> pointer being freed was not allocated
> *** set a breakpoint in malloc_error_break to debug
> 0 clang 0x000000010c15d259
> llvm::sys::PrintStackTrace(__sFILE*) + 57
> 1 clang 0x000000010c15ddab SignalHandler(int) + 347
> 2 libsystem_platform.dylib 0x00007fff980faf1a _sigtramp + 26
> 3 libsystem_platform.dylib 0xffffffffffffffff _sigtramp + 1743802623
> 4 libsystem_c.dylib 0x00007fff982ccb73 abort + 129
> 5 libsystem_malloc.dylib 0x00007fff98e7b937 nano_size + 0
> 6 clang 0x000000010b7b77b9 (anonymous
> namespace)::X86TTI::getIntImmCost(llvm::APInt const&, llvm::Type*) const +
> 601
> 7 clang 0x000000010b7b6cd8 non-virtual thunk to
> (anonymous namespace)::X86TTI::getIntImmCost(unsigned int, unsigned int,
> llvm::APInt const&, llvm::Type*) const + 216
> 8 clang 0x000000010bb73333 (anonymous
> namespace)::ConstantHoisting::collectConstantCandidates(llvm::DenseMap<llvm::ConstantInt*,
> unsigned int, llvm::DenseMapInfo<llvm::ConstantInt*> >&,
> llvm::Instruction*, unsigned int, llvm::ConstantInt*) + 211
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/x86_64/floatdixf.c
> 9 clang 0x000000010bb6ecf4 (anonymous
> namespace)::ConstantHoisting::runOnFunction(llvm::Function&) + 516
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/floattidf.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins__x86_64/floatdixf.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/x86_64/floatdixf.c
> 10 clang 0x000000010c0e3a25
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 549
> 11 clang 0x000000010c0e3c9b
> llvm::FPPassManager::runOnModule(llvm::Module&) + 43
> 12 clang 0x000000010c0e412a
> llvm::legacy::PassManagerImpl::run(llvm::Module&) + 922
> 13 clang 0x000000010a445430
> clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions
> const&, clang::TargetOptions const&, clang::LangOptions const&,
> llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*)
> + 12208
> 0 clang 0x00000001059d5259
> llvm::sys::PrintStackTrace(__sFILE*) + 57
> 14 clang 0x000000010a5cda44
> clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) + 516
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/floattidf.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/floattidf.c
> 1 clang 0x00000001059d5dab SignalHandler(int) + 347
> 2 libsystem_platform.dylib 0x00007fff980faf1a _sigtramp + 26
> 3 libsystem_platform.dylib 0xffffffffffffffff _sigtramp + 1743802623
> 15 clang 0x000000010a6864c5 4 libsystem_c.dylib
> 0x00007fff982ccb73 clang::ParseAST(clang::Sema&, bool, bool)abort + 661 +
> 129
>
> 5 libsystem_malloc.dylib 0x00007fff98e7b937 nano_size + 0
> 16 clang 0x000000010a1f2b7e
> clang::FrontendAction::Execute() + 62
> 6 clang 0x000000010502f7b9 (anonymous
> namespace)::X86TTI::getIntImmCost(llvm::APInt const&, llvm::Type*) const +
> 601
> 17 clang 0x000000010a1ba8d3
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 915
> 7 clang 0x000000010502ecd8 non-virtual thunk to
> (anonymous namespace)::X86TTI::getIntImmCost(unsigned int, unsigned int,
> llvm::APInt const&, llvm::Type*) const + 216
> 18 clang 0x000000010a16a3fa
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 2890
> 8 clang 0x00000001053eb333 (anonymous
> namespace)::ConstantHoisting::collectConstantCandidates(llvm::DenseMap<llvm::ConstantInt*,
> unsigned int, llvm::DenseMapInfo<llvm::ConstantInt*> >&,
> llvm::Instruction*, unsigned int, llvm::ConstantInt*) + 211
> 19 clang 0x000000010a16000c
> cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 1836
> 9 clang 0x00000001053e6cf4 (anonymous
> namespace)::ConstantHoisting::runOnFunction(llvm::Function&) + 516
> 20 clang 0x000000010a168b21 main + 13745
> 21 libdyld.dylib 0x00007fff8b4215c9 start + 1
> 22 libdyld.dylib 0x0000000000000045 start + 1958603389
> 10 clang 0x000000010595ba25
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 549
> Stack dump:
> 0. Program arguments: /Users/manmanren/gmail/selfhost/Release/bin/clang
> -cc1 -triple x86_64-apple-macosx10.4.0 -emit-obj -disable-free
> -disable-llvm-verifier -main-file-name fixunsxfti.c -static-define
> -mrelocation-model static -mthread-model posix -masm-verbose
> -fforbid-guard-variables -target-cpu core2 -disable-red-zone
> -no-implicit-float -target-linker-version 242 -dwarf-column-info
> -coverage-file
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/fixunsxfti.o
> -resource-dir
> /Users/manmanren/gmail/selfhost/Release/bin/../lib/clang/3.6.0 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -D VISIBILITY_HIDDEN -D KERNEL_USE -I
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib -I
> /Users/manmanren/gmail/llvm/projects/compiler-rt/include -O3 -Wall -Werror
> -fdebug-compilation-dir /Users/manmanren/gmail/llvm/projects/compiler-rt
> -ferror-limit 19 -fmessage-length 164 -fvisibility hidden -ffreestanding
> -mstackrealign -fno-builtin -fblocks -fblocks-runtime-optional -fno-rtti
> -fno-use-cxa-atexit -fobjc-runtime=macosx-10.4.0
> -fobjc-dispatch-method=non-legacy -fencode-extended-block-signature
> -fmax-type-align=16 -fno-common -fdiagnostics-show-option
> -fcolor-diagnostics -vectorize-loops -vectorize-slp -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/fixunsxfti.o
> -x c
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/fixunsxfti.c
> 1. <eof> parser at end of file
> 2. Code generation
> 3. Running pass 'Function Pass Manager' on module
> '/Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/fixunsxfti.c'.
> 4. Running pass 'Constant Hoisting' on function '@__fixunsxfti'
> 11 clang 0x000000010595bc9b
> llvm::FPPassManager::runOnModule(llvm::Module&) + 43
> 12 clang 0x000000010595c12a
> llvm::legacy::PassManagerImpl::run(llvm::Module&) + 922
> 13 clang 0x0000000103cbd430
> clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions
> const&, clang::TargetOptions const&, clang::LangOptions const&,
> llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*)
> + 12208
> 14 clang 0x0000000103e45a44
> clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) + 516
> 15 clang 0x0000000103efe4c5
> clang::ParseAST(clang::Sema&, bool, bool) + 661
> 16 clang 0x0000000103a6ab7e
> clang::FrontendAction::Execute() + 62
> 17 clang 0x0000000103a328d3
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 915
> 18 clang 0x00000001039e23fa
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 2890
> 19 clang 0x00000001039d800c
> cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 1836
> 20 clang 0x00000001039e0b21 main + 13745
> 21 libdyld.dylib 0x00007fff8b4215c9 start + 1
> 22 libdyld.dylib 0x0000000000000045 start + 1958603389
> Stack dump:
> 0. Program arguments: /Users/manmanren/gmail/selfhost/Release/bin/clang
> -cc1 -triple x86_64-apple-macosx10.4.0 -emit-obj -disable-free
> -disable-llvm-verifier -main-file-name fixxfti.c -static-define
> -mrelocation-model static -mthread-model posix -masm-verbose
> -fforbid-guard-variables -target-cpu core2 -disable-red-zone
> -no-implicit-float -target-linker-version 242 -dwarf-column-info
> -coverage-file
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/fixxfti.o
> -resource-dir
> /Users/manmanren/gmail/selfhost/Release/bin/../lib/clang/3.6.0 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -D VISIBILITY_HIDDEN -D KERNEL_USE -I
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib -I
> /Users/manmanren/gmail/llvm/projects/compiler-rt/include -O3 -Wall -Werror
> -fdebug-compilation-dir /Users/manmanren/gmail/llvm/projects/compiler-rt
> -ferror-limit 19 -fmessage-length 164 -fvisibility hidden -ffreestanding
> -mstackrealign -fno-builtin -fblocks -fblocks-runtime-optional -fno-rtti
> -fno-use-cxa-atexit -fobjc-runtime=macosx-10.4.0
> -fobjc-dispatch-method=non-legacy -fencode-extended-block-signature
> -fmax-type-align=16 -fno-common -fdiagnostics-show-option
> -fcolor-diagnostics -vectorize-loops -vectorize-slp -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/fixxfti.o
> -x c
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/fixxfti.c
> 1. <eof> parser at end of file
> 2. Code generation
> 3. Running pass 'Function Pass Manager' on module
> '/Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/fixxfti.c'.
> 4. Running pass 'Constant Hoisting' on function '@__fixxfti'
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/floattisf.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/floattisf.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/floattisf.c
>
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/powidf2.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/popcountti2.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/popcountti2.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/powidf2.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/powidf2.c
> clang: error: unable to execute command: Abort trap: 6
> clang: error: clang frontend command failed due to signal (use -v to see
> invocation)
> clang version 3.6.0 (clang-Rlto_master_build 222059) (llvm/trunk 222239)
> Target: x86_64-apple-darwin14.0.0
> Thread model: posix
> clang: note: diagnostic msg: PLEASE submit a bug report to
> http://llvm.org/bugs/ and include the crash backtrace, preprocessed
> source, and associated run script.
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/powisf2.c
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/powisf2.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/powisf2.c
> clang: note: diagnostic msg:
> ********************
>
> PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
> Preprocessed source(s) and associated run script(s) are located at:
> clang: note: diagnostic msg:
> /var/folders/8d/mksp0c9x6yngd578zj_s72ym0000gn/T/fixxfti-868934.c
> clang: note: diagnostic msg:
> /var/folders/8d/mksp0c9x6yngd578zj_s72ym0000gn/T/fixxfti-868934.sh
> clang: note: diagnostic msg:
>
> ********************
> COMPILE: clang_darwin/cc_kext/x86_64:
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/powixf2.c
> make[5]: ***
> [/Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/fixxfti.o]
> Error 254
> make[5]: *** Waiting for unfinished jobs....
> /Users/manmanren/gmail/selfhost/Release/bin/clang -fPIC
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/lib
> -I/Users/manmanren/gmail/llvm/projects/compiler-rt/include -arch x86_64
> -fvisibility=hidden -DVISIBILITY_HIDDEN -mkernel -DKERNEL_USE -Wall
> -Werror -O3 -fomit-frame-pointer -mmacosx-version-min=10.4 -isysroot
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
> -c -o
> /Users/manmanren/gmail/selfhost/tools/clang/runtime/compiler-rt/clang_darwin/cc_kext/x86_64/SubDir.lib__builtins/powixf2.o
> /Users/manmanren/gmail/llvm/projects/compiler-rt/lib/builtins/powixf2.c
> clang: error: unable to execute command: Abort trap: 6
> clang: error: clang frontend command failed due to signal (use -v to see
> invocation)
> clang version 3.6.0 (clang-Rlto_master_build 222059) (llvm/trunk 222239)
> Target: x86_64-apple-darwin14.0.0
> Thread model: posix
> clang: 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: note: diagnostic msg:
> ********************
>
> PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
> Preprocessed source(s) and associated run script(s) are located at:
> clang: note: diagnostic msg:
> /var/folders/8d/mksp0c9x6yngd578zj_s72ym0000gn/T/fixunsxfti-33f776.c
> clang: note: diagnostic msg:
> /var/folders/8d/mksp0c9x6yngd578zj_s72ym0000gn/T/fixunsxfti-33f776.sh
> clang: note: diagnostic msg:
>
> ********************
>
>
>> On Nov 18, 2014, at 2:53 PM, Chad Rosier <mcrosier at codeaurora.org>
>> wrote:
>>
>> Hi Manman,
>> Feel free to revert the patch if you're convinced this is the problem.
>> Please keep Balaram, James, and I updated on the progress. This is a
>> performance critical fix, so we need to make sure it doesn't get lost in
>> the mix.
>>
>> Chad
>>
>>> Hi Chad,
>>>
>>> About the buildbot phase 2 failure, I now think this commit is the root
>>> cause.
>>>
>>> What I did was:
>>> 1> update the repo to r222239, then "svn merge -c -r222039 .â, made a
>>> release+assert build (installed to clang-install).
>>> 2> use clang-install binary and library to build the same repo with
>>> lto.
>>> make -j 4 VERBOSE=1 CLANG_REPOSITORY_STRING=clang-Rlto_master_build
>>> SVN_REVISION=222059
>>> DYLD_LIBRARY_PATH=/Users/manmanren/llvm_gmail/clang-install/lib/
>>> 3> the build completed
>>> make[1]: Nothing to be done for `all'.
>>> make[1]: Nothing to be done for `all'.
>>> llvm[0]: ***** Completed Release Build
>>>
>>> Is it okay for us to revert this commit and watch the bot? If the bot
>>> is
>>> still red, we can re-submit it.
>>>
>>> If you want me to do more testing (maybe a lto self host with r22239),
>>> let
>>> me know,
>>>
>>> Thanks,
>>> Manman (The build czar)
>>>
>>>> On Nov 14, 2014, at 1:09 PM, Chad Rosier <mcrosier at codeaurora.org>
>>>> wrote:
>>>>
>>>> Author: mcrosier
>>>> Date: Fri Nov 14 15:09:13 2014
>>>> New Revision: 222039
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=222039&view=rev
>>>> Log:
>>>> Reapply r221924: "[GVN] Perform Scalar PRE on gep indices that feed
>>>> loads before
>>>> doing Load PRE"
>>>>
>>>> This commit updates the failing test in
>>>> Analysis/TypeBasedAliasAnalysis/gvn-nonlocal-type-mismatch.ll
>>>>
>>>> The failing test is sensitive to the order in which we process loads.
>>>> This
>>>> version turns on the RPO traversal instead of the while DT traversal
>>>> in
>>>> GVN.
>>>> The new test code is functionally same just the order of loads that
>>>> are
>>>> eliminated is swapped.
>>>>
>>>> This new version also fixes an issue where GVN splits a critical edge
>>>> and
>>>> potentially invalidate the RPO/DT iterator.
>>>>
>>>> Added:
>>>> llvm/trunk/test/Transforms/GVN/pre-gep-load.ll
>>>> Modified:
>>>> llvm/trunk/lib/Transforms/Scalar/GVN.cpp
>>>> llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/gvn-nonlocal-type-mismatch.ll
>>>>
>>>> Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=222039&r1=222038&r2=222039&view=diff
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
>>>> +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Fri Nov 14 15:09:13 2014
>>>> @@ -20,6 +20,7 @@
>>>> #include "llvm/ADT/DepthFirstIterator.h"
>>>> #include "llvm/ADT/Hashing.h"
>>>> #include "llvm/ADT/MapVector.h"
>>>> +#include "llvm/ADT/PostOrderIterator.h"
>>>> #include "llvm/ADT/SetVector.h"
>>>> #include "llvm/ADT/SmallPtrSet.h"
>>>> #include "llvm/ADT/Statistic.h"
>>>> @@ -709,6 +710,7 @@ namespace {
>>>> void dump(DenseMap<uint32_t, Value*> &d);
>>>> bool iterateOnFunction(Function &F);
>>>> bool performPRE(Function &F);
>>>> + bool performScalarPRE(Instruction *I);
>>>> Value *findLeader(const BasicBlock *BB, uint32_t num);
>>>> void cleanupGlobalSets();
>>>> void verifyRemoved(const Instruction *I) const;
>>>> @@ -1729,6 +1731,15 @@ bool GVN::processNonLocalLoad(LoadInst *
>>>> return false;
>>>> }
>>>>
>>>> + // If this load follows a GEP, see if we can PRE the indices before
>>>> analyzing.
>>>> + if (GetElementPtrInst *GEP =
>>>> dyn_cast<GetElementPtrInst>(LI->getOperand(0))) {
>>>> + for (GetElementPtrInst::op_iterator OI = GEP->idx_begin(),
>>>> + OE = GEP->idx_end();
>>>> + OI != OE; ++OI)
>>>> + if (Instruction *I = dyn_cast<Instruction>(OI->get()))
>>>> + performScalarPRE(I);
>>>> + }
>>>> +
>>>> // Step 2: Analyze the availability of the load
>>>> AvailValInBlkVect ValuesPerBlock;
>>>> UnavailBlkVect UnavailableBlocks;
>>>> @@ -2431,175 +2442,182 @@ bool GVN::processBlock(BasicBlock *BB) {
>>>> return ChangedFunction;
>>>> }
>>>>
>>>> -/// performPRE - Perform a purely local form of PRE that looks for
>>>> diamond
>>>> -/// control flow patterns and attempts to perform simple PRE at the
>>>> join point.
>>>> -bool GVN::performPRE(Function &F) {
>>>> - bool Changed = false;
>>>> +bool GVN::performScalarPRE(Instruction *CurInst) {
>>>> SmallVector<std::pair<Value*, BasicBlock*>, 8> predMap;
>>>> - for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
>>>> - // Nothing to PRE in the entry block.
>>>> - if (CurrentBlock == &F.getEntryBlock()) continue;
>>>>
>>>> - // Don't perform PRE on a landing pad.
>>>> - if (CurrentBlock->isLandingPad()) continue;
>>>> + if (isa<AllocaInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
>>>> + isa<PHINode>(CurInst) || CurInst->getType()->isVoidTy() ||
>>>> + CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects()
>>>> ||
>>>> + isa<DbgInfoIntrinsic>(CurInst))
>>>> + return false;
>>>>
>>>> - for (BasicBlock::iterator BI = CurrentBlock->begin(),
>>>> - BE = CurrentBlock->end(); BI != BE; ) {
>>>> - Instruction *CurInst = BI++;
>>>> + // Don't do PRE on compares. The PHI would prevent CodeGenPrepare
>>>> from
>>>> + // sinking the compare again, and it would force the code generator
>>>> to
>>>> + // move the i1 from processor flags or predicate registers into a
>>>> general
>>>> + // purpose register.
>>>> + if (isa<CmpInst>(CurInst))
>>>> + return false;
>>>>
>>>> - if (isa<AllocaInst>(CurInst) ||
>>>> - isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
>>>> - CurInst->getType()->isVoidTy() ||
>>>> - CurInst->mayReadFromMemory() ||
>>>> CurInst->mayHaveSideEffects()
>>>> ||
>>>> - isa<DbgInfoIntrinsic>(CurInst))
>>>> - continue;
>>>> + // We don't currently value number ANY inline asm calls.
>>>> + if (CallInst *CallI = dyn_cast<CallInst>(CurInst))
>>>> + if (CallI->isInlineAsm())
>>>> + return false;
>>>>
>>>> - // Don't do PRE on compares. The PHI would prevent
>>>> CodeGenPrepare
>>>> from
>>>> - // sinking the compare again, and it would force the code
>>>> generator to
>>>> - // move the i1 from processor flags or predicate registers into
>>>> a
>>>> general
>>>> - // purpose register.
>>>> - if (isa<CmpInst>(CurInst))
>>>> - continue;
>>>> + uint32_t ValNo = VN.lookup(CurInst);
>>>>
>>>> - // We don't currently value number ANY inline asm calls.
>>>> - if (CallInst *CallI = dyn_cast<CallInst>(CurInst))
>>>> - if (CallI->isInlineAsm())
>>>> - continue;
>>>> + // Look for the predecessors for PRE opportunities. We're
>>>> + // only trying to solve the basic diamond case, where
>>>> + // a value is computed in the successor and one predecessor,
>>>> + // but not the other. We also explicitly disallow cases
>>>> + // where the successor is its own predecessor, because they're
>>>> + // more complicated to get right.
>>>> + unsigned NumWith = 0;
>>>> + unsigned NumWithout = 0;
>>>> + BasicBlock *PREPred = nullptr;
>>>> + BasicBlock *CurrentBlock = CurInst->getParent();
>>>> + predMap.clear();
>>>> +
>>>> + for (pred_iterator PI = pred_begin(CurrentBlock), PE =
>>>> pred_end(CurrentBlock);
>>>> + PI != PE; ++PI) {
>>>> + BasicBlock *P = *PI;
>>>> + // We're not interested in PRE where the block is its
>>>> + // own predecessor, or in blocks with predecessors
>>>> + // that are not reachable.
>>>> + if (P == CurrentBlock) {
>>>> + NumWithout = 2;
>>>> + break;
>>>> + } else if (!DT->isReachableFromEntry(P)) {
>>>> + NumWithout = 2;
>>>> + break;
>>>> + }
>>>>
>>>> - uint32_t ValNo = VN.lookup(CurInst);
>>>> + Value *predV = findLeader(P, ValNo);
>>>> + if (!predV) {
>>>> + predMap.push_back(std::make_pair(static_cast<Value *>(nullptr),
>>>> P));
>>>> + PREPred = P;
>>>> + ++NumWithout;
>>>> + } else if (predV == CurInst) {
>>>> + /* CurInst dominates this predecessor. */
>>>> + NumWithout = 2;
>>>> + break;
>>>> + } else {
>>>> + predMap.push_back(std::make_pair(predV, P));
>>>> + ++NumWith;
>>>> + }
>>>> + }
>>>>
>>>> - // Look for the predecessors for PRE opportunities. We're
>>>> - // only trying to solve the basic diamond case, where
>>>> - // a value is computed in the successor and one predecessor,
>>>> - // but not the other. We also explicitly disallow cases
>>>> - // where the successor is its own predecessor, because they're
>>>> - // more complicated to get right.
>>>> - unsigned NumWith = 0;
>>>> - unsigned NumWithout = 0;
>>>> - BasicBlock *PREPred = nullptr;
>>>> - predMap.clear();
>>>> -
>>>> - for (pred_iterator PI = pred_begin(CurrentBlock),
>>>> - PE = pred_end(CurrentBlock); PI != PE; ++PI) {
>>>> - BasicBlock *P = *PI;
>>>> - // We're not interested in PRE where the block is its
>>>> - // own predecessor, or in blocks with predecessors
>>>> - // that are not reachable.
>>>> - if (P == CurrentBlock) {
>>>> - NumWithout = 2;
>>>> - break;
>>>> - } else if (!DT->isReachableFromEntry(P)) {
>>>> - NumWithout = 2;
>>>> - break;
>>>> - }
>>>> + // Don't do PRE when it might increase code size, i.e. when
>>>> + // we would need to insert instructions in more than one pred.
>>>> + if (NumWithout != 1 || NumWith == 0)
>>>> + return false;
>>>>
>>>> - Value* predV = findLeader(P, ValNo);
>>>> - if (!predV) {
>>>> - predMap.push_back(std::make_pair(static_cast<Value
>>>> *>(nullptr), P));
>>>> - PREPred = P;
>>>> - ++NumWithout;
>>>> - } else if (predV == CurInst) {
>>>> - /* CurInst dominates this predecessor. */
>>>> - NumWithout = 2;
>>>> - break;
>>>> - } else {
>>>> - predMap.push_back(std::make_pair(predV, P));
>>>> - ++NumWith;
>>>> - }
>>>> - }
>>>> + // Don't do PRE across indirect branch.
>>>> + if (isa<IndirectBrInst>(PREPred->getTerminator()))
>>>> + return false;
>>>>
>>>> - // Don't do PRE when it might increase code size, i.e. when
>>>> - // we would need to insert instructions in more than one pred.
>>>> - if (NumWithout != 1 || NumWith == 0)
>>>> - continue;
>>>> + // We can't do PRE safely on a critical edge, so instead we
>>>> schedule
>>>> + // the edge to be split and perform the PRE the next time we
>>>> iterate
>>>> + // on the function.
>>>> + unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
>>>> + if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
>>>> + toSplit.push_back(std::make_pair(PREPred->getTerminator(),
>>>> SuccNum));
>>>> + return false;
>>>> + }
>>>>
>>>> - // Don't do PRE across indirect branch.
>>>> - if (isa<IndirectBrInst>(PREPred->getTerminator()))
>>>> - continue;
>>>> + // Instantiate the expression in the predecessor that lacked it.
>>>> + // Because we are going top-down through the block, all value
>>>> numbers
>>>> + // will be available in the predecessor by the time we need them.
>>>> Any
>>>> + // that weren't originally present will have been instantiated
>>>> earlier
>>>> + // in this loop.
>>>> + Instruction *PREInstr = CurInst->clone();
>>>> + bool success = true;
>>>> + for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
>>>> + Value *Op = PREInstr->getOperand(i);
>>>> + if (isa<Argument>(Op) || isa<Constant>(Op) ||
>>>> isa<GlobalValue>(Op))
>>>> + continue;
>>>>
>>>> - // We can't do PRE safely on a critical edge, so instead we
>>>> schedule
>>>> - // the edge to be split and perform the PRE the next time we
>>>> iterate
>>>> - // on the function.
>>>> - unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
>>>> - if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
>>>> - toSplit.push_back(std::make_pair(PREPred->getTerminator(),
>>>> SuccNum));
>>>> - continue;
>>>> - }
>>>> + if (Value *V = findLeader(PREPred, VN.lookup(Op))) {
>>>> + PREInstr->setOperand(i, V);
>>>> + } else {
>>>> + success = false;
>>>> + break;
>>>> + }
>>>> + }
>>>>
>>>> - // Instantiate the expression in the predecessor that lacked
>>>> it.
>>>> - // Because we are going top-down through the block, all value
>>>> numbers
>>>> - // will be available in the predecessor by the time we need
>>>> them.
>>>> Any
>>>> - // that weren't originally present will have been instantiated
>>>> earlier
>>>> - // in this loop.
>>>> - Instruction *PREInstr = CurInst->clone();
>>>> - bool success = true;
>>>> - for (unsigned i = 0, e = CurInst->getNumOperands(); i != e;
>>>> ++i)
>>>> {
>>>> - Value *Op = PREInstr->getOperand(i);
>>>> - if (isa<Argument>(Op) || isa<Constant>(Op) ||
>>>> isa<GlobalValue>(Op))
>>>> - continue;
>>>> + // Fail out if we encounter an operand that is not available in
>>>> + // the PRE predecessor. This is typically because of loads which
>>>> + // are not value numbered precisely.
>>>> + if (!success) {
>>>> + DEBUG(verifyRemoved(PREInstr));
>>>> + delete PREInstr;
>>>> + return false;
>>>> + }
>>>>
>>>> - if (Value *V = findLeader(PREPred, VN.lookup(Op))) {
>>>> - PREInstr->setOperand(i, V);
>>>> - } else {
>>>> - success = false;
>>>> - break;
>>>> - }
>>>> - }
>>>> + PREInstr->insertBefore(PREPred->getTerminator());
>>>> + PREInstr->setName(CurInst->getName() + ".pre");
>>>> + PREInstr->setDebugLoc(CurInst->getDebugLoc());
>>>> + VN.add(PREInstr, ValNo);
>>>> + ++NumGVNPRE;
>>>> +
>>>> + // Update the availability map to include the new instruction.
>>>> + addToLeaderTable(ValNo, PREInstr, PREPred);
>>>> +
>>>> + // Create a PHI to make the value available in this block.
>>>> + PHINode *Phi =
>>>> + PHINode::Create(CurInst->getType(), predMap.size(),
>>>> + CurInst->getName() + ".pre-phi",
>>>> CurrentBlock->begin());
>>>> + for (unsigned i = 0, e = predMap.size(); i != e; ++i) {
>>>> + if (Value *V = predMap[i].first)
>>>> + Phi->addIncoming(V, predMap[i].second);
>>>> + else
>>>> + Phi->addIncoming(PREInstr, PREPred);
>>>> + }
>>>>
>>>> - // Fail out if we encounter an operand that is not available in
>>>> - // the PRE predecessor. This is typically because of loads
>>>> which
>>>> - // are not value numbered precisely.
>>>> - if (!success) {
>>>> - DEBUG(verifyRemoved(PREInstr));
>>>> - delete PREInstr;
>>>> - continue;
>>>> - }
>>>> + VN.add(Phi, ValNo);
>>>> + addToLeaderTable(ValNo, Phi, CurrentBlock);
>>>> + Phi->setDebugLoc(CurInst->getDebugLoc());
>>>> + CurInst->replaceAllUsesWith(Phi);
>>>> + if (Phi->getType()->getScalarType()->isPointerTy()) {
>>>> + // Because we have added a PHI-use of the pointer value, it has
>>>> now
>>>> + // "escaped" from alias analysis' perspective. We need to inform
>>>> + // AA of this.
>>>> + for (unsigned ii = 0, ee = Phi->getNumIncomingValues(); ii != ee;
>>>> ++ii) {
>>>> + unsigned jj = PHINode::getOperandNumForIncomingValue(ii);
>>>> + VN.getAliasAnalysis()->addEscapingUse(Phi->getOperandUse(jj));
>>>> + }
>>>>
>>>> - PREInstr->insertBefore(PREPred->getTerminator());
>>>> - PREInstr->setName(CurInst->getName() + ".pre");
>>>> - PREInstr->setDebugLoc(CurInst->getDebugLoc());
>>>> - VN.add(PREInstr, ValNo);
>>>> - ++NumGVNPRE;
>>>> -
>>>> - // Update the availability map to include the new instruction.
>>>> - addToLeaderTable(ValNo, PREInstr, PREPred);
>>>> -
>>>> - // Create a PHI to make the value available in this block.
>>>> - PHINode* Phi = PHINode::Create(CurInst->getType(),
>>>> predMap.size(),
>>>> - CurInst->getName() + ".pre-phi",
>>>> - CurrentBlock->begin());
>>>> - for (unsigned i = 0, e = predMap.size(); i != e; ++i) {
>>>> - if (Value *V = predMap[i].first)
>>>> - Phi->addIncoming(V, predMap[i].second);
>>>> - else
>>>> - Phi->addIncoming(PREInstr, PREPred);
>>>> - }
>>>> -
>>>> - VN.add(Phi, ValNo);
>>>> - addToLeaderTable(ValNo, Phi, CurrentBlock);
>>>> - Phi->setDebugLoc(CurInst->getDebugLoc());
>>>> - CurInst->replaceAllUsesWith(Phi);
>>>> - if (Phi->getType()->getScalarType()->isPointerTy()) {
>>>> - // Because we have added a PHI-use of the pointer value, it
>>>> has
>>>> now
>>>> - // "escaped" from alias analysis' perspective. We need to
>>>> inform
>>>> - // AA of this.
>>>> - for (unsigned ii = 0, ee = Phi->getNumIncomingValues(); ii !=
>>>> ee;
>>>> - ++ii) {
>>>> - unsigned jj = PHINode::getOperandNumForIncomingValue(ii);
>>>> -
>>>> VN.getAliasAnalysis()->addEscapingUse(Phi->getOperandUse(jj));
>>>> - }
>>>> + if (MD)
>>>> + MD->invalidateCachedPointerInfo(Phi);
>>>> + }
>>>> + VN.erase(CurInst);
>>>> + removeFromLeaderTable(ValNo, CurInst, CurrentBlock);
>>>>
>>>> - if (MD)
>>>> - MD->invalidateCachedPointerInfo(Phi);
>>>> - }
>>>> - VN.erase(CurInst);
>>>> - removeFromLeaderTable(ValNo, CurInst, CurrentBlock);
>>>> + DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
>>>> + if (MD)
>>>> + MD->removeInstruction(CurInst);
>>>> + DEBUG(verifyRemoved(CurInst));
>>>> + CurInst->eraseFromParent();
>>>> + return true;
>>>> +}
>>>> +
>>>> +/// performPRE - Perform a purely local form of PRE that looks for
>>>> diamond
>>>> +/// control flow patterns and attempts to perform simple PRE at the
>>>> join point.
>>>> +bool GVN::performPRE(Function &F) {
>>>> + bool Changed = false;
>>>> + for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
>>>> + // Nothing to PRE in the entry block.
>>>> + if (CurrentBlock == &F.getEntryBlock())
>>>> + continue;
>>>>
>>>> - DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
>>>> - if (MD) MD->removeInstruction(CurInst);
>>>> - DEBUG(verifyRemoved(CurInst));
>>>> - CurInst->eraseFromParent();
>>>> - Changed = true;
>>>> + // Don't perform PRE on a landing pad.
>>>> + if (CurrentBlock->isLandingPad())
>>>> + continue;
>>>> +
>>>> + for (BasicBlock::iterator BI = CurrentBlock->begin(),
>>>> + BE = CurrentBlock->end();
>>>> + BI != BE;) {
>>>> + Instruction *CurInst = BI++;
>>>> + Changed = performScalarPRE(CurInst);
>>>> }
>>>> }
>>>>
>>>> @@ -2637,25 +2655,21 @@ bool GVN::iterateOnFunction(Function &F)
>>>>
>>>> // Top-down walk of the dominator tree
>>>> bool Changed = false;
>>>> -#if 0
>>>> - // Needed for value numbering with phi construction to work.
>>>> - ReversePostOrderTraversal<Function*> RPOT(&F);
>>>> - for (ReversePostOrderTraversal<Function*>::rpo_iterator RI =
>>>> RPOT.begin(),
>>>> - RE = RPOT.end(); RI != RE; ++RI)
>>>> - Changed |= processBlock(*RI);
>>>> -#else
>>>> // Save the blocks this function have before transformation begins.
>>>> GVN may
>>>> // split critical edge, and hence may invalidate the RPO/DT iterator.
>>>> //
>>>> std::vector<BasicBlock *> BBVect;
>>>> BBVect.reserve(256);
>>>> - for (DomTreeNode *X : depth_first(DT->getRootNode()))
>>>> - BBVect.push_back(X->getBlock());
>>>> + // Needed for value numbering with phi construction to work.
>>>> + ReversePostOrderTraversal<Function *> RPOT(&F);
>>>> + for (ReversePostOrderTraversal<Function *>::rpo_iterator RI =
>>>> RPOT.begin(),
>>>> + RE =
>>>> RPOT.end();
>>>> + RI != RE; ++RI)
>>>> + BBVect.push_back(*RI);
>>>>
>>>> for (std::vector<BasicBlock *>::iterator I = BBVect.begin(), E =
>>>> BBVect.end();
>>>> I != E; I++)
>>>> Changed |= processBlock(*I);
>>>> -#endif
>>>>
>>>> return Changed;
>>>> }
>>>>
>>>> Modified:
>>>> llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/gvn-nonlocal-type-mismatch.ll
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/gvn-nonlocal-type-mismatch.ll?rev=222039&r1=222038&r2=222039&view=diff
>>>> ==============================================================================
>>>> ---
>>>> llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/gvn-nonlocal-type-mismatch.ll
>>>> (original)
>>>> +++
>>>> llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/gvn-nonlocal-type-mismatch.ll
>>>> Fri Nov 14 15:09:13 2014
>>>> @@ -46,12 +46,12 @@ entry:
>>>> br i1 %c, label %if.else, label %if.then
>>>>
>>>> if.then:
>>>> - %t = load i32* %p, !tbaa !4
>>>> + %t = load i32* %p, !tbaa !3
>>>> store i32 %t, i32* %q
>>>> ret void
>>>>
>>>> if.else:
>>>> - %u = load i32* %p, !tbaa !3
>>>> + %u = load i32* %p, !tbaa !4
>>>> store i32 %u, i32* %q
>>>> ret void
>>>> }
>>>> @@ -61,11 +61,11 @@ if.else:
>>>>
>>>> ; CHECK: @watch_out_for_another_type_change
>>>> ; CHECK: if.then:
>>>> -; CHECK: %t = load i32* %p
>>>> -; CHECK: store i32 %t, i32* %q
>>>> +; CHECK: store i32 0, i32* %q
>>>> ; CHECK: ret void
>>>> ; CHECK: if.else:
>>>> -; CHECK: store i32 0, i32* %q
>>>> +; CHECK: %u = load i32* %p
>>>> +; CHECK: store i32 %u, i32* %q
>>>>
>>>> define void @watch_out_for_another_type_change(i1 %c, i32* %p, i32*
>>>> %p1,
>>>> i32* %q) nounwind {
>>>> entry:
>>>> @@ -74,12 +74,12 @@ entry:
>>>> br i1 %c, label %if.else, label %if.then
>>>>
>>>> if.then:
>>>> - %t = load i32* %p, !tbaa !3
>>>> + %t = load i32* %p, !tbaa !4
>>>> store i32 %t, i32* %q
>>>> ret void
>>>>
>>>> if.else:
>>>> - %u = load i32* %p, !tbaa !4
>>>> + %u = load i32* %p, !tbaa !3
>>>> store i32 %u, i32* %q
>>>> ret void
>>>> }
>>>>
>>>> Added: llvm/trunk/test/Transforms/GVN/pre-gep-load.ll
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/pre-gep-load.ll?rev=222039&view=auto
>>>> ==============================================================================
>>>> --- llvm/trunk/test/Transforms/GVN/pre-gep-load.ll (added)
>>>> +++ llvm/trunk/test/Transforms/GVN/pre-gep-load.ll Fri Nov 14 15:09:13
>>>> 2014
>>>> @@ -0,0 +1,49 @@
>>>> +; RUN: opt < %s -basicaa -gvn -enable-load-pre -S | FileCheck %s
>>>> +target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
>>>> +target triple = "aarch64--linux-gnu"
>>>> +
>>>> +define double @foo(i32 %stat, i32 %i, double** %p) {
>>>> +; CHECK-LABEL: @foo(
>>>> +entry:
>>>> + switch i32 %stat, label %sw.default [
>>>> + i32 0, label %sw.bb
>>>> + i32 1, label %sw.bb
>>>> + i32 2, label %sw.bb2
>>>> + ]
>>>> +
>>>> +sw.bb: ; preds = %entry,
>>>> %entry
>>>> + %idxprom = sext i32 %i to i64
>>>> + %arrayidx = getelementptr inbounds double** %p, i64 0
>>>> + %0 = load double** %arrayidx, align 8
>>>> + %arrayidx1 = getelementptr inbounds double* %0, i64 %idxprom
>>>> + %1 = load double* %arrayidx1, align 8
>>>> + %sub = fsub double %1, 1.000000e+00
>>>> + %cmp = fcmp olt double %sub, 0.000000e+00
>>>> + br i1 %cmp, label %if.then, label %if.end
>>>> +
>>>> +if.then: ; preds = %sw.bb
>>>> + br label %return
>>>> +
>>>> +if.end: ; preds = %sw.bb
>>>> + br label %sw.bb2
>>>> +
>>>> +sw.bb2: ; preds = %if.end,
>>>> %entry
>>>> + %idxprom3 = sext i32 %i to i64
>>>> + %arrayidx4 = getelementptr inbounds double** %p, i64 0
>>>> + %2 = load double** %arrayidx4, align 8
>>>> + %arrayidx5 = getelementptr inbounds double* %2, i64 %idxprom3
>>>> + %3 = load double* %arrayidx5, align 8
>>>> +; CHECK: sw.bb2:
>>>> +; CHECK-NEXT-NOT: sext
>>>> +; CHECK-NEXT: phi double [
>>>> +; CHECK-NOT: load
>>>> + %sub6 = fsub double 3.000000e+00, %3
>>>> + br label %return
>>>> +
>>>> +sw.default: ; preds = %entry
>>>> + br label %return
>>>> +
>>>> +return: ; preds =
>>>> %sw.default, %sw.bb2, %if.then
>>>> + %retval.0 = phi double [ 0.000000e+00, %sw.default ], [ %sub6,
>>>> %sw.bb2 ], [ %sub, %if.then ]
>>>> + ret double %retval.0
>>>> +}
>>>>
>>>>
>>>> _______________________________________________
>>>> 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