[llvm] r257279 - [JumpThreading] Don't forget to report that the IR changed
David Majnemer via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 10 21:42:42 PST 2016
Yes, I added one yesterday (r257280).
On Sunday, January 10, 2016, David Blaikie <dblaikie at gmail.com> wrote:
> any way to test this?
>
> On Sat, Jan 9, 2016 at 11:13 PM, David Majnemer via llvm-commits <
> llvm-commits at lists.llvm.org
> <javascript:_e(%7B%7D,'cvml','llvm-commits at lists.llvm.org');>> wrote:
>
>> Author: majnemer
>> Date: Sun Jan 10 01:13:04 2016
>> New Revision: 257279
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=257279&view=rev
>> Log:
>> [JumpThreading] Don't forget to report that the IR changed
>>
>> JumpThreading's runOnFunction is supposed to return true if it made any
>> changes. JumpThreading has a call to removeUnreachableBlocks which may
>> result in changes to the IR but runOnFunction didn't appropriate account
>> for this possibility, leading to badness.
>>
>> While we are here, make sure to call LazyValueInfo::eraseBlock in
>> removeUnreachableBlocks; JumpThreading preserves LVI.
>>
>> This fixes PR26096.
>>
>> Modified:
>> llvm/trunk/include/llvm/Transforms/Utils/Local.h
>> llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
>> llvm/trunk/lib/Transforms/Utils/Local.cpp
>>
>> Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=257279&r1=257278&r2=257279&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
>> +++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Sun Jan 10 01:13:04
>> 2016
>> @@ -42,6 +42,7 @@ class TargetLibraryInfo;
>> class TargetTransformInfo;
>> class DIBuilder;
>> class DominatorTree;
>> +class LazyValueInfo;
>>
>> template<typename T> class SmallVectorImpl;
>>
>> @@ -303,7 +304,7 @@ void removeUnwindEdge(BasicBlock *BB);
>> /// \brief Remove all blocks that can not be reached from the function's
>> entry.
>> ///
>> /// Returns true if any basic block was removed.
>> -bool removeUnreachableBlocks(Function &F);
>> +bool removeUnreachableBlocks(Function &F, LazyValueInfo *LVI = nullptr);
>>
>> /// \brief Combine the metadata of two instructions so that K can
>> replace J
>> ///
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=257279&r1=257278&r2=257279&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Sun Jan 10
>> 01:13:04 2016
>> @@ -211,11 +211,12 @@ bool JumpThreading::runOnFunction(Functi
>> // we will loop forever. We take care of this issue by not jump
>> threading for
>> // back edges. This works for normal cases but not for unreachable
>> blocks as
>> // they may have cycle with no back edge.
>> - removeUnreachableBlocks(F);
>> + bool EverChanged = false;
>> + EverChanged |= removeUnreachableBlocks(F, LVI);
>>
>> FindLoopHeaders(F);
>>
>> - bool Changed, EverChanged = false;
>> + bool Changed;
>> do {
>> Changed = false;
>> for (Function::iterator I = F.begin(), E = F.end(); I != E;) {
>>
>> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=257279&r1=257278&r2=257279&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Sun Jan 10 01:13:04 2016
>> @@ -23,6 +23,7 @@
>> #include "llvm/Analysis/EHPersonalities.h"
>> #include "llvm/Analysis/InstructionSimplify.h"
>> #include "llvm/Analysis/MemoryBuiltins.h"
>> +#include "llvm/Analysis/LazyValueInfo.h"
>> #include "llvm/Analysis/ValueTracking.h"
>> #include "llvm/IR/CFG.h"
>> #include "llvm/IR/Constants.h"
>> @@ -1407,7 +1408,7 @@ void llvm::removeUnwindEdge(BasicBlock *
>> /// removeUnreachableBlocksFromFn - Remove blocks that are not
>> reachable, even
>> /// if they are in a dead cycle. Return true if a change was made, false
>> /// otherwise.
>> -bool llvm::removeUnreachableBlocks(Function &F) {
>> +bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI) {
>> SmallPtrSet<BasicBlock*, 128> Reachable;
>> bool Changed = markAliveBlocks(F, Reachable);
>>
>> @@ -1428,6 +1429,8 @@ bool llvm::removeUnreachableBlocks(Funct
>> ++SI)
>> if (Reachable.count(*SI))
>> (*SI)->removePredecessor(&*BB);
>> + if (LVI)
>> + LVI->eraseBlock(&*BB);
>> BB->dropAllReferences();
>> }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> <javascript:_e(%7B%7D,'cvml','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/20160110/2cc6e011/attachment.html>
More information about the llvm-commits
mailing list