[llvm] 8293f74 - Further cleanup manipulation of widenable branches [NFC]
Kostya Serebryany via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 22 10:47:08 PST 2019
Hi Philip,
The ubsan bootstrap bot crashes in the new code:
FAILED: lib/Support/CMakeFiles/LLVMSupport.dir/Signals.cpp.o
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang++
-DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Ilib/Support
-I/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/lib/Support
-I/usr/include/libxml2 -Iinclude
-I/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/include
-fsanitize=undefined -w -fPIC -fvisibility-inlines-hidden
-Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra
-Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wmissing-field-initializers -pedantic -Wno-long-long
-Wimplicit-fallthrough -Wcovered-switch-default -Wno-class-memaccess
-Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor
-Wstring-conversion -fno-omit-frame-pointer -gline-tables-only
-fsanitize=undefined -fno-sanitize=vptr,function
-fno-sanitize-recover=all
-fsanitize-blacklist=/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/utils/sanitizers/ubsan_blacklist.txt
-fdiagnostics-color -ffunction-sections -fdata-sections -O3
-UNDEBUG -std=c++14 -fno-exceptions -fno-rtti -MD -MT
lib/Support/CMakeFiles/LLVMSupport.dir/Signals.cpp.o -MF
lib/Support/CMakeFiles/LLVMSupport.dir/Signals.cpp.o.d -o
lib/Support/CMakeFiles/LLVMSupport.dir/Signals.cpp.o -c
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/lib/Support/Signals.cpp
clang-10: /b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/include/llvm/Support/Casting.h:264:
typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X =
llvm::Instruction; Y = llvm::Value; typename llvm::cast_retty<X,
Y*>::ret_type = llvm::Instruction*]: Assertion `isa<X>(Val) &&
"cast<Ty>() argument of incompatible type!"' failed.
Stack dump:
0. Program arguments:
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10
-cc1 -triple x86_64-unknown-linux-gnu -emit-obj -disable-free
-main-file-name Signals.cpp -mrelocation-model pic -pic-level 2
-mthread-model posix -mframe-pointer=all -fmath-errno -masm-verbose
-mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu
x86-64 -dwarf-column-info -debug-info-kind=line-tables-only
-dwarf-version=4 -debugger-tuning=gdb -ffunction-sections
-fdata-sections -resource-dir
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/lib/clang/10.0.0
-dependency-file
lib/Support/CMakeFiles/LLVMSupport.dir/Signals.cpp.o.d -MT
lib/Support/CMakeFiles/LLVMSupport.dir/Signals.cpp.o -sys-header-deps
-D GTEST_HAS_RTTI=0 -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS
-D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I lib/Support -I
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/lib/Support
-I /usr/include/libxml2 -I include -I
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/include
-U NDEBUG -internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/backward
-internal-isystem /usr/local/include -internal-isystem
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/lib/clang/10.0.0/include
-internal-externc-isystem /usr/include/x86_64-linux-gnu
-internal-externc-isystem /include -internal-externc-isystem
/usr/include -O3 -Werror=date-time -Werror=unguarded-availability-new
-Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wmissing-field-initializers -Wno-long-long -Wimplicit-fallthrough
-Wcovered-switch-default -Wno-class-memaccess -Wno-noexcept-type
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion
-pedantic -w -std=c++14 -fdeprecated-macro -fdebug-compilation-dir
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build_ubsan
-ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden
-fsanitize=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,integer-divide-by-zero,nonnull-attribute,null,object-size,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound
-fsanitize-blacklist=/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/utils/sanitizers/ubsan_blacklist.txt
-fno-rtti -fgnuc-version=4.2.1 -fobjc-runtime=gcc
-fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops
-vectorize-slp -faddrsig -o
lib/Support/CMakeFiles/LLVMSupport.dir/Signals.cpp.o -x c++
/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/lib/Support/Signals.cpp
1. <eof> parser at end of file
2. Per-module optimization passes
3. Running pass 'CallGraph Pass Manager' on module
'/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm-project/llvm/lib/Support/Signals.cpp'.
4. Running pass 'Simplify the CFG' on function '@_ZL16RegisterHandlersv'
#0 0x0000555b7ea0366a llvm::sys::PrintStackTrace(llvm::raw_ostream&)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2cfc66a)
#1 0x0000555b7ea013a5 llvm::sys::RunSignalHandlers()
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2cfa3a5)
#2 0x0000555b7ea014c7 SignalHandler(int)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2cfa4c7)
#3 0x00007f62544fa0e0 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0x110e0)
#4 0x00007f62532b9fff raise (/lib/x86_64-linux-gnu/libc.so.6+0x32fff)
#5 0x00007f62532bb42a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3442a)
#6 0x00007f62532b2e67 (/lib/x86_64-linux-gnu/libc.so.6+0x2be67)
#7 0x00007f62532b2f12 (/lib/x86_64-linux-gnu/libc.so.6+0x2bf12)
#8 0x0000555b7dda0fd0 llvm::parseWidenableBranch(llvm::User*,
llvm::Use*&, llvm::Use*&, llvm::BasicBlock*&, llvm::BasicBlock*&)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2099fd0)
#9 0x0000555b7dda12a0 llvm::parseWidenableBranch(llvm::User const*,
llvm::Value*&, llvm::Value*&, llvm::BasicBlock*&, llvm::BasicBlock*&)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x209a2a0)
#10 0x0000555b7eafb640
SimplifyCondBranchToCondBranch(llvm::BranchInst*, llvm::BranchInst*,
llvm::DataLayout const&, llvm::TargetTransformInfo const&)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2df4640)
#11 0x0000555b7eb09676 llvm::simplifyCFG(llvm::BasicBlock*,
llvm::TargetTransformInfo const&, llvm::SimplifyCFGOptions const&,
llvm::SmallPtrSetImpl<llvm::BasicBlock*>*)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2e02676)
#12 0x0000555b7e946457 iterativelySimplifyCFG(llvm::Function&,
llvm::TargetTransformInfo const&, llvm::SimplifyCFGOptions const&)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2c3f457)
#13 0x0000555b7e947181 (anonymous
namespace)::CFGSimplifyPass::runOnFunction(llvm::Function&)
(/b/sanitizer-x86_64-linux-bootstrap-ubsan/build/llvm_build0/bin/clang-10+0x2c40181)
On Thu, Nov 21, 2019 at 3:07 PM Philip Reames via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
>
> Author: Philip Reames
> Date: 2019-11-21T15:07:30-08:00
> New Revision: 8293f7434577e23a07284686f5b54079e22e6a91
>
> URL:
> https://github.com/llvm/llvm-project/commit/8293f7434577e23a07284686f5b54079e22e6a91
> DIFF:
> https://github.com/llvm/llvm-project/commit/8293f7434577e23a07284686f5b54079e22e6a91.diff
>
> LOG: Further cleanup manipulation of widenable branches [NFC]
>
> This is a follow on to aaea24802bf5. In post commit discussion, Artur and
> I realized we could cleanup the code using Uses; this patch does so.
>
> Added:
>
>
> Modified:
> llvm/include/llvm/Analysis/GuardUtils.h
> llvm/lib/Analysis/GuardUtils.cpp
> llvm/lib/Transforms/Utils/GuardUtils.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff --git a/llvm/include/llvm/Analysis/GuardUtils.h
> b/llvm/include/llvm/Analysis/GuardUtils.h
> index f4492c72ce63..b83211535ec2 100644
> --- a/llvm/include/llvm/Analysis/GuardUtils.h
> +++ b/llvm/include/llvm/Analysis/GuardUtils.h
> @@ -15,6 +15,7 @@
> namespace llvm {
>
> class BasicBlock;
> +class Use;
> class User;
> class Value;
>
> @@ -43,6 +44,11 @@ bool parseWidenableBranch(const User *U, Value
> *&Condition,
> Value *&WidenableCondition, BasicBlock
> *&IfTrueBB,
> BasicBlock *&IfFalseBB);
>
> +/// Analgous to the above, but return the Uses so that that they can be
> +/// modified. Unlike previous version, Condition is optional and may be
> null.
> +bool parseWidenableBranch(User *U, Use *&Cond, Use *&WC, BasicBlock
> *&IfTrueBB,
> + BasicBlock *&IfFalseBB);
> +
> } // llvm
>
> #endif // LLVM_ANALYSIS_GUARDUTILS_H
>
> diff --git a/llvm/lib/Analysis/GuardUtils.cpp
> b/llvm/lib/Analysis/GuardUtils.cpp
> index d4a86e18997e..18141069f6a4 100644
> --- a/llvm/lib/Analysis/GuardUtils.cpp
> +++ b/llvm/lib/Analysis/GuardUtils.cpp
> @@ -44,11 +44,35 @@ bool llvm::isGuardAsWidenableBranch(const User *U) {
> bool llvm::parseWidenableBranch(const User *U, Value *&Condition,
> Value *&WidenableCondition,
> BasicBlock *&IfTrueBB, BasicBlock
> *&IfFalseBB) {
> - if (match(U,
> m_Br(m_Intrinsic<Intrinsic::experimental_widenable_condition>(),
> - IfTrueBB, IfFalseBB)) &&
> - cast<BranchInst>(U)->getCondition()->hasOneUse()) {
> - WidenableCondition = cast<BranchInst>(U)->getCondition();
> - Condition = ConstantInt::getTrue(IfTrueBB->getContext());
> +
> + Use *C, *WC;
> + if (parseWidenableBranch(const_cast<User*>(U), C, WC, IfTrueBB,
> IfFalseBB)) {
> + if (C)
> + Condition = C->get();
> + else
> + Condition = ConstantInt::getTrue(IfTrueBB->getContext());
> + WidenableCondition = WC->get();
> + return true;
> + }
> + return false;
> +}
> +
> +bool llvm::parseWidenableBranch(User *U, Use *&C,Use *&WC,
> + BasicBlock *&IfTrueBB, BasicBlock
> *&IfFalseBB) {
> +
> + auto *BI = dyn_cast<BranchInst>(U);
> + if (!BI || !BI->isConditional())
> + return false;
> + auto *Cond = BI->getCondition();
> + if (!Cond->hasOneUse())
> + return false;
> +
> + IfTrueBB = BI->getSuccessor(0);
> + IfFalseBB = BI->getSuccessor(1);
> +
> + if (match(Cond,
> m_Intrinsic<Intrinsic::experimental_widenable_condition>())) {
> + WC = &BI->getOperandUse(0);
> + C = nullptr;
> return true;
> }
>
> @@ -57,19 +81,23 @@ bool llvm::parseWidenableBranch(const User *U, Value
> *&Condition,
> // 2) br (i1 (and WC(), B)), label %IfTrue, label %IfFalse
> // We do not check for more generalized and trees as we should
> canonicalize
> // to the form above in instcombine. (TODO)
> - if (!match(U, m_Br(m_And(m_Value(Condition),
> m_Value(WidenableCondition)),
> - IfTrueBB, IfFalseBB)))
> + Value *A, *B;
> + if (!match(Cond, m_And(m_Value(A), m_Value(B))))
> return false;
> - if (!match(WidenableCondition,
> - m_Intrinsic<Intrinsic::experimental_widenable_condition>()))
> {
> - if (!match(Condition,
> -
> m_Intrinsic<Intrinsic::experimental_widenable_condition>()))
> - return false;
> - std::swap(Condition, WidenableCondition);
> + auto *And = cast<Instruction>(Cond);
> +
> + if (match(A,
> m_Intrinsic<Intrinsic::experimental_widenable_condition>()) &&
> + A->hasOneUse()) {
> + WC = &And->getOperandUse(0);
> + C = &And->getOperandUse(1);
> + return true;
> }
> -
> - // For the branch to be (easily) widenable, it must not correlate with
> other
> - // branches. Thus, the widenable condition must have a single use.
> - return (WidenableCondition->hasOneUse() &&
> - cast<BranchInst>(U)->getCondition()->hasOneUse());
> +
> + if (match(B,
> m_Intrinsic<Intrinsic::experimental_widenable_condition>()) &&
> + B->hasOneUse()) {
> + WC = &And->getOperandUse(1);
> + C = &And->getOperandUse(0);
> + return true;
> + }
> + return false;
> }
>
> diff --git a/llvm/lib/Transforms/Utils/GuardUtils.cpp
> b/llvm/lib/Transforms/Utils/GuardUtils.cpp
> index 241bfbf80bdf..4cfc9358499a 100644
> --- a/llvm/lib/Transforms/Utils/GuardUtils.cpp
> +++ b/llvm/lib/Transforms/Utils/GuardUtils.cpp
> @@ -87,23 +87,20 @@ void llvm::widenWidenableBranch(BranchInst
> *WidenableBR, Value *NewCond) {
> // condition, but that doesn't match the pattern parseWidenableBranch
> expects
> // so we have to be more sophisticated.
>
> - if (match(WidenableBR->getCondition(),
> - m_Intrinsic<Intrinsic::experimental_widenable_condition>())) {
> + Use *C, *WC;
> + BasicBlock *IfTrueBB, *IfFalseBB;
> + parseWidenableBranch(WidenableBR, C, WC, IfTrueBB, IfFalseBB);
> + if (!C) {
> + // br (wc()), ... form
> IRBuilder<> B(WidenableBR);
> - WidenableBR->setCondition(B.CreateAnd(NewCond,
> - WidenableBR->getCondition()));
> + WidenableBR->setCondition(B.CreateAnd(NewCond, WC->get()));
> } else {
> + // br (wc & C), ... form
> + IRBuilder<> B(WidenableBR);
> + C->set(B.CreateAnd(NewCond, C->get()));
> Instruction *WCAnd = cast<Instruction>(WidenableBR->getCondition());
> // Condition is only guaranteed to dominate branch
> - WCAnd->moveBefore(WidenableBR);
> - IRBuilder<> B(WCAnd);
> - const bool Op0IsWC =
> - match(WCAnd->getOperand(0),
> - m_Intrinsic<Intrinsic::experimental_widenable_condition>());
> - const unsigned CondOpIdx = Op0IsWC ? 1 : 0;
> - Value *OldCond = WCAnd->getOperand(CondOpIdx);
> - NewCond = B.CreateAnd(NewCond, OldCond);
> - WCAnd->setOperand(CondOpIdx, NewCond);
> + WCAnd->moveBefore(WidenableBR);
> }
> assert(isWidenableBranch(WidenableBR) && "preserve widenabiliy");
> }
> @@ -111,20 +108,19 @@ void llvm::widenWidenableBranch(BranchInst
> *WidenableBR, Value *NewCond) {
> void llvm::setWidenableBranchCond(BranchInst *WidenableBR, Value
> *NewCond) {
> assert(isWidenableBranch(WidenableBR) && "precondition");
>
> - if (match(WidenableBR->getCondition(),
> - m_Intrinsic<Intrinsic::experimental_widenable_condition>())) {
> + Use *C, *WC;
> + BasicBlock *IfTrueBB, *IfFalseBB;
> + parseWidenableBranch(WidenableBR, C, WC, IfTrueBB, IfFalseBB);
> + if (!C) {
> + // br (wc()), ... form
> IRBuilder<> B(WidenableBR);
> - WidenableBR->setCondition(B.CreateAnd(NewCond,
> - WidenableBR->getCondition()));
> + WidenableBR->setCondition(B.CreateAnd(NewCond, WC->get()));
> } else {
> + // br (wc & C), ... form
> Instruction *WCAnd = cast<Instruction>(WidenableBR->getCondition());
> // Condition is only guaranteed to dominate branch
> WCAnd->moveBefore(WidenableBR);
> - const bool Op0IsWC =
> - match(WCAnd->getOperand(0),
> - m_Intrinsic<Intrinsic::experimental_widenable_condition>());
> - const unsigned CondOpIdx = Op0IsWC ? 1 : 0;
> - WCAnd->setOperand(CondOpIdx, NewCond);
> + C->set(NewCond);
> }
> assert(isWidenableBranch(WidenableBR) && "preserve widenabiliy");
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191122/9a8532f2/attachment.html>
More information about the llvm-commits
mailing list