//===- PPCBoolRetToInt.cpp ------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // This file implements converting i1 values to i32/i64 if they could be more // profitably allocated as GPRs rather than CRs. This pass will become totally // unnecessary if Register Bank Allocation and Global Instruction Selection ever // go upstream. // // Presently, the pass converts i1 Constants, and Arguments to i32/i64 if the // transitive closure of their uses includes only PHINodes, CallInsts, and // ReturnInsts. The rational is that arguments are generally passed and returned // in GPRs rather than CRs, so casting them to i32/i64 at the LLVM IR level will // actually save casts at the Machine Instruction level. // // It might be useful to expand this pass to add bit-wise operations to the list // of safe transitive closure types. Also, we miss some opportunities when LLVM // represents logical AND and OR operations with control flow rather than data // flow. For example by lowering the expression: return (A && B && C) // // as: return A ? true : B && C. // // There's code in SimplifyCFG that code be used to turn control flow in data // flow using SelectInsts. Selects are slow on some architectures (P7/P8), so // this probably isn't good in general, but for the special case of i1, the // Selects could be further lowered to bit operations that are fast everywhere. // //===----------------------------------------------------------------------===// #include "PPC.h" #include "PPCTargetMachine.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/IR/Argument.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/OperandTraits.h" #include "llvm/IR/Type.h" #include "llvm/IR/Use.h" #include "llvm/IR/User.h" #include "llvm/IR/Value.h" #include "llvm/Pass.h" #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/Support/Casting.h" #include <cassert> usingnamespacellvm; namespace … // end anonymous namespace char PPCBoolRetToInt::ID = …; INITIALIZE_PASS(…) FunctionPass *llvm::createPPCBoolRetToIntPass() { … }