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 "llvm/Support/CommandLine.h" 11 #include "llvm/Support/InstructionCost.h" 12 #include "llvm/Transforms/Vectorize/SandboxVectorizer/Debug.h" 13 14 namespace llvm { 15 16 static cl::opt<int> CostThreshold("sbvec-cost-threshold", cl::init(0), 17 cl::Hidden, 18 cl::desc("Vectorization cost threshold.")); 19 20 namespace sandboxir { 21 runOnRegion(Region & Rgn,const Analyses & A)22bool TransactionAcceptOrRevert::runOnRegion(Region &Rgn, const Analyses &A) { 23 const auto &SB = Rgn.getScoreboard(); 24 [[maybe_unused]] auto CostBefore = SB.getBeforeCost(); 25 [[maybe_unused]] auto CostAfter = SB.getAfterCost(); 26 InstructionCost CostAfterMinusBefore = SB.getAfterCost() - SB.getBeforeCost(); 27 LLVM_DEBUG(dbgs() << DEBUG_PREFIX << "Cost gain: " << CostAfterMinusBefore 28 << " (before/after/threshold: " << CostBefore << "/" 29 << CostAfter << "/" << CostThreshold << ")\n"); 30 // TODO: Print costs / write to remarks. 31 auto &Tracker = Rgn.getContext().getTracker(); 32 if (CostAfterMinusBefore < -CostThreshold) { 33 bool HasChanges = !Tracker.empty(); 34 Tracker.accept(); 35 LLVM_DEBUG(dbgs() << DEBUG_PREFIX << "*** Transaction Accept ***\n"); 36 return HasChanges; 37 } 38 // Revert the IR. 39 LLVM_DEBUG(dbgs() << DEBUG_PREFIX << "*** Transaction Revert ***\n"); 40 Rgn.getContext().getTracker().revert(); 41 return false; 42 } 43 44 } // namespace sandboxir 45 } // namespace llvm 46