127902eeaSMatt Arsenault //===- ReduceInstructionFlags.cpp - Specialized Delta Pass ----------------===// 227902eeaSMatt Arsenault // 327902eeaSMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 427902eeaSMatt Arsenault // See https://llvm.org/LICENSE.txt for license information. 527902eeaSMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 627902eeaSMatt Arsenault // 727902eeaSMatt Arsenault //===----------------------------------------------------------------------===// 827902eeaSMatt Arsenault // 927902eeaSMatt Arsenault // Try to remove optimization flags on instructions 1027902eeaSMatt Arsenault // 1127902eeaSMatt Arsenault //===----------------------------------------------------------------------===// 1227902eeaSMatt Arsenault 1327902eeaSMatt Arsenault #include "ReduceInstructionFlags.h" 1427902eeaSMatt Arsenault #include "Delta.h" 1527902eeaSMatt Arsenault #include "llvm/IR/InstIterator.h" 1627902eeaSMatt Arsenault #include "llvm/IR/Instruction.h" 1727902eeaSMatt Arsenault #include "llvm/IR/Instructions.h" 1827902eeaSMatt Arsenault #include "llvm/IR/Operator.h" 1927902eeaSMatt Arsenault 20333ffafbSMatt Arsenault using namespace llvm; 21333ffafbSMatt Arsenault 2223cc36e4SMatt Arsenault static void reduceFlagsInModule(Oracle &O, ReducerWorkItem &WorkItem) { 23b74182edSNikita Popov // Keep this in sync with computeIRComplexityScoreImpl(). 2423cc36e4SMatt Arsenault for (Function &F : WorkItem.getModule()) { 2527902eeaSMatt Arsenault for (Instruction &I : instructions(F)) { 2627902eeaSMatt Arsenault if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(&I)) { 2727902eeaSMatt Arsenault if (OBO->hasNoSignedWrap() && !O.shouldKeep()) 2827902eeaSMatt Arsenault I.setHasNoSignedWrap(false); 2927902eeaSMatt Arsenault if (OBO->hasNoUnsignedWrap() && !O.shouldKeep()) 3027902eeaSMatt Arsenault I.setHasNoUnsignedWrap(false); 31fc9a5076SMatt Arsenault } else if (auto *Trunc = dyn_cast<TruncInst>(&I)) { 32fc9a5076SMatt Arsenault if (Trunc->hasNoSignedWrap() && !O.shouldKeep()) 33fc9a5076SMatt Arsenault Trunc->setHasNoSignedWrap(false); 34fc9a5076SMatt Arsenault if (Trunc->hasNoUnsignedWrap() && !O.shouldKeep()) 35fc9a5076SMatt Arsenault Trunc->setHasNoUnsignedWrap(false); 3627902eeaSMatt Arsenault } else if (auto *PE = dyn_cast<PossiblyExactOperator>(&I)) { 3727902eeaSMatt Arsenault if (PE->isExact() && !O.shouldKeep()) 3827902eeaSMatt Arsenault I.setIsExact(false); 3982d75023SMatt Arsenault } else if (auto *NNI = dyn_cast<PossiblyNonNegInst>(&I)) { 4082d75023SMatt Arsenault if (NNI->hasNonNeg() && !O.shouldKeep()) 4182d75023SMatt Arsenault NNI->setNonNeg(false); 42b2c7cac3SMatt Arsenault } else if (auto *PDI = dyn_cast<PossiblyDisjointInst>(&I)) { 43b2c7cac3SMatt Arsenault if (PDI->isDisjoint() && !O.shouldKeep()) 44b2c7cac3SMatt Arsenault PDI->setIsDisjoint(false); 45*3356eb3bSYingwei Zheng } else if (auto *ICmp = dyn_cast<ICmpInst>(&I)) { 46*3356eb3bSYingwei Zheng if (ICmp->hasSameSign() && !O.shouldKeep()) 47*3356eb3bSYingwei Zheng ICmp->setSameSign(false); 4827902eeaSMatt Arsenault } else if (auto *GEP = dyn_cast<GetElementPtrInst>(&I)) { 498cdecd4dSNikita Popov GEPNoWrapFlags NW = GEP->getNoWrapFlags(); 508cdecd4dSNikita Popov if (NW.isInBounds() && !O.shouldKeep()) 518cdecd4dSNikita Popov NW = NW.withoutInBounds(); 528cdecd4dSNikita Popov if (NW.hasNoUnsignedSignedWrap() && !O.shouldKeep()) 538cdecd4dSNikita Popov NW = NW.withoutNoUnsignedSignedWrap(); 548cdecd4dSNikita Popov if (NW.hasNoUnsignedWrap() && !O.shouldKeep()) 558cdecd4dSNikita Popov NW = NW.withoutNoUnsignedWrap(); 568cdecd4dSNikita Popov GEP->setNoWrapFlags(NW); 5727902eeaSMatt Arsenault } else if (auto *FPOp = dyn_cast<FPMathOperator>(&I)) { 5827902eeaSMatt Arsenault FastMathFlags Flags = FPOp->getFastMathFlags(); 5927902eeaSMatt Arsenault 6027902eeaSMatt Arsenault if (Flags.allowReassoc() && !O.shouldKeep()) 6127902eeaSMatt Arsenault Flags.setAllowReassoc(false); 6227902eeaSMatt Arsenault 6327902eeaSMatt Arsenault if (Flags.noNaNs() && !O.shouldKeep()) 6427902eeaSMatt Arsenault Flags.setNoNaNs(false); 6527902eeaSMatt Arsenault 6627902eeaSMatt Arsenault if (Flags.noInfs() && !O.shouldKeep()) 6727902eeaSMatt Arsenault Flags.setNoInfs(false); 6827902eeaSMatt Arsenault 6927902eeaSMatt Arsenault if (Flags.noSignedZeros() && !O.shouldKeep()) 7027902eeaSMatt Arsenault Flags.setNoSignedZeros(false); 7127902eeaSMatt Arsenault 7227902eeaSMatt Arsenault if (Flags.allowReciprocal() && !O.shouldKeep()) 7327902eeaSMatt Arsenault Flags.setAllowReciprocal(false); 7427902eeaSMatt Arsenault 7527902eeaSMatt Arsenault if (Flags.allowContract() && !O.shouldKeep()) 7627902eeaSMatt Arsenault Flags.setAllowContract(false); 7727902eeaSMatt Arsenault 7827902eeaSMatt Arsenault if (Flags.approxFunc() && !O.shouldKeep()) 7927902eeaSMatt Arsenault Flags.setApproxFunc(false); 8027902eeaSMatt Arsenault 8127902eeaSMatt Arsenault I.copyFastMathFlags(Flags); 8227902eeaSMatt Arsenault } 8327902eeaSMatt Arsenault } 8427902eeaSMatt Arsenault } 8527902eeaSMatt Arsenault } 8627902eeaSMatt Arsenault 8727902eeaSMatt Arsenault void llvm::reduceInstructionFlagsDeltaPass(TestRunner &Test) { 8827902eeaSMatt Arsenault runDeltaPass(Test, reduceFlagsInModule, "Reducing Instruction Flags"); 8927902eeaSMatt Arsenault } 90