mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
If converter was being too cute. It look for root BBs (which don't have
successors) and use inverse depth first search to traverse the BBs. However that doesn't work when the CFG has infinite loops. Simply do a linear traversal of all BBs work just fine. rdar://9344645 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130324 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bddc1ca18a
commit
309db7c947
@ -27,7 +27,6 @@
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/ADT/DepthFirstIterator.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
@ -146,10 +145,6 @@ namespace {
|
||||
: BBI(b), Kind(k), NeedSubsumption(s), NumDups(d), NumDups2(d2) {}
|
||||
};
|
||||
|
||||
/// Roots - Basic blocks that do not have successors. These are the starting
|
||||
/// points of Graph traversal.
|
||||
std::vector<MachineBasicBlock*> Roots;
|
||||
|
||||
/// BBAnalysis - Results of if-conversion feasibility analysis indexed by
|
||||
/// basic block number.
|
||||
std::vector<BBInfo> BBAnalysis;
|
||||
@ -287,11 +282,6 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
|
||||
MF.RenumberBlocks();
|
||||
BBAnalysis.resize(MF.getNumBlockIDs());
|
||||
|
||||
// Look for root nodes, i.e. blocks without successors.
|
||||
for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
|
||||
if (I->succ_empty())
|
||||
Roots.push_back(I);
|
||||
|
||||
std::vector<IfcvtToken*> Tokens;
|
||||
MadeChange = false;
|
||||
unsigned NumIfCvts = NumSimple + NumSimpleFalse + NumTriangle +
|
||||
@ -406,7 +396,6 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
|
||||
}
|
||||
|
||||
Tokens.clear();
|
||||
Roots.clear();
|
||||
BBAnalysis.clear();
|
||||
|
||||
if (MadeChange && IfCvtBranchFold) {
|
||||
@ -924,13 +913,9 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
|
||||
/// candidates.
|
||||
void IfConverter::AnalyzeBlocks(MachineFunction &MF,
|
||||
std::vector<IfcvtToken*> &Tokens) {
|
||||
std::set<MachineBasicBlock*> Visited;
|
||||
for (unsigned i = 0, e = Roots.size(); i != e; ++i) {
|
||||
for (idf_ext_iterator<MachineBasicBlock*> I=idf_ext_begin(Roots[i],Visited),
|
||||
E = idf_ext_end(Roots[i], Visited); I != E; ++I) {
|
||||
MachineBasicBlock *BB = *I;
|
||||
AnalyzeBlock(BB, Tokens);
|
||||
}
|
||||
for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
|
||||
MachineBasicBlock *BB = I;
|
||||
AnalyzeBlock(BB, Tokens);
|
||||
}
|
||||
|
||||
// Sort to favor more complex ifcvt scheme.
|
||||
|
59
test/CodeGen/ARM/2011-04-27-IfCvtBug.ll
Normal file
59
test/CodeGen/ARM/2011-04-27-IfCvtBug.ll
Normal file
@ -0,0 +1,59 @@
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios
|
||||
|
||||
; If converter was being too cute. It look for root BBs (which don't have
|
||||
; successors) and use inverse depth first search to traverse the BBs. However
|
||||
; that doesn't work when the CFG has infinite loops. Simply do a linear
|
||||
; traversal of all BBs work just fine.
|
||||
|
||||
; rdar://9344645
|
||||
|
||||
%struct.hc = type { i32, i32, i32, i32 }
|
||||
|
||||
define i32 @t(i32 %type) optsize {
|
||||
entry:
|
||||
br i1 undef, label %if.then, label %if.else
|
||||
|
||||
if.then:
|
||||
unreachable
|
||||
|
||||
if.else:
|
||||
br i1 undef, label %if.then15, label %if.else18
|
||||
|
||||
if.then15:
|
||||
unreachable
|
||||
|
||||
if.else18:
|
||||
switch i32 %type, label %if.else173 [
|
||||
i32 3, label %if.then115
|
||||
i32 1, label %if.then102
|
||||
]
|
||||
|
||||
if.then102:
|
||||
br i1 undef, label %cond.true10.i, label %t.exit
|
||||
|
||||
cond.true10.i:
|
||||
br label %t.exit
|
||||
|
||||
t.exit:
|
||||
unreachable
|
||||
|
||||
if.then115:
|
||||
br i1 undef, label %if.else163, label %if.else145
|
||||
|
||||
if.else145:
|
||||
%call150 = call fastcc %struct.hc* @foo(%struct.hc* undef, i32 34865152) optsize
|
||||
br label %while.body172
|
||||
|
||||
if.else163:
|
||||
%call168 = call fastcc %struct.hc* @foo(%struct.hc* undef, i32 34078720) optsize
|
||||
br label %while.body172
|
||||
|
||||
while.body172:
|
||||
br label %while.body172
|
||||
|
||||
if.else173:
|
||||
ret i32 -1
|
||||
}
|
||||
|
||||
declare hidden fastcc %struct.hc* @foo(%struct.hc* nocapture, i32) nounwind optsize
|
||||
|
Loading…
x
Reference in New Issue
Block a user