@@ -70,7 +70,7 @@ class LegalizationArtifactCombiner {
70
70
// aext(trunc x) - > aext/copy/trunc x
71
71
Register TruncSrc;
72
72
if (mi_match (SrcReg, MRI, m_GTrunc (m_Reg (TruncSrc)))) {
73
- LLVM_DEBUG (dbgs () << " .. Combine MI: " << MI; );
73
+ LLVM_DEBUG (dbgs () << " .. Combine MI: " << MI);
74
74
if (MRI.getType (DstReg) == MRI.getType (TruncSrc))
75
75
replaceRegOrBuildCopy (DstReg, TruncSrc, MRI, Builder, UpdatedDefs,
76
76
Observer);
@@ -136,7 +136,7 @@ class LegalizationArtifactCombiner {
136
136
if (isInstUnsupported ({TargetOpcode::G_AND, {DstTy}}) ||
137
137
isConstantUnsupported (DstTy))
138
138
return false ;
139
- LLVM_DEBUG (dbgs () << " .. Combine MI: " << MI; );
139
+ LLVM_DEBUG (dbgs () << " .. Combine MI: " << MI);
140
140
LLT SrcTy = MRI.getType (SrcReg);
141
141
APInt MaskVal = APInt::getAllOnes (SrcTy.getScalarSizeInBits ());
142
142
if (SextSrc && (DstTy != MRI.getType (SextSrc)))
@@ -207,7 +207,7 @@ class LegalizationArtifactCombiner {
207
207
LLT DstTy = MRI.getType (DstReg);
208
208
if (isInstUnsupported ({TargetOpcode::G_SEXT_INREG, {DstTy}}))
209
209
return false ;
210
- LLVM_DEBUG (dbgs () << " .. Combine MI: " << MI; );
210
+ LLVM_DEBUG (dbgs () << " .. Combine MI: " << MI);
211
211
LLT SrcTy = MRI.getType (SrcReg);
212
212
uint64_t SizeInBits = SrcTy.getScalarSizeInBits ();
213
213
if (DstTy != MRI.getType (TruncSrc))
@@ -356,11 +356,11 @@ class LegalizationArtifactCombiner {
356
356
// trunc(ext x) -> x
357
357
ArtifactValueFinder Finder (MRI, Builder, LI);
358
358
if (Register FoundReg =
359
- Finder.findValueFromDef (DstReg, 0 , DstTy.getSizeInBits ())) {
359
+ Finder.findValueFromDef (DstReg, 0 , DstTy.getSizeInBits (), DstTy )) {
360
360
LLT FoundRegTy = MRI.getType (FoundReg);
361
361
if (DstTy == FoundRegTy) {
362
362
LLVM_DEBUG (dbgs () << " .. Combine G_TRUNC(G_[S,Z,ANY]EXT/G_TRUNC...): "
363
- << MI; );
363
+ << MI);
364
364
365
365
replaceRegOrBuildCopy (DstReg, FoundReg, MRI, Builder, UpdatedDefs,
366
366
Observer);
@@ -392,7 +392,7 @@ class LegalizationArtifactCombiner {
392
392
// G_ANYEXT (G_IMPLICIT_DEF) -> G_IMPLICIT_DEF
393
393
if (!isInstLegal ({TargetOpcode::G_IMPLICIT_DEF, {DstTy}}))
394
394
return false ;
395
- LLVM_DEBUG (dbgs () << " .. Combine G_ANYEXT(G_IMPLICIT_DEF): " << MI; );
395
+ LLVM_DEBUG (dbgs () << " .. Combine G_ANYEXT(G_IMPLICIT_DEF): " << MI);
396
396
auto Impl = Builder.buildUndef (DstTy);
397
397
replaceRegOrBuildCopy (DstReg, Impl.getReg (0 ), MRI, Builder, UpdatedDefs,
398
398
Observer);
@@ -402,7 +402,7 @@ class LegalizationArtifactCombiner {
402
402
// bits will be 0 for G_ZEXT and 0/1 for the G_SEXT.
403
403
if (isConstantUnsupported (DstTy))
404
404
return false ;
405
- LLVM_DEBUG (dbgs () << " .. Combine G_[SZ]EXT(G_IMPLICIT_DEF): " << MI; );
405
+ LLVM_DEBUG (dbgs () << " .. Combine G_[SZ]EXT(G_IMPLICIT_DEF): " << MI);
406
406
auto Cnst = Builder.buildConstant (DstTy, 0 );
407
407
replaceRegOrBuildCopy (DstReg, Cnst.getReg (0 ), MRI, Builder, UpdatedDefs,
408
408
Observer);
@@ -641,10 +641,11 @@ class LegalizationArtifactCombiner {
641
641
Register SrcReg = Concat.getReg (StartSrcIdx);
642
642
if (InRegOffset == 0 && Size == SrcSize) {
643
643
CurrentBest = SrcReg;
644
- return findValueFromDefImpl (SrcReg, 0 , Size);
644
+ return findValueFromDefImpl (SrcReg, 0 , Size, MRI. getType (SrcReg) );
645
645
}
646
646
647
- return findValueFromDefImpl (SrcReg, InRegOffset, Size);
647
+ return findValueFromDefImpl (SrcReg, InRegOffset, Size,
648
+ MRI.getType (SrcReg));
648
649
}
649
650
650
651
// / Given an build_vector op \p BV and a start bit and size, try to find
@@ -759,15 +760,17 @@ class LegalizationArtifactCombiner {
759
760
if (EndBit <= InsertOffset || InsertedEndBit <= StartBit) {
760
761
SrcRegToUse = ContainerSrcReg;
761
762
NewStartBit = StartBit;
762
- return findValueFromDefImpl (SrcRegToUse, NewStartBit, Size);
763
+ return findValueFromDefImpl (SrcRegToUse, NewStartBit, Size,
764
+ MRI.getType (SrcRegToUse));
763
765
}
764
766
if (InsertOffset <= StartBit && EndBit <= InsertedEndBit) {
765
767
SrcRegToUse = InsertedReg;
766
768
NewStartBit = StartBit - InsertOffset;
767
769
if (NewStartBit == 0 &&
768
770
Size == MRI.getType (SrcRegToUse).getSizeInBits ())
769
771
CurrentBest = SrcRegToUse;
770
- return findValueFromDefImpl (SrcRegToUse, NewStartBit, Size);
772
+ return findValueFromDefImpl (SrcRegToUse, NewStartBit, Size,
773
+ MRI.getType (SrcRegToUse));
771
774
}
772
775
// The bit range spans both the inserted and container regions.
773
776
return Register ();
@@ -799,7 +802,7 @@ class LegalizationArtifactCombiner {
799
802
800
803
if (StartBit == 0 && SrcType.getSizeInBits () == Size)
801
804
CurrentBest = SrcReg;
802
- return findValueFromDefImpl (SrcReg, StartBit, Size);
805
+ return findValueFromDefImpl (SrcReg, StartBit, Size, SrcType );
803
806
}
804
807
805
808
// / Given an G_TRUNC op \p MI and a start bit and size, try to find
@@ -819,14 +822,14 @@ class LegalizationArtifactCombiner {
819
822
if (!SrcType.isScalar ())
820
823
return CurrentBest;
821
824
822
- return findValueFromDefImpl (SrcReg, StartBit, Size);
825
+ return findValueFromDefImpl (SrcReg, StartBit, Size, SrcType );
823
826
}
824
827
825
828
// / Internal implementation for findValueFromDef(). findValueFromDef()
826
829
// / initializes some data like the CurrentBest register, which this method
827
830
// / and its callees rely upon.
828
831
Register findValueFromDefImpl (Register DefReg, unsigned StartBit,
829
- unsigned Size) {
832
+ unsigned Size, LLT DstTy ) {
830
833
std::optional<DefinitionAndSourceRegister> DefSrcReg =
831
834
getDefSrcRegIgnoringCopies (DefReg, MRI);
832
835
MachineInstr *Def = DefSrcReg->MI ;
@@ -847,7 +850,7 @@ class LegalizationArtifactCombiner {
847
850
}
848
851
Register SrcReg = Def->getOperand (Def->getNumOperands () - 1 ).getReg ();
849
852
Register SrcOriginReg =
850
- findValueFromDefImpl (SrcReg, StartBit + DefStartBit, Size);
853
+ findValueFromDefImpl (SrcReg, StartBit + DefStartBit, Size, DstTy );
851
854
if (SrcOriginReg)
852
855
return SrcOriginReg;
853
856
// Failed to find a further value. If the StartBit and Size perfectly
@@ -868,6 +871,12 @@ class LegalizationArtifactCombiner {
868
871
case TargetOpcode::G_ZEXT:
869
872
case TargetOpcode::G_ANYEXT:
870
873
return findValueFromExt (*Def, StartBit, Size);
874
+ case TargetOpcode::G_IMPLICIT_DEF: {
875
+ if (MRI.getType (DefReg) == DstTy)
876
+ return DefReg;
877
+ MIB.setInstrAndDebugLoc (*Def);
878
+ return MIB.buildUndef (DstTy).getReg (0 );
879
+ }
871
880
default :
872
881
return CurrentBest;
873
882
}
@@ -882,10 +891,10 @@ class LegalizationArtifactCombiner {
882
891
// / at position \p StartBit with size \p Size.
883
892
// / \returns a register with the requested size, or an empty Register if no
884
893
// / better value could be found.
885
- Register findValueFromDef (Register DefReg, unsigned StartBit,
886
- unsigned Size ) {
894
+ Register findValueFromDef (Register DefReg, unsigned StartBit, unsigned Size,
895
+ LLT DstTy ) {
887
896
CurrentBest = Register ();
888
- Register FoundReg = findValueFromDefImpl (DefReg, StartBit, Size);
897
+ Register FoundReg = findValueFromDefImpl (DefReg, StartBit, Size, DstTy );
889
898
return FoundReg != DefReg ? FoundReg : Register ();
890
899
}
891
900
@@ -904,7 +913,8 @@ class LegalizationArtifactCombiner {
904
913
DeadDefs[DefIdx] = true ;
905
914
continue ;
906
915
}
907
- Register FoundVal = findValueFromDef (DefReg, 0 , DestTy.getSizeInBits ());
916
+ Register FoundVal =
917
+ findValueFromDef (DefReg, 0 , DestTy.getSizeInBits (), DestTy);
908
918
if (!FoundVal)
909
919
continue ;
910
920
if (MRI.getType (FoundVal) != DestTy)
@@ -923,7 +933,7 @@ class LegalizationArtifactCombiner {
923
933
924
934
GUnmerge *findUnmergeThatDefinesReg (Register Reg, unsigned Size,
925
935
unsigned &DefOperandIdx) {
926
- if (Register Def = findValueFromDefImpl (Reg, 0 , Size)) {
936
+ if (Register Def = findValueFromDefImpl (Reg, 0 , Size, MRI. getType (Reg) )) {
927
937
if (auto *Unmerge = dyn_cast<GUnmerge>(MRI.getVRegDef (Def))) {
928
938
DefOperandIdx =
929
939
Unmerge->findRegisterDefOperandIdx (Def, /* TRI=*/ nullptr );
@@ -1074,17 +1084,6 @@ class LegalizationArtifactCombiner {
1074
1084
1075
1085
Builder.setInstrAndDebugLoc (MI);
1076
1086
1077
- if (SrcDef->getOpcode () == TargetOpcode::G_IMPLICIT_DEF) {
1078
- auto Undef = Builder.buildUndef (DestTy);
1079
- for (unsigned I = 0 ; I != NumDefs; ++I) {
1080
- Register Def = MI.getReg (I);
1081
- replaceRegOrBuildCopy (Def, Undef.getReg (0 ), MRI, Builder, UpdatedDefs,
1082
- Observer);
1083
- }
1084
- markInstAndDefDead (MI, *SrcDef, DeadInsts, SrcDefIdx);
1085
- return true ;
1086
- }
1087
-
1088
1087
ArtifactValueFinder Finder (MRI, Builder, LI);
1089
1088
if (Finder.tryCombineUnmergeDefs (MI, Observer, UpdatedDefs)) {
1090
1089
markInstAndDefDead (MI, *SrcDef, DeadInsts, SrcDefIdx);
@@ -1294,12 +1293,19 @@ class LegalizationArtifactCombiner {
1294
1293
// for N >= %2.getSizeInBits() / 2
1295
1294
// %3 = G_EXTRACT %1, (N - %0.getSizeInBits()
1296
1295
1296
+ Register DstReg = MI.getOperand (0 ).getReg ();
1297
1297
Register SrcReg = lookThroughCopyInstrs (MI.getOperand (1 ).getReg ());
1298
1298
MachineInstr *MergeI = MRI.getVRegDef (SrcReg);
1299
+ if (MergeI && MergeI->getOpcode () == TargetOpcode::G_IMPLICIT_DEF) {
1300
+ Builder.setInstrAndDebugLoc (MI);
1301
+ Builder.buildUndef (DstReg);
1302
+ UpdatedDefs.push_back (DstReg);
1303
+ markInstAndDefDead (MI, *MergeI, DeadInsts);
1304
+ return true ;
1305
+ }
1299
1306
if (!MergeI || !isa<GMergeLikeInstr>(MergeI))
1300
1307
return false ;
1301
1308
1302
- Register DstReg = MI.getOperand (0 ).getReg ();
1303
1309
LLT DstTy = MRI.getType (DstReg);
1304
1310
LLT SrcTy = MRI.getType (SrcReg);
1305
1311
0 commit comments