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