@@ -223,6 +223,14 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
223
223
}
224
224
break ;
225
225
}
226
+ case TargetOpcode::G_SPLAT_VECTOR: {
227
+ computeKnownBitsImpl (MI.getOperand (1 ).getReg (), Known, APInt (1 , 1 ),
228
+ Depth + 1 );
229
+ // Implicitly truncate the bits to match the official semantics of
230
+ // G_SPLAT_VECTOR.
231
+ Known = Known.trunc (BitWidth);
232
+ break ;
233
+ }
226
234
case TargetOpcode::COPY:
227
235
case TargetOpcode::G_PHI:
228
236
case TargetOpcode::PHI: {
@@ -904,6 +912,15 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
904
912
}
905
913
break ;
906
914
}
915
+ case TargetOpcode::G_SPLAT_VECTOR: {
916
+ // Check if the sign bits of source go down as far as the truncated value.
917
+ Register Src = MI.getOperand (1 ).getReg ();
918
+ unsigned NumSrcSignBits = computeNumSignBits (Src, APInt (1 , 1 ), Depth + 1 );
919
+ unsigned NumSrcBits = MRI.getType (Src).getSizeInBits ();
920
+ if (NumSrcSignBits > (NumSrcBits - TyBits))
921
+ return NumSrcSignBits - (NumSrcBits - TyBits);
922
+ break ;
923
+ }
907
924
case TargetOpcode::G_INTRINSIC:
908
925
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
909
926
case TargetOpcode::G_INTRINSIC_CONVERGENT:
@@ -939,7 +956,7 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
939
956
unsigned GISelValueTracking::computeNumSignBits (Register R, unsigned Depth) {
940
957
LLT Ty = MRI.getType (R);
941
958
APInt DemandedElts =
942
- Ty.isVector () ? APInt::getAllOnes (Ty.getNumElements ()) : APInt (1 , 1 );
959
+ Ty.isFixedVector () ? APInt::getAllOnes (Ty.getNumElements ()) : APInt (1 , 1 );
943
960
return computeNumSignBits (R, DemandedElts, Depth);
944
961
}
945
962
0 commit comments