mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
Summary: While there is always a `Value::replaceAllUsesWith()`, sometimes the replacement needs to be conditional. I have only cleaned a few cases where `replaceUsesWithIf()` could be used, to both add test coverage, and show that it is actually useful. Reviewers: jdoerfert, spatel, RKSimon, craig.topper Reviewed By: jdoerfert Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, aheejin, george.burgess.iv, asbirlea, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D65528 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367548 91177308-0d34-0410-b5e6-96231b3b80d8
81 lines
2.5 KiB
C++
81 lines
2.5 KiB
C++
//===-- WebAssemblyOptimizeReturned.cpp - Optimize "returned" attributes --===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// Optimize calls with "returned" attributes for WebAssembly.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "WebAssembly.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/IR/InstVisitor.h"
|
|
#include "llvm/Support/Debug.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "wasm-optimize-returned"
|
|
|
|
namespace {
|
|
class OptimizeReturned final : public FunctionPass,
|
|
public InstVisitor<OptimizeReturned> {
|
|
StringRef getPassName() const override {
|
|
return "WebAssembly Optimize Returned";
|
|
}
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.setPreservesCFG();
|
|
AU.addRequired<DominatorTreeWrapperPass>();
|
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
|
FunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
|
|
bool runOnFunction(Function &F) override;
|
|
|
|
DominatorTree *DT = nullptr;
|
|
|
|
public:
|
|
static char ID;
|
|
OptimizeReturned() : FunctionPass(ID) {}
|
|
|
|
void visitCallSite(CallSite CS);
|
|
};
|
|
} // End anonymous namespace
|
|
|
|
char OptimizeReturned::ID = 0;
|
|
INITIALIZE_PASS(OptimizeReturned, DEBUG_TYPE,
|
|
"Optimize calls with \"returned\" attributes for WebAssembly",
|
|
false, false)
|
|
|
|
FunctionPass *llvm::createWebAssemblyOptimizeReturned() {
|
|
return new OptimizeReturned();
|
|
}
|
|
|
|
void OptimizeReturned::visitCallSite(CallSite CS) {
|
|
for (unsigned I = 0, E = CS.getNumArgOperands(); I < E; ++I)
|
|
if (CS.paramHasAttr(I, Attribute::Returned)) {
|
|
Instruction *Inst = CS.getInstruction();
|
|
Value *Arg = CS.getArgOperand(I);
|
|
// Ignore constants, globals, undef, etc.
|
|
if (isa<Constant>(Arg))
|
|
continue;
|
|
// Like replaceDominatedUsesWith but using Instruction/Use dominance.
|
|
Arg->replaceUsesWithIf(Inst,
|
|
[&](Use &U) { return DT->dominates(Inst, U); });
|
|
}
|
|
}
|
|
|
|
bool OptimizeReturned::runOnFunction(Function &F) {
|
|
LLVM_DEBUG(dbgs() << "********** Optimize returned Attributes **********\n"
|
|
"********** Function: "
|
|
<< F.getName() << '\n');
|
|
|
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
|
visit(F);
|
|
return true;
|
|
}
|