| Index: lib/Target/JSBackend/SimplifyAllocas.cpp
|
| diff --git a/lib/Target/JSBackend/SimplifyAllocas.cpp b/lib/Target/JSBackend/SimplifyAllocas.cpp
|
| deleted file mode 100644
|
| index 5d58c0948aecd94a0147e8eed0ed0f9d358500d9..0000000000000000000000000000000000000000
|
| --- a/lib/Target/JSBackend/SimplifyAllocas.cpp
|
| +++ /dev/null
|
| @@ -1,112 +0,0 @@
|
| -//===-- SimplifyAllocas.cpp - Alloca optimization ---------------*- C++ -*-===//
|
| -//
|
| -// The LLVM Compiler Infrastructure
|
| -//
|
| -// This file is distributed under the University of Illinois Open Source
|
| -// License. See LICENSE.TXT for details.
|
| -//
|
| -//===-----------------------------------------------------------------------===//
|
| -//
|
| -// There shouldn't be any opportunities for this pass to do anything if the
|
| -// regular LLVM optimizer passes are run. However, it does make things nicer
|
| -// at -O0.
|
| -//
|
| -//===-----------------------------------------------------------------------===//
|
| -
|
| -#include "OptPasses.h"
|
| -
|
| -#include "llvm/IR/Instruction.h"
|
| -#include "llvm/IR/Instructions.h"
|
| -#include "llvm/IR/Function.h"
|
| -#include "llvm/IR/Constants.h"
|
| -
|
| -#ifdef NDEBUG
|
| -#undef assert
|
| -#define assert(x) { if (!(x)) report_fatal_error(#x); }
|
| -#endif
|
| -
|
| -namespace llvm {
|
| -
|
| -/*
|
| - * Find cases where an alloca is used only to load and store a single value,
|
| - * even though it is bitcast. Then replace it with a direct alloca of that
|
| - * simple type, and avoid the bitcasts.
|
| - */
|
| -
|
| -struct SimplifyAllocas : public FunctionPass {
|
| - static char ID; // Pass identification, replacement for typeid
|
| - SimplifyAllocas() : FunctionPass(ID) {}
|
| - // XXX initialize..(*PassRegistry::getPassRegistry()); }
|
| -
|
| - virtual bool runOnFunction(Function &Func);
|
| -
|
| - virtual const char *getPassName() const { return "SimplifyAllocas"; }
|
| -};
|
| -
|
| -char SimplifyAllocas::ID = 0;
|
| -
|
| -bool SimplifyAllocas::runOnFunction(Function &Func) {
|
| - bool Changed = false;
|
| - Type *i32 = Type::getInt32Ty(Func.getContext());
|
| - std::vector<Instruction*> ToRemove; // removing can invalidate our iterators, so do it all at the end
|
| - for (Function::iterator B = Func.begin(), E = Func.end(); B != E; ++B) {
|
| - for (BasicBlock::iterator BI = B->begin(), BE = B->end(); BI != BE; ) {
|
| - Instruction *I = BI++;
|
| - AllocaInst *AI = dyn_cast<AllocaInst>(I);
|
| - if (!AI) continue;
|
| - if (!isa<ConstantInt>(AI->getArraySize())) continue;
|
| - bool Fail = false;
|
| - Type *ActualType = NULL;
|
| - #define CHECK_TYPE(TT) { \
|
| - Type *T = TT; \
|
| - if (!ActualType) { \
|
| - ActualType = T; \
|
| - } else { \
|
| - if (T != ActualType) Fail = true; \
|
| - } \
|
| - }
|
| - std::vector<Instruction*> Aliases; // the bitcasts of this alloca
|
| - for (Instruction::user_iterator UI = AI->user_begin(), UE = AI->user_end(); UI != UE && !Fail; ++UI) {
|
| - Instruction *U = cast<Instruction>(*UI);
|
| - if (U->getOpcode() != Instruction::BitCast) { Fail = true; break; }
|
| - // bitcasting just to do loads and stores is ok
|
| - for (Instruction::user_iterator BUI = U->user_begin(), BUE = U->user_end(); BUI != BUE && !Fail; ++BUI) {
|
| - Instruction *BU = cast<Instruction>(*BUI);
|
| - if (BU->getOpcode() == Instruction::Load) {
|
| - CHECK_TYPE(BU->getType());
|
| - break;
|
| - }
|
| - if (BU->getOpcode() != Instruction::Store) { Fail = true; break; }
|
| - CHECK_TYPE(BU->getOperand(0)->getType());
|
| - if (BU->getOperand(0) == U) { Fail = true; break; }
|
| - }
|
| - if (!Fail) Aliases.push_back(U);
|
| - }
|
| - if (!Fail && Aliases.size() > 0 && ActualType) {
|
| - // success, replace the alloca and the bitcast aliases with a single simple alloca
|
| - AllocaInst *NA = new AllocaInst(ActualType, ConstantInt::get(i32, 1), "", I);
|
| - NA->takeName(AI);
|
| - NA->setAlignment(AI->getAlignment());
|
| - NA->setDebugLoc(AI->getDebugLoc());
|
| - for (unsigned i = 0; i < Aliases.size(); i++) {
|
| - Aliases[i]->replaceAllUsesWith(NA);
|
| - ToRemove.push_back(Aliases[i]);
|
| - }
|
| - ToRemove.push_back(AI);
|
| - Changed = true;
|
| - }
|
| - }
|
| - }
|
| - for (unsigned i = 0; i < ToRemove.size(); i++) {
|
| - ToRemove[i]->eraseFromParent();
|
| - }
|
| - return Changed;
|
| -}
|
| -
|
| -//
|
| -
|
| -extern FunctionPass *createEmscriptenSimplifyAllocasPass() {
|
| - return new SimplifyAllocas();
|
| -}
|
| -
|
| -} // End llvm namespace
|
|
|