HexagonRemoveSZExtArgs.cpp revision 249423
192108Sphk//===- HexagonRemoveExtendArgs.cpp - Remove unnecessary argument sign extends //
292108Sphk//
392108Sphk//                     The LLVM Compiler Infrastructure
492108Sphk//
592108Sphk// This file is distributed under the University of Illinois Open Source
692108Sphk// License. See LICENSE.TXT for details.
792108Sphk//
892108Sphk//===----------------------------------------------------------------------===//
992108Sphk//
1092108Sphk// Pass that removes sign extends for function parameters. These parameters
1192108Sphk// are already sign extended by the caller per Hexagon's ABI
1292108Sphk//
1392108Sphk//===----------------------------------------------------------------------===//
1492108Sphk
1592108Sphk#include "Hexagon.h"
1692108Sphk#include "HexagonTargetMachine.h"
1792108Sphk#include "llvm/CodeGen/MachineFunctionAnalysis.h"
1892108Sphk#include "llvm/IR/Function.h"
1992108Sphk#include "llvm/IR/Instructions.h"
2092108Sphk#include "llvm/Pass.h"
2192108Sphk#include "llvm/Transforms/Scalar.h"
2292108Sphk
2392108Sphkusing namespace llvm;
2492108Sphknamespace {
2592108Sphk  struct HexagonRemoveExtendArgs : public FunctionPass {
2692108Sphk  public:
2792108Sphk    static char ID;
2892108Sphk    HexagonRemoveExtendArgs() : FunctionPass(ID) {}
2992108Sphk    virtual bool runOnFunction(Function &F);
3092108Sphk
3192108Sphk    const char *getPassName() const {
3292108Sphk      return "Remove sign extends";
3392108Sphk    }
3492108Sphk
3592108Sphk    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
36116196Sobrien      AU.addRequired<MachineFunctionAnalysis>();
37116196Sobrien      AU.addPreserved<MachineFunctionAnalysis>();
3892108Sphk      FunctionPass::getAnalysisUsage(AU);
3992108Sphk    }
4092108Sphk  };
4192108Sphk}
4292108Sphk
4392108Sphkchar HexagonRemoveExtendArgs::ID = 0;
4492108SphkRegisterPass<HexagonRemoveExtendArgs> X("reargs",
4592108Sphk                                        "Remove Sign and Zero Extends for Args"
4692108Sphk                                        );
4792108Sphk
4892108Sphk
4992108Sphk
5092108Sphkbool HexagonRemoveExtendArgs::runOnFunction(Function &F) {
5192108Sphk  unsigned Idx = 1;
5292108Sphk  for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end(); AI != AE;
5392108Sphk       ++AI, ++Idx) {
5492108Sphk    if (F.getAttributes().hasAttribute(Idx, Attribute::SExt)) {
5593776Sphk      Argument* Arg = AI;
5693776Sphk      if (!isa<PointerType>(Arg->getType())) {
5793776Sphk        for (Instruction::use_iterator UI = Arg->use_begin();
5893776Sphk             UI != Arg->use_end();) {
5995321Sphk          if (isa<SExtInst>(*UI)) {
60114493Sphk            Instruction* Use = cast<Instruction>(*UI);
6192108Sphk            SExtInst* SI = new SExtInst(Arg, Use->getType());
6292108Sphk            assert (EVT::getEVT(SI->getType()) ==
6392108Sphk                    (EVT::getEVT(Use->getType())));
64111119Simp            ++UI;
65131046Spjd            Use->replaceAllUsesWith(SI);
66131046Spjd            Instruction* First = F.getEntryBlock().begin();
67131046Spjd            SI->insertBefore(First);
68131046Spjd            Use->eraseFromParent();
69104057Sphk          } else {
70111119Simp            ++UI;
7192108Sphk          }
7292108Sphk        }
7392108Sphk      }
7492108Sphk    }
75114493Sphk  }
76114493Sphk  return true;
77114493Sphk}
78114493Sphk
79132631Sle
80132631Sle
81114493SphkFunctionPass *llvm::createHexagonRemoveExtendOps(HexagonTargetMachine &TM) {
82114493Sphk  return new HexagonRemoveExtendArgs();
83114493Sphk}
84131408Spjd