xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IcePhiLoweringImpl.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===------ subzero/src/IcePhiLoweringImpl.h - Phi lowering -----*- C++ -*-===//
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker //                        The Subzero Code Generator
4*03ce13f7SAndroid Build Coastguard Worker //
5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker ///
10*03ce13f7SAndroid Build Coastguard Worker /// \file
11*03ce13f7SAndroid Build Coastguard Worker /// \brief Utilities for targets to lower Phis.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEPHILOWERINGIMPL_H
16*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEPHILOWERINGIMPL_H
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "IceCfg.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceCfgNode.h"
20*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
21*03ce13f7SAndroid Build Coastguard Worker #include "IceInst.h"
22*03ce13f7SAndroid Build Coastguard Worker #include "IceOperand.h"
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
25*03ce13f7SAndroid Build Coastguard Worker namespace PhiLowering {
26*03ce13f7SAndroid Build Coastguard Worker 
27*03ce13f7SAndroid Build Coastguard Worker /// Turn an i64 Phi instruction into a pair of i32 Phi instructions, to preserve
28*03ce13f7SAndroid Build Coastguard Worker /// integrity of liveness analysis. This is needed for 32-bit targets. This
29*03ce13f7SAndroid Build Coastguard Worker /// assumes the 32-bit target has loOperand, hiOperand, and legalizeUndef
30*03ce13f7SAndroid Build Coastguard Worker /// methods. Undef values are also legalized, since loOperand() and hiOperand()
31*03ce13f7SAndroid Build Coastguard Worker /// don't expect Undef input.
32*03ce13f7SAndroid Build Coastguard Worker template <class TargetT>
prelowerPhis32Bit(TargetT * Target,CfgNode * Node,Cfg * Func)33*03ce13f7SAndroid Build Coastguard Worker void prelowerPhis32Bit(TargetT *Target, CfgNode *Node, Cfg *Func) {
34*03ce13f7SAndroid Build Coastguard Worker   for (Inst &I : Node->getPhis()) {
35*03ce13f7SAndroid Build Coastguard Worker     auto *Phi = llvm::dyn_cast<InstPhi>(&I);
36*03ce13f7SAndroid Build Coastguard Worker     if (Phi->isDeleted())
37*03ce13f7SAndroid Build Coastguard Worker       continue;
38*03ce13f7SAndroid Build Coastguard Worker     Variable *Dest = Phi->getDest();
39*03ce13f7SAndroid Build Coastguard Worker     Type DestTy = Dest->getType();
40*03ce13f7SAndroid Build Coastguard Worker     if (DestTy == IceType_i64) {
41*03ce13f7SAndroid Build Coastguard Worker       auto *DestLo = llvm::cast<Variable>(Target->loOperand(Dest));
42*03ce13f7SAndroid Build Coastguard Worker       auto *DestHi = llvm::cast<Variable>(Target->hiOperand(Dest));
43*03ce13f7SAndroid Build Coastguard Worker       auto *PhiLo = InstPhi::create(Func, Phi->getSrcSize(), DestLo);
44*03ce13f7SAndroid Build Coastguard Worker       auto *PhiHi = InstPhi::create(Func, Phi->getSrcSize(), DestHi);
45*03ce13f7SAndroid Build Coastguard Worker       for (SizeT I = 0; I < Phi->getSrcSize(); ++I) {
46*03ce13f7SAndroid Build Coastguard Worker         Operand *Src = Phi->getSrc(I);
47*03ce13f7SAndroid Build Coastguard Worker         CfgNode *Label = Phi->getLabel(I);
48*03ce13f7SAndroid Build Coastguard Worker         Src = Target->legalizeUndef(Src);
49*03ce13f7SAndroid Build Coastguard Worker         PhiLo->addArgument(Target->loOperand(Src), Label);
50*03ce13f7SAndroid Build Coastguard Worker         PhiHi->addArgument(Target->hiOperand(Src), Label);
51*03ce13f7SAndroid Build Coastguard Worker       }
52*03ce13f7SAndroid Build Coastguard Worker       Node->getPhis().push_back(PhiLo);
53*03ce13f7SAndroid Build Coastguard Worker       Node->getPhis().push_back(PhiHi);
54*03ce13f7SAndroid Build Coastguard Worker       Phi->setDeleted();
55*03ce13f7SAndroid Build Coastguard Worker     } else if (isVectorType(DestTy) &&
56*03ce13f7SAndroid Build Coastguard Worker                Target->shouldSplitToVariableVecOn32(DestTy)) {
57*03ce13f7SAndroid Build Coastguard Worker       auto *DstVec = llvm::cast<VariableVecOn32>(Dest);
58*03ce13f7SAndroid Build Coastguard Worker       SizeT Idx = 0;
59*03ce13f7SAndroid Build Coastguard Worker       for (Variable *DestElem : DstVec->getContainers()) {
60*03ce13f7SAndroid Build Coastguard Worker         auto *PhiElem = InstPhi::create(Func, Phi->getSrcSize(), DestElem);
61*03ce13f7SAndroid Build Coastguard Worker         for (SizeT I = 0; I < Phi->getSrcSize(); ++I) {
62*03ce13f7SAndroid Build Coastguard Worker           Operand *Src = Phi->getSrc(I);
63*03ce13f7SAndroid Build Coastguard Worker           CfgNode *Label = Phi->getLabel(I);
64*03ce13f7SAndroid Build Coastguard Worker           Src = Target->legalizeUndef(Src);
65*03ce13f7SAndroid Build Coastguard Worker           auto *SrcVec = llvm::cast<VariableVecOn32>(Src);
66*03ce13f7SAndroid Build Coastguard Worker           PhiElem->addArgument(SrcVec->getContainers()[Idx], Label);
67*03ce13f7SAndroid Build Coastguard Worker         }
68*03ce13f7SAndroid Build Coastguard Worker         ++Idx;
69*03ce13f7SAndroid Build Coastguard Worker         Node->getPhis().push_back(PhiElem);
70*03ce13f7SAndroid Build Coastguard Worker       }
71*03ce13f7SAndroid Build Coastguard Worker       Phi->setDeleted();
72*03ce13f7SAndroid Build Coastguard Worker     }
73*03ce13f7SAndroid Build Coastguard Worker   }
74*03ce13f7SAndroid Build Coastguard Worker }
75*03ce13f7SAndroid Build Coastguard Worker 
76*03ce13f7SAndroid Build Coastguard Worker } // end of namespace PhiLowering
77*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
78*03ce13f7SAndroid Build Coastguard Worker 
79*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEPHILOWERINGIMPL_H
80