@@ -1436,7 +1436,9 @@ static void changeVectorFPCCToAArch64CC(ISD::CondCode CC,
1436
1436
1437
1437
static bool isLegalArithImmed (uint64_t C) {
1438
1438
// Matches AArch64DAGToDAGISel::SelectArithImmed().
1439
- return (C >> 12 == 0 ) || ((C & 0xFFFULL ) == 0 && C >> 24 == 0 );
1439
+ bool IsLegal = (C >> 12 == 0 ) || ((C & 0xFFFULL ) == 0 && C >> 24 == 0 );
1440
+ DEBUG (dbgs () << " Is imm " << C << " legal: " << (IsLegal ? " yes\n " : " no\n " ));
1441
+ return IsLegal;
1440
1442
}
1441
1443
1442
1444
static SDValue emitComparison (SDValue LHS, SDValue RHS, ISD::CondCode CC,
@@ -2546,6 +2548,9 @@ SDValue AArch64TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
2546
2548
2547
2549
SDValue AArch64TargetLowering::LowerOperation (SDValue Op,
2548
2550
SelectionDAG &DAG) const {
2551
+ DEBUG (dbgs () << " Custom lowering: " );
2552
+ DEBUG (Op.dump ());
2553
+
2549
2554
switch (Op.getOpcode ()) {
2550
2555
default :
2551
2556
llvm_unreachable (" unimplemented operand" );
@@ -4880,22 +4885,46 @@ SDValue AArch64TargetLowering::LowerShiftLeftParts(SDValue Op,
4880
4885
4881
4886
bool AArch64TargetLowering::isOffsetFoldingLegal (
4882
4887
const GlobalAddressSDNode *GA) const {
4883
- // The AArch64 target doesn't support folding offsets into global addresses.
4888
+ DEBUG (dbgs () << " Skipping offset folding global address: " );
4889
+ DEBUG (GA->dump ());
4890
+ DEBUG (dbgs () << " AArch64 doesn't support folding offsets into global "
4891
+ " addresses\n " );
4884
4892
return false ;
4885
4893
}
4886
4894
4887
4895
bool AArch64TargetLowering::isFPImmLegal (const APFloat &Imm, EVT VT) const {
4888
4896
// We can materialize #0.0 as fmov $Rd, XZR for 64-bit and 32-bit cases.
4889
4897
// FIXME: We should be able to handle f128 as well with a clever lowering.
4890
- if (Imm.isPosZero () && (VT == MVT::f64 || VT == MVT::f32))
4898
+ if (Imm.isPosZero () && (VT == MVT::f64 || VT == MVT::f32)) {
4899
+ DEBUG (dbgs () << " Legal fp imm: materialize 0 using the zero register\n " );
4891
4900
return true ;
4901
+ }
4902
+
4903
+ StringRef FPType;
4904
+ bool IsLegal = false ;
4905
+ const StringRef Msg = " Is legal " ;
4906
+
4907
+ if (VT == MVT::f64) {
4908
+ FPType = " f64" ;
4909
+ IsLegal = AArch64_AM::getFP64Imm (Imm) != -1 ;
4910
+ } else if (VT == MVT::f32) {
4911
+ FPType = " f32" ;
4912
+ IsLegal = AArch64_AM::getFP32Imm (Imm) != -1 ;
4913
+ } else if (VT == MVT::f16 && Subtarget->hasFullFP16 ()) {
4914
+ FPType = " f16" ;
4915
+ IsLegal = AArch64_AM::getFP16Imm (Imm) != -1 ;
4916
+ }
4917
+
4918
+ if (IsLegal) {
4919
+ DEBUG (dbgs () << Msg << FPType << " imm value: yes\n " );
4920
+ return true ;
4921
+ }
4922
+
4923
+ if (!FPType.empty ())
4924
+ DEBUG (dbgs () << Msg << FPType << " imm value: no\n " );
4925
+ else
4926
+ DEBUG (dbgs () << Msg << " fp imm: no, unsupported fp type\n " );
4892
4927
4893
- if (VT == MVT::f64)
4894
- return AArch64_AM::getFP64Imm (Imm) != -1 ;
4895
- else if (VT == MVT::f32)
4896
- return AArch64_AM::getFP32Imm (Imm) != -1 ;
4897
- else if (VT == MVT::f16 && Subtarget->hasFullFP16 ())
4898
- return AArch64_AM::getFP16Imm (Imm) != -1 ;
4899
4928
return false ;
4900
4929
}
4901
4930
@@ -7835,12 +7864,17 @@ EVT AArch64TargetLowering::getOptimalMemOpType(uint64_t Size, unsigned DstAlign,
7835
7864
7836
7865
// 12-bit optionally shifted immediates are legal for adds.
7837
7866
bool AArch64TargetLowering::isLegalAddImmediate (int64_t Immed) const {
7838
- // Avoid UB for INT64_MIN.
7839
- if ( Immed == std::numeric_limits< int64_t >:: min ())
7867
+ if (Immed == std::numeric_limits< int64_t >:: min ()) {
7868
+ DEBUG ( dbgs () << " Illegal add imm " << Immed << " : avoid UB for INT64_MIN \n " );
7840
7869
return false ;
7870
+ }
7841
7871
// Same encoding for add/sub, just flip the sign.
7842
7872
Immed = std::abs (Immed);
7843
- return ((Immed >> 12 ) == 0 || ((Immed & 0xfff ) == 0 && Immed >> 24 == 0 ));
7873
+ bool IsLegal = ((Immed >> 12 ) == 0 ||
7874
+ ((Immed & 0xfff ) == 0 && Immed >> 24 == 0 ));
7875
+ DEBUG (dbgs () << " Is " << Immed << " legal add imm: " <<
7876
+ (IsLegal ? " yes" : " no" ) << " \n " );
7877
+ return IsLegal;
7844
7878
}
7845
7879
7846
7880
// Integer comparisons are implemented with ADDS/SUBS, so the range of valid
@@ -10290,6 +10324,7 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
10290
10324
SelectionDAG &DAG = DCI.DAG ;
10291
10325
switch (N->getOpcode ()) {
10292
10326
default :
10327
+ DEBUG (dbgs () << " Custom combining: skipping\n " );
10293
10328
break ;
10294
10329
case ISD::ADD:
10295
10330
case ISD::SUB:
0 commit comments