1//===- TransactionAcceptOrRevert.cpp - Check cost and accept/revert region ===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAcceptOrRevert.h"
10#include "../../VectorizeOptions.h"
11#include "llvm/Support/InstructionCost.h"
12#include "llvm/Transforms/Vectorize/SandboxVectorizer/Debug.h"
13#include "llvm/Transforms/Vectorize/SandboxVectorizer/RegionWithScore.h"
14
15namespace llvm {
16
17namespace sandboxir {
18
19bool TransactionAcceptOrRevert::runOnRegion(Region &Rgn, const Analyses &A) {
20 const VectorizeOptions &Opts =
21 Rgn.getContext().getLibraryOptions().get<VectorizeOptions>();
22 const auto &SB = cast<RegionWithScore>(Val&: Rgn).getScoreboard();
23 [[maybe_unused]] auto CostBefore = SB.getBeforeCost();
24 [[maybe_unused]] auto CostAfter = SB.getAfterCost();
25 InstructionCost CostAfterMinusBefore = SB.getAfterCost() - SB.getBeforeCost();
26 LLVM_DEBUG(dbgs() << DEBUG_PREFIX << "Cost gain: " << CostAfterMinusBefore
27 << " (before/after/threshold: " << CostBefore << "/"
28 << CostAfter << "/" << Opts.sbvec_cost_threshold << ")\n");
29 // TODO: Print costs / write to remarks.
30 auto &Tracker = Rgn.getContext().getTracker();
31 if (CostAfterMinusBefore < -Opts.sbvec_cost_threshold) {
32 bool HasChanges = !Tracker.empty();
33 Tracker.accept();
34 LLVM_DEBUG(dbgs() << DEBUG_PREFIX << "*** Transaction Accept ***\n");
35 return HasChanges;
36 }
37 // Revert the IR.
38 LLVM_DEBUG(dbgs() << DEBUG_PREFIX << "*** Transaction Revert ***\n");
39 Rgn.getContext().getTracker().revert();
40 return false;
41}
42
43} // namespace sandboxir
44} // namespace llvm
45