1eea11e73SMatt Arsenault //===- SimplifyInstructions.cpp - Specialized Delta Pass ------------------===// 2eea11e73SMatt Arsenault // 3eea11e73SMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4eea11e73SMatt Arsenault // See https://llvm.org/LICENSE.txt for license information. 5eea11e73SMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6eea11e73SMatt Arsenault // 7eea11e73SMatt Arsenault //===----------------------------------------------------------------------===// 8eea11e73SMatt Arsenault // 9eea11e73SMatt Arsenault // This file implements a function which calls the Generic Delta pass in order 10eea11e73SMatt Arsenault // to simplify Instructions in defined functions. 11eea11e73SMatt Arsenault // 12eea11e73SMatt Arsenault //===----------------------------------------------------------------------===// 13eea11e73SMatt Arsenault 14eea11e73SMatt Arsenault #include "SimplifyInstructions.h" 15eea11e73SMatt Arsenault #include "llvm/Analysis/InstructionSimplify.h" 16eea11e73SMatt Arsenault #include "llvm/IR/Constants.h" 17eea11e73SMatt Arsenault 18eea11e73SMatt Arsenault using namespace llvm; 19eea11e73SMatt Arsenault 20eea11e73SMatt Arsenault /// Calls simplifyInstruction in each instruction in functions, and replaces 21eea11e73SMatt Arsenault /// their values. extractInstrFromModule(Oracle & O,ReducerWorkItem & WorkItem)22*23cc36e4SMatt Arsenaultstatic void extractInstrFromModule(Oracle &O, ReducerWorkItem &WorkItem) { 23eea11e73SMatt Arsenault std::vector<Instruction *> InstsToDelete; 24eea11e73SMatt Arsenault 25*23cc36e4SMatt Arsenault Module &Program = WorkItem.getModule(); 26eea11e73SMatt Arsenault const DataLayout &DL = Program.getDataLayout(); 27eea11e73SMatt Arsenault 28eea11e73SMatt Arsenault std::vector<Instruction *> InstToDelete; 29eea11e73SMatt Arsenault for (auto &F : Program) { 30eea11e73SMatt Arsenault for (auto &BB : F) { 31eea11e73SMatt Arsenault for (auto &Inst : BB) { 32eea11e73SMatt Arsenault 33eea11e73SMatt Arsenault SimplifyQuery Q(DL, &Inst); 34eea11e73SMatt Arsenault if (Value *Simplified = simplifyInstruction(&Inst, Q)) { 35ce3c3cb2SArthur Eubanks if (O.shouldKeep()) 36ce3c3cb2SArthur Eubanks continue; 37eea11e73SMatt Arsenault Inst.replaceAllUsesWith(Simplified); 38eea11e73SMatt Arsenault InstToDelete.push_back(&Inst); 39eea11e73SMatt Arsenault } 40eea11e73SMatt Arsenault } 41eea11e73SMatt Arsenault } 42eea11e73SMatt Arsenault } 43eea11e73SMatt Arsenault 44eea11e73SMatt Arsenault for (Instruction *I : InstToDelete) 45eea11e73SMatt Arsenault I->eraseFromParent(); 46eea11e73SMatt Arsenault } 47eea11e73SMatt Arsenault simplifyInstructionsDeltaPass(TestRunner & Test)48eea11e73SMatt Arsenaultvoid llvm::simplifyInstructionsDeltaPass(TestRunner &Test) { 492592ccdeSArthur Eubanks runDeltaPass(Test, extractInstrFromModule, "Simplifying Instructions"); 50eea11e73SMatt Arsenault } 51