[llvm] r273608 - InstCombine rule to fold trunc when value available

Mike Aizatsky via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 24 11:47:11 PDT 2016


Anna,

It looks like this change breaks the build:

(first build with problem)

http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/24502

[100/338] Building Intrinsics.gen...
FAILED:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/clang++
  -DGTEST_HAS_RTTI=0 -D_DEBUG -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Ilib/Support
-I/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support
-Iinclude
-I/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/include
--target=i686-linux-android
--sysroot=/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot
-B/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86
-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
-Wdelete-non-virtual-dtor -Werror=date-time -std=c++11 -fcolor-diagnostics
-ffunction-sections -fdata-sections -O3    -UNDEBUG  -fno-exceptions
-fno-rtti -MMD -MT lib/Support/CMakeFiles/LLVMSupport.dir/Triple.cpp.o -MF
lib/Support/CMakeFiles/LLVMSupport.dir/Triple.cpp.o.d -o
lib/Support/CMakeFiles/LLVMSupport.dir/Triple.cpp.o -c
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Triple.cpp
clang-3.9:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/Value.cpp:375:
void llvm::Value::replaceAllUsesWith(llvm::Value *): Assertion
`New->getType() == getType() && "replaceAllUses of value with new value of
different type!"' failed.
#0 0x00000000018969e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Unix/Signals.inc:402:13
#1 0x0000000001894ba6 operator!=<std::pair<void (*)(void *), void *> *,
std::vector<std::pair<void (*)(void *), void *>,
std::allocator<std::pair<void (*)(void *), void *> > > >
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_iterator.h:825:27
#2 0x0000000001894ba6 llvm::sys::RunSignalHandlers()
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Signals.cpp:44:0
#3 0x00000000018970be SignalHandler(int)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Unix/Signals.inc:256:1
#4 0x00007fc3c40a60a0 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0xf0a0)
#5 0x00007fc3c3196165 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x32165)
#6 0x00007fc3c31993e0 abort (/lib/x86_64-linux-gnu/libc.so.6+0x353e0)
#7 0x00007fc3c318f311 __assert_fail
(/lib/x86_64-linux-gnu/libc.so.6+0x2b311)
#8 0x000000000151f76d cast<llvm::BasicBlock, llvm::Value>
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/include/llvm/Support/Casting.h:237:3
#9 0x000000000151f76d llvm::Value::replaceAllUsesWith(llvm::Value*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/Value.cpp:398:0
#10 0x000000000159bc7c
llvm::InstCombiner::replaceInstUsesWith(llvm::Instruction&, llvm::Value*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstCombineInternal.h:442:7
#11 0x00000000015db186 llvm::InstCombiner::visitTrunc(llvm::TruncInst&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp:513:12
#12 0x00000000015a697b llvm::InstCombiner::run()
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:2872:31
#13 0x00000000015a8370 combineInstructionsOverFunction(llvm::Function&,
llvm::InstCombineWorklist&, llvm::AAResults*, llvm::AssumptionCache&,
llvm::TargetLibraryInfo&, llvm::DominatorTree&, bool, llvm::LoopInfo*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:3100:19
#14 0x00000000015a89ea
llvm::InstructionCombiningPass::runOnFunction(llvm::Function&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:3156:10
#15 0x00000000014e8c1f llvm::FPPassManager::runOnFunction(llvm::Function&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/LegacyPassManager.cpp:1526:27
#16 0x000000000218c6e7 RunPassOnSCC
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Analysis/CallGraphSCCPass.cpp:151:25
#17 0x000000000218c6e7 RunAllPassesOnSCC
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Analysis/CallGraphSCCPass.cpp:419:0
#18 0x000000000218c6e7 (anonymous
namespace)::CGPassManager::runOnModule(llvm::Module&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Analysis/CallGraphSCCPass.cpp:475:0
#19 0x00000000014e9355 runOnModule
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/LegacyPassManager.cpp:1603:27
#20 0x00000000014e9355 llvm::legacy::PassManagerImpl::run(llvm::Module&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/LegacyPassManager.cpp:1706:0
#21 0x00000000019e6967 EmitAssembly
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:763:3
#22 0x00000000019e6967 clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::CodeGenOptions const&, clang::TargetOptions const&,
clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*,
clang::BackendAction, llvm::raw_pwrite_stream*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:779:0
#23 0x0000000002075473
clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:178:7
#24 0x000000000241d606 swap<bool>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:177:11
#25 0x000000000241d606 clang::ParseAST(clang::Sema&, bool, bool)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:169:0
#26 0x0000000001d6d8f5 clang::FrontendAction::Execute()
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:461:10
#27 0x0000000001d37951
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:877:11
#28 0x0000000001dfb24f
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:241:25
#29 0x000000000079f398 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/tools/driver/cc1_main.cpp:116:13
#30 0x000000000079d833 ExecuteCC1Tool
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/tools/driver/driver.cpp:301:12
#31 0x000000000079d833 main
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/tools/driver/driver.cpp:382:0
#32 0x00007fc3c3182ead __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x1eead)
#33 0x000000000079ae15 _start
(/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/clang-3.9+0x79ae15)
Stack dump:
0. Program arguments:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/clang-3.9
-cc1 -triple i686--linux-android -emit-obj -disable-free -main-file-name
Triple.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix
-fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array
-target-cpu i686 -target-feature +ssse3 -momit-leaf-frame-pointer
-dwarf-column-info -debugger-tuning=gdb -ffunction-sections -fdata-sections
-coverage-file
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build_android_x86/lib/Support/CMakeFiles/LLVMSupport.dir/Triple.cpp.o
-resource-dir
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/../lib/clang/3.9.0
-dependency-file lib/Support/CMakeFiles/LLVMSupport.dir/Triple.cpp.o.d -MT
lib/Support/CMakeFiles/LLVMSupport.dir/Triple.cpp.o -D GTEST_HAS_RTTI=0 -D
_DEBUG -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D
__STDC_LIMIT_MACROS -I lib/Support -I
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support -I
include -I
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/include -U
NDEBUG -isysroot
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/lib/gcc/i686-linux-android/4.8/../../../../include/c++/4.8
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/lib/gcc/i686-linux-android/4.8/../../../../include/c++/4.8/i686-linux-android
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/lib/gcc/i686-linux-android/4.8/../../../../include/c++/4.8/backward
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot/usr/local/include
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/../lib/clang/3.9.0/include
-internal-externc-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot/include
-internal-externc-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot/usr/include
-O3 -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wmissing-field-initializers -Wno-long-long -Wcovered-switch-default
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Werror=date-time -pedantic
-std=c++11 -fdeprecated-macro -fdebug-compilation-dir
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build_android_x86
-ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden
-femulated-tls -fno-rtti -fobjc-runtime=gcc -fdiagnostics-show-option
-fcolor-diagnostics -vectorize-loops -vectorize-slp -o
lib/Support/CMakeFiles/LLVMSupport.dir/Triple.cpp.o -x c++
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Triple.cpp
1. <eof> parser at end of file
2. Per-module optimization passes
3. Running pass 'CallGraph Pass Manager' on module
'/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Triple.cpp'.
4. Running pass 'Combine redundant instructions' on function
'@_ZN4llvm6Triple22getArchTypeForLLVMNameENS_9StringRefE'
clang-3.9: error: unable to execute command: Aborted
clang-3.9: error: clang frontend command failed due to signal (use -v to
see invocation)
clang version 3.9.0 (trunk 273608)
Target: i686--linux-android
Thread model: posix
InstalledDir:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin
clang-3.9: 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.9: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-3.9: note: diagnostic msg: /tmp/Triple-241584.cpp
clang-3.9: note: diagnostic msg: /tmp/Triple-241584.sh
clang-3.9: note: diagnostic msg:

********************
FAILED:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/clang++
  -DGTEST_HAS_RTTI=0 -D_DEBUG -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Ilib/Support
-I/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support
-Iinclude
-I/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/include
--target=i686-linux-android
--sysroot=/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot
-B/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86
-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
-Wdelete-non-virtual-dtor -Werror=date-time -std=c++11 -fcolor-diagnostics
-ffunction-sections -fdata-sections -O3    -UNDEBUG  -fno-exceptions
-fno-rtti -MMD -MT lib/Support/CMakeFiles/LLVMSupport.dir/YAMLTraits.cpp.o
-MF lib/Support/CMakeFiles/LLVMSupport.dir/YAMLTraits.cpp.o.d -o
lib/Support/CMakeFiles/LLVMSupport.dir/YAMLTraits.cpp.o -c
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/YAMLTraits.cpp
clang-3.9:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/Value.cpp:375:
void llvm::Value::replaceAllUsesWith(llvm::Value *): Assertion
`New->getType() == getType() && "replaceAllUses of value with new value of
different type!"' failed.
#0 0x00000000018969e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Unix/Signals.inc:402:13
#1 0x0000000001894ba6 operator!=<std::pair<void (*)(void *), void *> *,
std::vector<std::pair<void (*)(void *), void *>,
std::allocator<std::pair<void (*)(void *), void *> > > >
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_iterator.h:825:27
#2 0x0000000001894ba6 llvm::sys::RunSignalHandlers()
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Signals.cpp:44:0
#3 0x00000000018970be SignalHandler(int)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/Unix/Signals.inc:256:1
#4 0x00007f64cd0910a0 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0xf0a0)
#5 0x00007f64cc181165 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x32165)
#6 0x00007f64cc1843e0 abort (/lib/x86_64-linux-gnu/libc.so.6+0x353e0)
#7 0x00007f64cc17a311 __assert_fail
(/lib/x86_64-linux-gnu/libc.so.6+0x2b311)
#8 0x000000000151f76d cast<llvm::BasicBlock, llvm::Value>
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/include/llvm/Support/Casting.h:237:3
#9 0x000000000151f76d llvm::Value::replaceAllUsesWith(llvm::Value*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/Value.cpp:398:0
#10 0x000000000159bc7c
llvm::InstCombiner::replaceInstUsesWith(llvm::Instruction&, llvm::Value*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstCombineInternal.h:442:7
#11 0x00000000015db186 llvm::InstCombiner::visitTrunc(llvm::TruncInst&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp:513:12
#12 0x00000000015a697b llvm::InstCombiner::run()
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:2872:31
#13 0x00000000015a8370 combineInstructionsOverFunction(llvm::Function&,
llvm::InstCombineWorklist&, llvm::AAResults*, llvm::AssumptionCache&,
llvm::TargetLibraryInfo&, llvm::DominatorTree&, bool, llvm::LoopInfo*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:3100:19
#14 0x00000000015a89ea
llvm::InstructionCombiningPass::runOnFunction(llvm::Function&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:3156:10
#15 0x00000000014e8c1f llvm::FPPassManager::runOnFunction(llvm::Function&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/LegacyPassManager.cpp:1526:27
#16 0x000000000218c6e7 RunPassOnSCC
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Analysis/CallGraphSCCPass.cpp:151:25
#17 0x000000000218c6e7 RunAllPassesOnSCC
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Analysis/CallGraphSCCPass.cpp:419:0
#18 0x000000000218c6e7 (anonymous
namespace)::CGPassManager::runOnModule(llvm::Module&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Analysis/CallGraphSCCPass.cpp:475:0
#19 0x00000000014e9355 runOnModule
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/LegacyPassManager.cpp:1603:27
#20 0x00000000014e9355 llvm::legacy::PassManagerImpl::run(llvm::Module&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/IR/LegacyPassManager.cpp:1706:0
#21 0x00000000019e6967 EmitAssembly
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:763:3
#22 0x00000000019e6967 clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::CodeGenOptions const&, clang::TargetOptions const&,
clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*,
clang::BackendAction, llvm::raw_pwrite_stream*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:779:0
#23 0x0000000002075473
clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:178:7
#24 0x000000000241d606 swap<bool>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:177:11
#25 0x000000000241d606 clang::ParseAST(clang::Sema&, bool, bool)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:169:0
#26 0x0000000001d6d8f5 clang::FrontendAction::Execute()
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:461:10
#27 0x0000000001d37951
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:877:11
#28 0x0000000001dfb24f
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:241:25
#29 0x000000000079f398 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*)
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/tools/driver/cc1_main.cpp:116:13
#30 0x000000000079d833 ExecuteCC1Tool
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/tools/driver/driver.cpp:301:12
#31 0x000000000079d833 main
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/tools/clang/tools/driver/driver.cpp:382:0
#32 0x00007f64cc16dead __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x1eead)
#33 0x000000000079ae15 _start
(/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/clang-3.9+0x79ae15)
Stack dump:
0. Program arguments:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/clang-3.9
-cc1 -triple i686--linux-android -emit-obj -disable-free -main-file-name
YAMLTraits.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix
-fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array
-target-cpu i686 -target-feature +ssse3 -momit-leaf-frame-pointer
-dwarf-column-info -debugger-tuning=gdb -ffunction-sections -fdata-sections
-coverage-file
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build_android_x86/lib/Support/CMakeFiles/LLVMSupport.dir/YAMLTraits.cpp.o
-resource-dir
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/../lib/clang/3.9.0
-dependency-file lib/Support/CMakeFiles/LLVMSupport.dir/YAMLTraits.cpp.o.d
-MT lib/Support/CMakeFiles/LLVMSupport.dir/YAMLTraits.cpp.o -D
GTEST_HAS_RTTI=0 -D _DEBUG -D __STDC_CONSTANT_MACROS -D
__STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I lib/Support -I
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support -I
include -I
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/include -U
NDEBUG -isysroot
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/lib/gcc/i686-linux-android/4.8/../../../../include/c++/4.8
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/lib/gcc/i686-linux-android/4.8/../../../../include/c++/4.8/i686-linux-android
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/lib/gcc/i686-linux-android/4.8/../../../../include/c++/4.8/backward
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot/usr/local/include
-internal-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin/../lib/clang/3.9.0/include
-internal-externc-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot/include
-internal-externc-isystem
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/../../../android-ndk/standalone-x86/sysroot/usr/include
-O3 -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wmissing-field-initializers -Wno-long-long -Wcovered-switch-default
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Werror=date-time -pedantic
-std=c++11 -fdeprecated-macro -fdebug-compilation-dir
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build_android_x86
-ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden
-femulated-tls -fno-rtti -fobjc-runtime=gcc -fdiagnostics-show-option
-fcolor-diagnostics -vectorize-loops -vectorize-slp -o
lib/Support/CMakeFiles/LLVMSupport.dir/YAMLTraits.cpp.o -x c++
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/YAMLTraits.cpp
1. <eof> parser at end of file
2. Per-module optimization passes
3. Running pass 'CallGraph Pass Manager' on module
'/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Support/YAMLTraits.cpp'.
4. Running pass 'Combine redundant instructions' on function
'@_ZSt4fillSt13_Bit_iteratorS_RKb'
clang-3.9: error: unable to execute command: Aborted
clang-3.9: error: clang frontend command failed due to signal (use -v to
see invocation)
clang version 3.9.0 (trunk 273608)
Target: i686--linux-android
Thread model: posix
InstalledDir:
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/bin
clang-3.9: 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.9: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-3.9: note: diagnostic msg: /tmp/YAMLTraits-b688c4.cpp
clang-3.9: note: diagnostic msg: /tmp/YAMLTraits-b688c4.sh
clang-3.9: note: diagnostic msg:

********************
ninja: build stopped: subcommand failed.
@@@STEP_FAILURE@@@
+ echo @@@STEP_FAILURE@@@
+ cd ..
+ echo @@@BUILD_STEP build compiler-rt android/aarch64@@@



On Thu, Jun 23, 2016 at 1:29 PM Anna Thomas via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: annat
> Date: Thu Jun 23 15:22:22 2016
> New Revision: 273608
>
> URL: http://llvm.org/viewvc/llvm-project?rev=273608&view=rev
> Log:
> InstCombine rule to fold trunc when value available
>
> Summary:
> This instcombine rule folds away trunc operations that have value
> available from a prior load or store.
> This kind of code can be generated as a result of GVN widening the load or
> from source code as well.
>
> Reviewers: reames, majnemer, sanjoy
>
> Subscribers: llvm-commits
>
> Differential Revision: http://reviews.llvm.org/D21246
>
> Modified:
>     llvm/trunk/include/llvm/Analysis/Loads.h
>     llvm/trunk/lib/Analysis/Loads.cpp
>     llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
>     llvm/trunk/test/Transforms/InstCombine/trunc.ll
>
> Modified: llvm/trunk/include/llvm/Analysis/Loads.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/Loads.h?rev=273608&r1=273607&r2=273608&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/Loads.h (original)
> +++ llvm/trunk/include/llvm/Analysis/Loads.h Thu Jun 23 15:22:22 2016
> @@ -61,6 +61,38 @@ bool isSafeToLoadUnconditionally(Value *
>  /// to scan in the block, used by FindAvailableLoadedValue().
>  extern cl::opt<unsigned> DefMaxInstsToScan;
>
> +/// Scan the ScanBB block backwards checking to see if we have the value
> at
> +/// the memory address \p Ptr of type \p AccessTy locally available
> within a
> +/// small number of instructions. If the value is available, return it.
> +///
> +/// If not, return the iterator for the last validated instruction that
> the
> +/// value would be live through.  If we scanned the entire block and
> didn't
> +/// find something that invalidates *Ptr or provides it, ScanFrom would be
> +/// left at begin() and this returns null.  ScanFrom could also be left
> +///
> +/// MaxInstsToScan specifies the maximum instructions to scan in the
> block.
> +/// If it is set to 0, it will scan the whole block. You can also
> optionally
> +/// specify an alias analysis implementation, which makes this more
> precise.
> +///
> +/// If AATags is non-null and a load or store is found, the AA tags from
> the
> +/// load or store are recorded there.  If there are no AA tags or if no
> access
> +/// is found, it is left unmodified.
> +///
> +/// IsAtomicMemOp specifies the atomicity of the memory operation that
> accesses
> +/// \p *Ptr. We verify atomicity constraints are satisfied when value
> forwarding
> +/// from another memory operation that has value \p *Ptr available.
> +///
> +/// Note that we assume the \p *Ptr is accessed through a non-volatile but
> +/// potentially atomic load. Any other constraints should be verified at
> the
> +/// caller.
> +Value *FindAvailableLoadedValue(Value *Ptr, Type *AccessTy, bool
> IsAtomicMemOp,
> +                                BasicBlock *ScanBB,
> +                                BasicBlock::iterator &ScanFrom,
> +                                unsigned MaxInstsToScan,
> +                                AliasAnalysis *AA = nullptr,
> +                                AAMDNodes *AATags = nullptr,
> +                                bool *IsLoadCSE = nullptr);
> +
>  /// FindAvailableLoadedValue - Scan the ScanBB block backwards (starting
> at
>  /// the instruction before ScanFrom) checking to see if we have the value
> at
>  /// the memory address *Ptr locally available within a small number of
>
> Modified: llvm/trunk/lib/Analysis/Loads.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Loads.cpp?rev=273608&r1=273607&r2=273608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/Loads.cpp (original)
> +++ llvm/trunk/lib/Analysis/Loads.cpp Thu Jun 23 15:22:22 2016
> @@ -300,8 +300,9 @@ llvm::DefMaxInstsToScan("available-load-
>             "to scan backward from a given instruction, when searching for
> "
>             "available loaded value"));
>
> -/// \brief Scan the ScanBB block backwards to see if we have the value at
> the
> -/// memory address *Ptr locally available within a small number of
> instructions.
> +/// Scan the ScanBB block backwards checking to see if we have the value
> at
> +/// the memory address \p Ptr of type \p AccessTy locally available
> within a
> +/// small number of instructions. If the value is available, return it.
>  ///
>  /// The scan starts from \c ScanFrom. \c MaxInstsToScan specifies the
> maximum
>  /// instructions to scan in the block. If it is set to \c 0, it will scan
> the whole
> @@ -318,26 +319,25 @@ llvm::DefMaxInstsToScan("available-load-
>  ///
>  /// If \c AATags is non-null and a load or store is found, the AA tags
> from the
>  /// load or store are recorded there. If there are no AA tags or if no
> access is
> -/// found, it is left unmodified.
> -Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB,
> +/// is found, it is left unmodified.
> +///
> +/// IsAtomicMemOp specifies the atomicity of the memory operation that
> accesses
> +/// \p *Ptr. We verify atomicity constraints are satisfied when value
> forwarding
> +/// from another memory operation that has value \p *Ptr available.
> +///
> +/// Note that we assume the \p *Ptr is accessed through a non-volatile but
> +/// potentially atomic load. Any other constraints should be verified at
> the
> +/// caller.
> +Value *llvm::FindAvailableLoadedValue(Value *Ptr, Type *AccessTy, bool
> IsAtomicMemOp,
> +                                      BasicBlock *ScanBB,
>                                        BasicBlock::iterator &ScanFrom,
>                                        unsigned MaxInstsToScan,
>                                        AliasAnalysis *AA, AAMDNodes
> *AATags,
>                                        bool *IsLoadCSE) {
> +
>    if (MaxInstsToScan == 0)
>      MaxInstsToScan = ~0U;
>
> -  Value *Ptr = Load->getPointerOperand();
> -  Type *AccessTy = Load->getType();
> -
> -  // We can never remove a volatile load
> -  if (Load->isVolatile())
> -    return nullptr;
> -
> -  // Anything stronger than unordered is currently unimplemented.
> -  if (!Load->isUnordered())
> -    return nullptr;
> -
>    const DataLayout &DL = ScanBB->getModule()->getDataLayout();
>
>    // Try to get the store size for the type.
> @@ -363,14 +363,14 @@ Value *llvm::FindAvailableLoadedValue(Lo
>      // If this is a load of Ptr, the loaded value is available.
>      // (This is true even if the load is volatile or atomic, although
>      // those cases are unlikely.)
> -    if (LoadInst *LI = dyn_cast<LoadInst>(Inst))
> -      if (AreEquivalentAddressValues(
> -              LI->getPointerOperand()->stripPointerCasts(), StrippedPtr)
> &&
> +    if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
> +      Value *LoadPtr = LI->getPointerOperand()->stripPointerCasts();
> +      if (AreEquivalentAddressValues(LoadPtr, StrippedPtr) &&
>            CastInst::isBitOrNoopPointerCastable(LI->getType(), AccessTy,
> DL)) {
>
>          // We can value forward from an atomic to a non-atomic, but not
> the
>          // other way around.
> -        if (LI->isAtomic() < Load->isAtomic())
> +        if (LI->isAtomic() < IsAtomicMemOp)
>            return nullptr;
>
>          if (AATags)
> @@ -380,6 +380,8 @@ Value *llvm::FindAvailableLoadedValue(Lo
>          return LI;
>        }
>
> +    }
> +
>      if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
>        Value *StorePtr = SI->getPointerOperand()->stripPointerCasts();
>        // If this is a store through Ptr, the value is available!
> @@ -391,7 +393,7 @@ Value *llvm::FindAvailableLoadedValue(Lo
>
>          // We can value forward from an atomic to a non-atomic, but not
> the
>          // other way around.
> -        if (SI->isAtomic() < Load->isAtomic())
> +        if (SI->isAtomic() < IsAtomicMemOp)
>            return nullptr;
>
>          if (AATags)
> @@ -434,4 +436,44 @@ Value *llvm::FindAvailableLoadedValue(Lo
>    // Got to the start of the block, we didn't find it, but are done for
> this
>    // block.
>    return nullptr;
> +
> +}
> +
> +/// \brief Scan the ScanBB block backwards to see if we have the value at
> the
> +/// memory address *Ptr locally available within a small number of
> instructions.
> +///
> +/// The scan starts from \c ScanFrom. \c MaxInstsToScan specifies the
> maximum
> +/// instructions to scan in the block. If it is set to \c 0, it will scan
> the whole
> +/// block.
> +///
> +/// If the value is available, this function returns it. If not, it
> returns the
> +/// iterator for the last validated instruction that the value would be
> live
> +/// through. If we scanned the entire block and didn't find something that
> +/// invalidates \c *Ptr or provides it, \c ScanFrom is left at the last
> +/// instruction processed and this returns null.
> +///
> +/// You can also optionally specify an alias analysis implementation,
> which
> +/// makes this more precise.
> +///
> +/// If \c AATags is non-null and a load or store is found, the AA tags
> from the
> +/// load or store are recorded there. If there are no AA tags or if no
> access is
> +/// is found, it is left unmodified.
> +Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB,
> +                                      BasicBlock::iterator &ScanFrom,
> +                                      unsigned MaxInstsToScan,
> +                                      AliasAnalysis *AA, AAMDNodes
> *AATags,
> +                                      bool *IsLoadCSE) {
> +
> +  // We can never remove a volatile load
> +  if (Load->isVolatile())
> +    return nullptr;
> +
> +  // Anything stronger than unordered is currently unimplemented.
> +  if (!Load->isUnordered())
> +    return nullptr;
> +
> +  // Return the full value of the load if available.
> +  return FindAvailableLoadedValue(Load->getPointerOperand(),
> Load->getType(),
> +                                  Load->isAtomic(), ScanBB, ScanFrom,
> +                                  MaxInstsToScan, AA, AATags, IsLoadCSE);
>  }
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=273608&r1=273607&r2=273608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Thu Jun 23
> 15:22:22 2016
> @@ -14,9 +14,10 @@
>  #include "InstCombineInternal.h"
>  #include "llvm/ADT/SetVector.h"
>  #include "llvm/Analysis/ConstantFolding.h"
> +#include "llvm/Analysis/Loads.h"
> +#include "llvm/Analysis/TargetLibraryInfo.h"
>  #include "llvm/IR/DataLayout.h"
>  #include "llvm/IR/PatternMatch.h"
> -#include "llvm/Analysis/TargetLibraryInfo.h"
>  using namespace llvm;
>  using namespace PatternMatch;
>
> @@ -576,6 +577,24 @@ Instruction *InstCombiner::visitTrunc(Tr
>    if (Instruction *I = foldVecTruncToExtElt(CI, *this, DL))
>      return I;
>
> +  // When trunc operand is a widened load, see if we can get the value
> from a
> +  // previous store/load
> +  if (auto *LI = dyn_cast<LoadInst>(Src)) {
> +    BasicBlock::iterator BBI(*LI);
> +
> +    // Scan a few instructions up from LI and if we find a partial
> load/store
> +    // of Type DestTy that feeds into LI, we can replace all uses of the
> trunc
> +    // with the load/store value.
> +    // This replacement can be done only in the case of non-volatile
> loads. If
> +    // the load is atomic, its only use should be the trunc instruction.
> We
> +    // don't want to allow other users of LI to see a value that is out
> of sync
> +    // with the value we're folding the trunc to (in case of a race).
> +    if (!LI->isVolatile() && (!LI->isAtomic() || LI->hasOneUse()))
> +      if (Value *AvailableVal = FindAvailableLoadedValue(
> +              LI->getPointerOperand(), DestTy, LI->isAtomic(),
> LI->getParent(),
> +              BBI, DefMaxInstsToScan))
> +        return replaceInstUsesWith(CI, AvailableVal);
> +  }
>    return nullptr;
>  }
>
>
> Modified: llvm/trunk/test/Transforms/InstCombine/trunc.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/trunc.ll?rev=273608&r1=273607&r2=273608&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/trunc.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/trunc.ll Thu Jun 23 15:22:22
> 2016
> @@ -181,3 +181,60 @@ bb1:
>  bb2:
>    unreachable
>  }
> +
> +declare void @consume(i8) readonly
> +define i1 @trunc_load_store(i8* align 2 %a) {
> +  store i8 0, i8 *%a, align 2
> +  %bca  = bitcast i8* %a to i16*
> +  %wide.load = load i16, i16* %bca, align 2
> +  %lowhalf.1 = trunc i16 %wide.load to i8
> +  call void @consume(i8 %lowhalf.1)
> +  %cmp.2 = icmp ult i16 %wide.load, 256
> +  ret i1 %cmp.2
> +; CHECK-LABEL: @trunc_load_store
> +; CHECK-NOT: trunc
> +; CHECK: call void @consume(i8 0)
> +}
> +
> +
> +; The trunc can be replaced with the load value.
> +define i1 @trunc_load_load(i8* align 2 %a) {
> +  %pload = load i8, i8* %a, align 2
> +  %bca  = bitcast i8* %a to i16*
> +  %wide.load = load i16, i16* %bca, align 2
> +  %lowhalf = trunc i16 %wide.load to i8
> +  call void @consume(i8 %lowhalf)
> +  call void @consume(i8 %pload)
> +  %cmp.2 = icmp ult i16 %wide.load, 256
> +  ret i1 %cmp.2
> +; CHECK-LABEL: @trunc_load_load
> +; CHECK-NOT: trunc
> +}
> +
> +; trunc should not be replaced since atomic load %wide.load has more than
> one use.
> +; different values can be seen by the uses of %wide.load in case of race.
> +define i1 @trunc_atomic_loads(i8* align 2 %a) {
> +  %pload = load atomic i8, i8* %a unordered, align 2
> +  %bca  = bitcast i8* %a to i16*
> +  %wide.load = load atomic i16, i16* %bca unordered, align 2
> +  %lowhalf = trunc i16 %wide.load to i8
> +  call void @consume(i8 %lowhalf)
> +  call void @consume(i8 %pload)
> +  %cmp.2 = icmp ult i16 %wide.load, 256
> +  ret i1 %cmp.2
> +; CHECK-LABEL: @trunc_atomic_loads
> +; CHECK: trunc
> +}
> +
> +; trunc cannot be replaced since store size is not trunc result size
> +define i1 @trunc_different_size_load(i16 * align 2 %a) {
> +  store i16 0, i16 *%a, align 2
> +  %bca  = bitcast i16* %a to i32*
> +  %wide.load = load i32, i32* %bca, align 2
> +  %lowhalf = trunc i32 %wide.load to i8
> +  call void @consume(i8 %lowhalf)
> +  %cmp.2 = icmp ult i32 %wide.load, 256
> +  ret i1 %cmp.2
> +; CHECK-LABEL: @trunc_different_size_load
> +; CHECK: %lowhalf = trunc i32 %wide.load to i8
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-- 
Mike
Sent from phone
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160624/a258f095/attachment-0001.html>


More information about the llvm-commits mailing list