[llvm] r298711 - [InstCombine] Provide a way to calculate KnownZero/One for Add/Sub in SimplifyDemandedUseBits without recursing into ComputeKnownBits
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 24 15:28:24 PDT 2017
Thanks for revert.
Not sure, but this may be related as well
http://lab.llvm.org:8011/builders/sanitizer-ppc64le-linux/builds/1847/steps/bootstrap%20clang/logs/stdio
[100%] Cleaning compiler-rt...
[100%] Building CXX object
tools/llvm-objdump/CMakeFiles/llvm-objdump.dir/COFFDump.cpp.o
[100%] Linking CXX executable ../../bin/sancov
[100%] Performing build step for 'compiler-rt'
Scanning dependencies of target RTSanitizerCommonLibc.powerpc64le
[ 1%] Building CXX object
lib/sanitizer_common/CMakeFiles/RTSanitizerCommonLibc.powerpc64le.dir/sanitizer_common_libcdep.cc.o
#0 0x0000000011bd5410 PrintStackTrace
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/lib/Support/Unix/Signals.inc:402:13
#1 0x0000000011bd5410 PrintStackTraceSignalHandler(void*)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/lib/Support/Unix/Signals.inc:465:0
#2 0x0000000011bd5864 RunSignalHandlers
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/lib/Support/Signals.cpp:45:5
#3 0x0000000011bd5864 SignalHandler(int)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/lib/Support/Unix/Signals.inc:246:0
#4 0x00003fff8e2c0478 0x478 getPointer
#5 0x00003fff8e2c0478
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/include/llvm/ADT/PointerIntPair.h:56:58
getPrefix
#6 0x00003fff8e2c0478
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h:162:0
getPrefix
#7 0x00003fff8e2c0478
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h:314:0
clang::NestedNameSpecifierLoc::getSourceRange() const
#8 0x00003fff8e2c0478
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/AST/NestedNameSpecifier.cpp:400:0
#9 0x00003fff8e2c0478 getBeginLoc
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/include/clang/AST/NestedNameSpecifier.h:283:12
#10 0x00003fff8e2c0478 clang::MemberExpr::getLocStart() const
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/AST/Expr.cpp:1500:0
#11 0x0000000013ac4ba0 getSourceRangeImpl<clang::MemberExpr>
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/AST/Stmt.cpp:240:53
#12 0x0000000013ac4ba0 clang::Stmt::getSourceRange() const
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build64/tools/clang/include/clang/AST/StmtNodes.inc:597:0
#13 0x0000010004c4acb8
#14 0x0000000013a0d79c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformCallExpr(clang::CallExpr*)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/TreeTransform.h:9041:31
#15 0x0000000013aee72c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build64/tools/clang/include/clang/AST/StmtNodes.inc:329:1
#16 0x000000001341d658 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/TreeTransform.h:3242:35
#17 0x0000000013413488 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*,
bool) /home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/TreeTransform.h:6355:38
#18 0x0000000013412b4c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/TreeTransform.h:6342:23
#19 0x000000001342dab0 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build64/tools/clang/include/clang/AST/StmtNodes.inc:79:1
#20 0x0000000013432d5c clang::Sema::SubstStmt(clang::Stmt*,
clang::MultiLevelTemplateArgumentList const&)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp:2733:23
#21 0x0000000013412e3c
clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation,
clang::FunctionDecl*, bool, bool, bool)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:3887:23
#22 0x0000000013412a98 clang::Sema::PerformPendingInstantiations(bool)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:5131:7
#23 0x0000000013453ebc clang::Sema::ActOnEndOfTranslationUnit()
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Sema/Sema.cpp:725:5
#24 0x000000001344b71c
clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Parse/Parser.cpp:618:15
#25 0x0000000012e0c184 clang::ParseAST(clang::Sema&, bool, bool)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:147:18
#26 0x0000000012b3bd38 clang::ASTFrontendAction::ExecuteAction()
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:611:3
#27 0x0000000012b3589c clang::CodeGenAction::ExecuteAction()
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:989:28
#28 0x0000000012222a84 clang::FrontendAction::Execute()
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:512:8
#29 0x00000000125e1118
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:959:11
#30 0x00000000122220c4
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:249:25
#31 0x00000000121dc6a8 cc1_main(llvm::ArrayRef<char const*>, char
const*, void*) /home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/tools/driver/cc1_main.cpp:221:13
#32 0x00000000122cd724 ExecuteCC1Tool
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/tools/driver/driver.cpp:299:12
#33 0x00000000122cd724 main
/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm/tools/clang/tools/driver/driver.cpp:380:0
#34 0x000000001042ed64 generic_start_main.isra.0
(/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build/llvm_build64/bin/clang-5.0+0x1042ed64)
#35 0x000000001042bdc4 __libc_start_main
(/home/buildbots/ppc64le-sanitizer/sanitizer-ppc64le/build
On Fri, Mar 24, 2017 at 3:04 PM Vitaly Buka <vitalybuka at google.com> wrote:
> These tests are broken after the patch
>
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/6467/steps/test%20tsan%20in%20debug%20compiler-rt%20build/logs/stdio
>
> Scanning dependencies of target TsanUnitTests
> [ 90%] Built target TsanUnitTests
> [ 90%] Built target SanitizerLintCheck
> -- libcxx_tsan_x86_64 configure command succeeded. See also /mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/tsan_debug_build/tools/clang/runtime/compiler-rt-bins/lib/tsan/libcxx_tsan_x86_64/src/libcxx_tsan_x86_64-stamp/libcxx_tsan_x86_64-configure-*.log
> [ 90%] Performing build step for 'libcxx_tsan_x86_64'make[7]: *** [lib/tsan/CMakeFiles/GotsanRuntimeCheck] Error 139
> make[6]: *** [lib/tsan/CMakeFiles/GotsanRuntimeCheck.dir/all] Error 2
> make[6]: *** Waiting for unfinished jobs....
> -- libcxx_tsan_x86_64 build command succeeded. See also /mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/tsan_debug_build/tools/clang/runtime/compiler-rt-bins/lib/tsan/libcxx_tsan_x86_64/src/libcxx_tsan_x86_64-stamp/libcxx_tsan_x86_64-build-*.log
> [ 90%] Performing install step for 'libcxx_tsan_x86_64'
> -- libcxx_tsan_x86_64 install command succeeded. See also /mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/tsan_debug_build/tools/clang/runtime/compiler-rt-bins/lib/tsan/libcxx_tsan_x86_64/src/libcxx_tsan_x86_64-stamp/libcxx_tsan_x86_64-install-*.log
> [ 95%] Completed 'libcxx_tsan_x86_64'
> [ 95%] Built target libcxx_tsan_x86_64
> make[5]: *** [test/tsan/CMakeFiles/check-tsan.dir/rule] Error 2
> make[4]: *** [check-tsan] Error 2
> make[3]: *** [tools/clang/runtime/CMakeFiles/check-tsan] Error 2
> make[2]: *** [tools/clang/runtime/CMakeFiles/check-tsan.dir/all] Error 2
> make[1]: *** [tools/clang/runtime/CMakeFiles/check-tsan.dir/rule] Error 2
> make: *** [check-tsan] Error 2
> + echo @@@STEP_FAILURE@@@
> @@@STEP_FAILURE@@@
>
>
> Reproducible locally with
>
> MAKE_JOBS=30 BUILDBOT_REVISION=298711 BUILDBOT_CLOBBER= llvm/projects/zorg/zorg/buildbot/builders/sanitizers/buildbot_standard.sh
>
>
> On Fri, Mar 24, 2017 at 10:09 AM Craig Topper via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: ctopper
>> Date: Fri Mar 24 11:56:51 2017
>> New Revision: 298711
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=298711&view=rev
>> Log:
>> [InstCombine] Provide a way to calculate KnownZero/One for Add/Sub in
>> SimplifyDemandedUseBits without recursing into ComputeKnownBits
>>
>> SimplifyDemandedUseBits for Add/Sub already recursed down LHS and RHS for
>> simplifying bits. If that didn't provide any simplifications we fall back
>> to calling computeKnownBits which will recurse again. Instead just take the
>> known bits for LHS and RHS we already have and call into a new function in
>> ValueTracking that can calculate the known bits given the LHS/RHS bits.
>>
>>
>>
>>
>> Modified:
>> llvm/trunk/include/llvm/Analysis/ValueTracking.h
>> llvm/trunk/lib/Analysis/ValueTracking.cpp
>> llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>>
>> Modified: llvm/trunk/include/llvm/Analysis/ValueTracking.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ValueTracking.h?rev=298711&r1=298710&r2=298711&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/ValueTracking.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/ValueTracking.h Fri Mar 24 11:56:51
>> 2017
>> @@ -55,6 +55,11 @@ template <typename T> class ArrayRef;
>> const Instruction *CxtI = nullptr,
>> const DominatorTree *DT = nullptr,
>> OptimizationRemarkEmitter *ORE = nullptr);
>> + /// Compute known bits for add/sub using LHS/RHS known bits.
>> + void computeKnownBitsForAddSub(bool Add, bool NSW,
>> + APInt &KnownZero, APInt &KnownOne,
>> + APInt &LHSKnownZero, APInt &LHSKnownOne,
>> + APInt &RHSKnownZero, APInt
>> &RHSKnownOne);
>> /// Compute known bits from the range metadata.
>> /// \p KnownZero the set of bits that are known to be zero
>> /// \p KnownOne the set of bits that are known to be one
>>
>> Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=298711&r1=298710&r2=298711&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Fri Mar 24 11:56:51 2017
>> @@ -250,37 +250,29 @@ unsigned llvm::ComputeNumSignBits(const
>> return ::ComputeNumSignBits(V, Depth, Query(DL, AC, safeCxtI(V, CxtI),
>> DT));
>> }
>>
>> -static void computeKnownBitsAddSub(bool Add, const Value *Op0, const
>> Value *Op1,
>> - bool NSW,
>> - APInt &KnownZero, APInt &KnownOne,
>> - APInt &KnownZero2, APInt &KnownOne2,
>> - unsigned Depth, const Query &Q) {
>> - unsigned BitWidth = KnownZero.getBitWidth();
>> -
>> - // If an initial sequence of bits in the result is not needed, the
>> - // corresponding bits in the operands are not needed.
>> - APInt LHSKnownZero(BitWidth, 0), LHSKnownOne(BitWidth, 0);
>> - computeKnownBits(Op0, LHSKnownZero, LHSKnownOne, Depth + 1, Q);
>> - computeKnownBits(Op1, KnownZero2, KnownOne2, Depth + 1, Q);
>> -
>> +/// Compute known bits for add/sub using LHS/RHS known bits.
>> +void llvm::computeKnownBitsForAddSub(bool Add, bool NSW,
>> + APInt &KnownZero, APInt &KnownOne,
>> + APInt &LHSKnownZero, APInt
>> &LHSKnownOne,
>> + APInt &RHSKnownZero, APInt
>> &RHSKnownOne) {
>> // Carry in a 1 for a subtract, rather than a 0.
>> uint64_t CarryIn = 0;
>> if (!Add) {
>> // Sum = LHS + ~RHS + 1
>> - std::swap(KnownZero2, KnownOne2);
>> + std::swap(RHSKnownZero, RHSKnownOne);
>> CarryIn = 1;
>> }
>>
>> - APInt PossibleSumZero = ~LHSKnownZero + ~KnownZero2 + CarryIn;
>> - APInt PossibleSumOne = LHSKnownOne + KnownOne2 + CarryIn;
>> + APInt PossibleSumZero = ~LHSKnownZero + ~RHSKnownZero + CarryIn;
>> + APInt PossibleSumOne = LHSKnownOne + RHSKnownOne + CarryIn;
>>
>> // Compute known bits of the carry.
>> - APInt CarryKnownZero = ~(PossibleSumZero ^ LHSKnownZero ^ KnownZero2);
>> - APInt CarryKnownOne = PossibleSumOne ^ LHSKnownOne ^ KnownOne2;
>> + APInt CarryKnownZero = ~(PossibleSumZero ^ LHSKnownZero ^
>> RHSKnownZero);
>> + APInt CarryKnownOne = PossibleSumOne ^ LHSKnownOne ^ RHSKnownOne;
>>
>> // Compute set of known bits (where all three relevant bits are known).
>> APInt LHSKnown = LHSKnownZero | LHSKnownOne;
>> - APInt RHSKnown = KnownZero2 | KnownOne2;
>> + APInt RHSKnown = RHSKnownZero | RHSKnownOne;
>> APInt CarryKnown = CarryKnownZero | CarryKnownOne;
>> APInt Known = LHSKnown & RHSKnown & CarryKnown;
>>
>> @@ -296,14 +288,36 @@ static void computeKnownBitsAddSub(bool
>> if (NSW) {
>> // Adding two non-negative numbers, or subtracting a negative
>> number from
>> // a non-negative one, can't wrap into negative.
>> - if (LHSKnownZero.isNegative() && KnownZero2.isNegative())
>> + if (LHSKnownZero.isNegative() && RHSKnownZero.isNegative())
>> KnownZero.setSignBit();
>> // Adding two negative numbers, or subtracting a non-negative
>> number from
>> // a negative one, can't wrap into non-negative.
>> - else if (LHSKnownOne.isNegative() && KnownOne2.isNegative())
>> + else if (LHSKnownOne.isNegative() && RHSKnownOne.isNegative())
>> KnownOne.setSignBit();
>> }
>> }
>> +
>> + // Put the RHS/LHS back how we found them.
>> + if (!Add) {
>> + std::swap(RHSKnownZero, RHSKnownOne);
>> + }
>> +}
>> +
>> +static void computeKnownBitsAddSub(bool Add, const Value *Op0, const
>> Value *Op1,
>> + bool NSW,
>> + APInt &KnownZero, APInt &KnownOne,
>> + APInt &KnownZero2, APInt &KnownOne2,
>> + unsigned Depth, const Query &Q) {
>> + unsigned BitWidth = KnownZero.getBitWidth();
>> +
>> + // If an initial sequence of bits in the result is not needed, the
>> + // corresponding bits in the operands are not needed.
>> + APInt LHSKnownZero(BitWidth, 0), LHSKnownOne(BitWidth, 0);
>> + computeKnownBits(Op0, LHSKnownZero, LHSKnownOne, Depth + 1, Q);
>> + computeKnownBits(Op1, KnownZero2, KnownOne2, Depth + 1, Q);
>> +
>> + computeKnownBitsForAddSub(Add, NSW, KnownZero, KnownOne, LHSKnownZero,
>> + LHSKnownOne, KnownZero2, KnownOne2);
>> }
>>
>> static void computeKnownBitsMul(const Value *Op0, const Value *Op1, bool
>> NSW,
>>
>> Modified:
>> llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp?rev=298711&r1=298710&r2=298711&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>> (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>> Fri Mar 24 11:56:51 2017
>> @@ -538,7 +538,7 @@ Value *InstCombiner::SimplifyDemandedUse
>> LHSKnownZero, LHSKnownOne, Depth + 1) ||
>> ShrinkDemandedConstant(I, 1, DemandedFromOps) ||
>> SimplifyDemandedBits(I->getOperandUse(1), DemandedFromOps,
>> - LHSKnownZero, LHSKnownOne, Depth + 1)) {
>> + RHSKnownZero, RHSKnownOne, Depth + 1)) {
>> // Disable the nsw and nuw flags here: We can no longer
>> guarantee that
>> // we won't wrap after simplification. Removing the nsw/nuw
>> flags is
>> // legal here because the top bit is not demanded.
>> @@ -549,9 +549,10 @@ Value *InstCombiner::SimplifyDemandedUse
>> }
>> }
>>
>> - // Otherwise just hand the add/sub off to computeKnownBits to fill in
>> - // the known zeros and ones.
>> - computeKnownBits(V, KnownZero, KnownOne, Depth, CxtI);
>> + // Otherwise compute the known bits using the RHS/LHS known bits.
>> + bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
>> + computeKnownBitsForAddSub(V, NSW, KnownZero, KnownOne, LHSKnownZero,
>> + LHSKnownOne, RHSKnownZero, RHSKnownOne);
>> break;
>> }
>> case Instruction::Shl:
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://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/20170324/186f5f33/attachment.html>
More information about the llvm-commits
mailing list