@@ -37,26 +37,6 @@ insertUndefLaneMask(MachineBasicBlock *MBB, MachineRegisterInfo *MRI,
37
37
38
38
namespace {
39
39
40
- class SILowerI1Copies : public MachineFunctionPass {
41
- public:
42
- static char ID;
43
-
44
- SILowerI1Copies () : MachineFunctionPass(ID) {
45
- initializeSILowerI1CopiesPass (*PassRegistry::getPassRegistry ());
46
- }
47
-
48
- bool runOnMachineFunction (MachineFunction &MF) override ;
49
-
50
- StringRef getPassName () const override { return " SI Lower i1 Copies" ; }
51
-
52
- void getAnalysisUsage (AnalysisUsage &AU) const override {
53
- AU.setPreservesCFG ();
54
- AU.addRequired <MachineDominatorTreeWrapperPass>();
55
- AU.addRequired <MachinePostDominatorTreeWrapperPass>();
56
- MachineFunctionPass::getAnalysisUsage (AU);
57
- }
58
- };
59
-
60
40
class Vreg1LoweringHelper : public PhiLoweringHelper {
61
41
public:
62
42
Vreg1LoweringHelper (MachineFunction *MF, MachineDominatorTree *DT,
@@ -397,21 +377,6 @@ class LoopFinder {
397
377
398
378
} // End anonymous namespace.
399
379
400
- INITIALIZE_PASS_BEGIN (SILowerI1Copies, DEBUG_TYPE, " SI Lower i1 Copies" , false ,
401
- false )
402
- INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
403
- INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
404
- INITIALIZE_PASS_END(SILowerI1Copies, DEBUG_TYPE, " SI Lower i1 Copies" , false ,
405
- false )
406
-
407
- char SILowerI1Copies::ID = 0;
408
-
409
- char &llvm::SILowerI1CopiesID = SILowerI1Copies::ID;
410
-
411
- FunctionPass *llvm::createSILowerI1CopiesPass () {
412
- return new SILowerI1Copies ();
413
- }
414
-
415
380
Register
416
381
llvm::createLaneMaskReg (MachineRegisterInfo *MRI,
417
382
MachineRegisterInfo::VRegAttrs LaneMaskRegAttrs) {
@@ -430,32 +395,6 @@ insertUndefLaneMask(MachineBasicBlock *MBB, MachineRegisterInfo *MRI,
430
395
return UndefReg;
431
396
}
432
397
433
- // / Lower all instructions that def or use vreg_1 registers.
434
- // /
435
- // / In a first pass, we lower COPYs from vreg_1 to vector registers, as can
436
- // / occur around inline assembly. We do this first, before vreg_1 registers
437
- // / are changed to scalar mask registers.
438
- // /
439
- // / Then we lower all defs of vreg_1 registers. Phi nodes are lowered before
440
- // / all others, because phi lowering looks through copies and can therefore
441
- // / often make copy lowering unnecessary.
442
- bool SILowerI1Copies::runOnMachineFunction (MachineFunction &TheMF) {
443
- // Only need to run this in SelectionDAG path.
444
- if (TheMF.getProperties ().hasProperty (
445
- MachineFunctionProperties::Property::Selected))
446
- return false ;
447
-
448
- Vreg1LoweringHelper Helper (
449
- &TheMF, &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree (),
450
- &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ());
451
-
452
- bool Changed = false ;
453
- Changed |= Helper.lowerCopiesFromI1 ();
454
- Changed |= Helper.lowerPhis ();
455
- Changed |= Helper.lowerCopiesToI1 ();
456
- return Helper.cleanConstrainRegs (Changed);
457
- }
458
-
459
398
#ifndef NDEBUG
460
399
static bool isVRegCompatibleReg (const SIRegisterInfo &TRI,
461
400
const MachineRegisterInfo &MRI,
@@ -915,3 +854,86 @@ void Vreg1LoweringHelper::buildMergeLaneMasks(MachineBasicBlock &MBB,
915
854
}
916
855
917
856
void Vreg1LoweringHelper::constrainAsLaneMask (Incoming &In) {}
857
+
858
+ // / Lower all instructions that def or use vreg_1 registers.
859
+ // /
860
+ // / In a first pass, we lower COPYs from vreg_1 to vector registers, as can
861
+ // / occur around inline assembly. We do this first, before vreg_1 registers
862
+ // / are changed to scalar mask registers.
863
+ // /
864
+ // / Then we lower all defs of vreg_1 registers. Phi nodes are lowered before
865
+ // / all others, because phi lowering looks through copies and can therefore
866
+ // / often make copy lowering unnecessary.
867
+ static bool runFixI1Copies (MachineFunction &MF, MachineDominatorTree &MDT,
868
+ MachinePostDominatorTree &MPDT) {
869
+ // Only need to run this in SelectionDAG path.
870
+ if (MF.getProperties ().hasProperty (
871
+ MachineFunctionProperties::Property::Selected))
872
+ return false ;
873
+
874
+ Vreg1LoweringHelper Helper (&MF, &MDT, &MPDT);
875
+ bool Changed = false ;
876
+ Changed |= Helper.lowerCopiesFromI1 ();
877
+ Changed |= Helper.lowerPhis ();
878
+ Changed |= Helper.lowerCopiesToI1 ();
879
+ return Helper.cleanConstrainRegs (Changed);
880
+ }
881
+
882
+ PreservedAnalyses
883
+ SILowerI1CopiesPass::run (MachineFunction &MF,
884
+ MachineFunctionAnalysisManager &MFAM) {
885
+ MachineDominatorTree &MDT = MFAM.getResult <MachineDominatorTreeAnalysis>(MF);
886
+ MachinePostDominatorTree &MPDT =
887
+ MFAM.getResult <MachinePostDominatorTreeAnalysis>(MF);
888
+ bool Changed = runFixI1Copies (MF, MDT, MPDT);
889
+ if (!Changed)
890
+ return PreservedAnalyses::all ();
891
+
892
+ // TODO: Probably preserves most.
893
+ PreservedAnalyses PA;
894
+ PA.preserveSet <CFGAnalyses>();
895
+ return PA;
896
+ }
897
+
898
+ class SILowerI1CopiesLegacy : public MachineFunctionPass {
899
+ public:
900
+ static char ID;
901
+
902
+ SILowerI1CopiesLegacy () : MachineFunctionPass(ID) {
903
+ initializeSILowerI1CopiesLegacyPass (*PassRegistry::getPassRegistry ());
904
+ }
905
+
906
+ bool runOnMachineFunction (MachineFunction &MF) override ;
907
+
908
+ StringRef getPassName () const override { return " SI Lower i1 Copies" ; }
909
+
910
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
911
+ AU.setPreservesCFG ();
912
+ AU.addRequired <MachineDominatorTreeWrapperPass>();
913
+ AU.addRequired <MachinePostDominatorTreeWrapperPass>();
914
+ MachineFunctionPass::getAnalysisUsage (AU);
915
+ }
916
+ };
917
+
918
+ bool SILowerI1CopiesLegacy::runOnMachineFunction (MachineFunction &MF) {
919
+ MachineDominatorTree &MDT =
920
+ getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
921
+ MachinePostDominatorTree &MPDT =
922
+ getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree ();
923
+ return runFixI1Copies (MF, MDT, MPDT);
924
+ }
925
+
926
+ INITIALIZE_PASS_BEGIN (SILowerI1CopiesLegacy, DEBUG_TYPE, " SI Lower i1 Copies" ,
927
+ false , false )
928
+ INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
929
+ INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
930
+ INITIALIZE_PASS_END(SILowerI1CopiesLegacy, DEBUG_TYPE, " SI Lower i1 Copies" ,
931
+ false , false )
932
+
933
+ char SILowerI1CopiesLegacy::ID = 0;
934
+
935
+ char &llvm::SILowerI1CopiesLegacyID = SILowerI1CopiesLegacy::ID;
936
+
937
+ FunctionPass *llvm::createSILowerI1CopiesLegacyPass () {
938
+ return new SILowerI1CopiesLegacy ();
939
+ }
0 commit comments