mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-19 06:31:18 +00:00
Remove code designed to compensate for a bug in GCC. The bug has since
been fixed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1881 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
acd3caec0d
commit
f09733a876
@ -393,7 +393,6 @@ static inline bool FixCastsAndPHIs(BasicBlock *BB) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,33 +435,10 @@ static inline void RefactorPredecessor(BasicBlock *BB, BasicBlock *Pred) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// CheckIncomingValueFor - Make sure that the specified PHI node has an entry
|
|
||||||
// for the provided basic block. If it doesn't, add one and return true.
|
|
||||||
//
|
|
||||||
static inline void CheckIncomingValueFor(PHINode *PN, BasicBlock *BB) {
|
|
||||||
if (PN->getBasicBlockIndex(BB) != -1) return; // Already has value
|
|
||||||
|
|
||||||
Value *NewVal = 0;
|
|
||||||
const Type *Ty = PN->getType();
|
|
||||||
|
|
||||||
if (const PointerType *PT = dyn_cast<PointerType>(Ty))
|
|
||||||
NewVal = ConstantPointerNull::get(PT);
|
|
||||||
else if (Ty == Type::BoolTy)
|
|
||||||
NewVal = ConstantBool::True;
|
|
||||||
else if (Ty == Type::FloatTy || Ty == Type::DoubleTy)
|
|
||||||
NewVal = ConstantFP::get(Ty, 42);
|
|
||||||
else if (Ty->isIntegral())
|
|
||||||
NewVal = ConstantInt::get(Ty, 42);
|
|
||||||
|
|
||||||
assert(NewVal && "Unknown PHI node type!");
|
|
||||||
PN->addIncoming(NewVal, BB);
|
|
||||||
}
|
|
||||||
|
|
||||||
// fixLocalProblems - Loop through the method and fix problems with the PHI
|
// fixLocalProblems - Loop through the method and fix problems with the PHI
|
||||||
// nodes in the current method. The two problems that are handled are:
|
// nodes in the current method. The problem is that PHI nodes might exist with
|
||||||
//
|
// multiple entries for the same predecessor. GCC sometimes generates code
|
||||||
// 1. PHI nodes with multiple entries for the same predecessor. GCC sometimes
|
// that looks like this:
|
||||||
// generates code that looks like this:
|
|
||||||
//
|
//
|
||||||
// bb7: br bool %cond1004, label %bb8, label %bb8
|
// bb7: br bool %cond1004, label %bb8, label %bb8
|
||||||
// bb8: %reg119 = phi uint [ 0, %bb7 ], [ 1, %bb7 ]
|
// bb8: %reg119 = phi uint [ 0, %bb7 ], [ 1, %bb7 ]
|
||||||
@ -475,18 +451,6 @@ static inline void CheckIncomingValueFor(PHINode *PN, BasicBlock *BB) {
|
|||||||
// bb8: %reg119 = phi uint [ 0, %bbX ], [ 1, %bb7 ]
|
// bb8: %reg119 = phi uint [ 0, %bbX ], [ 1, %bb7 ]
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// 2. PHI nodes with fewer arguments than predecessors.
|
|
||||||
// These can be generated by GCC if a variable is uninitalized over a path
|
|
||||||
// in the CFG. We fix this by adding an entry for the missing predecessors
|
|
||||||
// that is initialized to either 42 for a numeric/FP value, or null if it's
|
|
||||||
// a pointer value. This problem can be generated by code that looks like
|
|
||||||
// this:
|
|
||||||
// int foo(int y) {
|
|
||||||
// int X;
|
|
||||||
// if (y) X = 1;
|
|
||||||
// return X;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
static bool fixLocalProblems(Method *M) {
|
static bool fixLocalProblems(Method *M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
// Don't use iterators because invalidation gets messy...
|
// Don't use iterators because invalidation gets messy...
|
||||||
@ -498,8 +462,8 @@ static bool fixLocalProblems(Method *M) {
|
|||||||
if (isa<PHINode>(BB->front())) {
|
if (isa<PHINode>(BB->front())) {
|
||||||
const vector<BasicBlock*> Preds(pred_begin(BB), pred_end(BB));
|
const vector<BasicBlock*> Preds(pred_begin(BB), pred_end(BB));
|
||||||
|
|
||||||
// Handle Problem #1. Sort the list of predecessors so that it is easy to
|
// Handle the problem. Sort the list of predecessors so that it is easy
|
||||||
// decide whether or not duplicate predecessors exist.
|
// to decide whether or not duplicate predecessors exist.
|
||||||
vector<BasicBlock*> SortedPreds(Preds);
|
vector<BasicBlock*> SortedPreds(Preds);
|
||||||
sort(SortedPreds.begin(), SortedPreds.end());
|
sort(SortedPreds.begin(), SortedPreds.end());
|
||||||
|
|
||||||
@ -512,22 +476,6 @@ static bool fixLocalProblems(Method *M) {
|
|||||||
}
|
}
|
||||||
LastOne = SortedPreds[i];
|
LastOne = SortedPreds[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop over all of the PHI nodes in the current BB. These PHI nodes are
|
|
||||||
// guaranteed to be at the beginning of the basic block.
|
|
||||||
//
|
|
||||||
for (BasicBlock::iterator I = BB->begin();
|
|
||||||
PHINode *PN = dyn_cast<PHINode>(*I); ++I) {
|
|
||||||
|
|
||||||
// Handle problem #2.
|
|
||||||
if (PN->getNumIncomingValues() != Preds.size()) {
|
|
||||||
assert(PN->getNumIncomingValues() <= Preds.size() &&
|
|
||||||
"Can't handle extra arguments to PHI nodes!");
|
|
||||||
for (unsigned i = 0; i < Preds.size(); ++i)
|
|
||||||
CheckIncomingValueFor(PN, Preds[i]);
|
|
||||||
Changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Changed;
|
return Changed;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user