mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[ARM] Fix non-determenistic behaviour
Summary: ARM Type Promotion pass does not clear the container that defines if one variable was visited or not, missing optimization opportunities by luck when two llvm:Values from different functions are allocated at the same memory address. Also fixes a comment and uses existing method to pop and obtain last element of the worklist. Reviewers: samparker Reviewed By: samparker Subscribers: kristof.beyls, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D73970
This commit is contained in:
parent
065908dec9
commit
5a63bbf4ef
@ -847,8 +847,7 @@ bool TypePromotion::TryToPromote(Value *V, unsigned PromotedWidth) {
|
||||
|
||||
// Iterate through, and add to, a tree of operands and users in the use-def.
|
||||
while (!WorkList.empty()) {
|
||||
Value *V = WorkList.back();
|
||||
WorkList.pop_back();
|
||||
Value *V = WorkList.pop_back_val();
|
||||
if (CurrentVisited.count(V))
|
||||
continue;
|
||||
|
||||
@ -917,7 +916,7 @@ bool TypePromotion::TryToPromote(Value *V, unsigned PromotedWidth) {
|
||||
++ToPromote;
|
||||
}
|
||||
|
||||
// DAG optimisations should be able to handle these cases better, especially
|
||||
// DAG optimizations should be able to handle these cases better, especially
|
||||
// for function arguments.
|
||||
if (ToPromote < 2 || (Blocks.size() == 1 && (NonFreeArgs > SafeWrap.size())))
|
||||
return false;
|
||||
@ -941,6 +940,9 @@ bool TypePromotion::runOnFunction(Function &F) {
|
||||
if (!TPC)
|
||||
return false;
|
||||
|
||||
AllVisited.clear();
|
||||
SafeToPromote.clear();
|
||||
SafeWrap.clear();
|
||||
bool MadeChange = false;
|
||||
const DataLayout &DL = F.getParent()->getDataLayout();
|
||||
const TargetMachine &TM = TPC->getTM<TargetMachine>();
|
||||
@ -998,6 +1000,10 @@ bool TypePromotion::runOnFunction(Function &F) {
|
||||
if (MadeChange)
|
||||
LLVM_DEBUG(dbgs() << "After TypePromotion: " << F << "\n");
|
||||
|
||||
AllVisited.clear();
|
||||
SafeToPromote.clear();
|
||||
SafeWrap.clear();
|
||||
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user