Chromium Code Reviews| Index: src/IcePhiLoweringImpl.h |
| diff --git a/src/IcePhiLoweringImpl.h b/src/IcePhiLoweringImpl.h |
| index d6a12b200021d1c36382d347d3b8beec58c2e4bd..c899cc00cc279c603d17cc19161fd5741c9739b6 100644 |
| --- a/src/IcePhiLoweringImpl.h |
| +++ b/src/IcePhiLoweringImpl.h |
| @@ -36,7 +36,8 @@ void prelowerPhis32Bit(TargetT *Target, CfgNode *Node, Cfg *Func) { |
| if (Phi->isDeleted()) |
| continue; |
| Variable *Dest = Phi->getDest(); |
| - if (Dest->getType() == IceType_i64) { |
| + Type DstTy = Dest->getType(); |
|
Jim Stichnoth
2017/01/11 05:23:58
The code base usually names this "DestTy".
jaydeep.patil
2017/01/11 05:45:10
Done.
|
| + if (DstTy == IceType_i64) { |
| auto *DestLo = llvm::cast<Variable>(Target->loOperand(Dest)); |
| auto *DestHi = llvm::cast<Variable>(Target->hiOperand(Dest)); |
| auto *PhiLo = InstPhi::create(Func, Phi->getSrcSize(), DestLo); |
| @@ -51,6 +52,23 @@ void prelowerPhis32Bit(TargetT *Target, CfgNode *Node, Cfg *Func) { |
| Node->getPhis().push_back(PhiLo); |
| Node->getPhis().push_back(PhiHi); |
| Phi->setDeleted(); |
| + } else if (isVectorType(DstTy) && |
| + Target->shouldSplitToVariableVecOn32(DstTy)) { |
| + auto *DstVec = llvm::cast<VariableVecOn32>(Dest); |
| + SizeT Idx = 0; |
| + for (Variable *DestElem : DstVec->getContainers()) { |
| + auto *PhiElem = InstPhi::create(Func, Phi->getSrcSize(), DestElem); |
| + for (SizeT I = 0; I < Phi->getSrcSize(); ++I) { |
| + Operand *Src = Phi->getSrc(I); |
| + CfgNode *Label = Phi->getLabel(I); |
| + Src = Target->legalizeUndef(Src); |
| + auto *SrcVec = llvm::cast<VariableVecOn32>(Src); |
| + PhiElem->addArgument(SrcVec->getContainers()[Idx], Label); |
| + } |
| + ++Idx; |
| + Node->getPhis().push_back(PhiElem); |
| + } |
| + Phi->setDeleted(); |
| } |
| } |
| } |