@@ -878,6 +878,9 @@ NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM,
878
878
// i64 = or (i64 = zero_extend X, i64 = shl (i64 = any_extend Y, 32))
879
879
// -> i64 = build_pair (X, Y)
880
880
setTargetDAGCombine (ISD::OR);
881
+ // i32 = truncate (i64 = srl (i64 = build_pair (X, Y), 32))
882
+ // -> i32 Y
883
+ setTargetDAGCombine (ISD::TRUNCATE);
881
884
}
882
885
883
886
// These map to conversion instructions for scalar FP types.
@@ -5297,6 +5300,28 @@ static SDValue PerformORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
5297
5300
return SDValue ();
5298
5301
}
5299
5302
5303
+ static SDValue PerformTRUNCATECombine (SDNode *N,
5304
+ TargetLowering::DAGCombinerInfo &DCI,
5305
+ CodeGenOptLevel OptLevel) {
5306
+ if (OptLevel == CodeGenOptLevel::None)
5307
+ return SDValue ();
5308
+
5309
+ SDValue Op = N->getOperand (0 );
5310
+ if (Op.getOpcode () == ISD::SRL) {
5311
+ SDValue SrlOp = Op.getOperand (0 );
5312
+ SDValue SrlSh = Op.getOperand (1 );
5313
+ // i32 = truncate (i64 = srl (i64 build_pair (A, B), 32))
5314
+ // -> i32 A
5315
+ if (const auto *Const = dyn_cast<ConstantSDNode>(SrlSh);
5316
+ Const && Const->getZExtValue () == 32 ) {
5317
+ if (SrlOp.getOpcode () == ISD::BUILD_PAIR)
5318
+ return SrlOp.getOperand (1 );
5319
+ }
5320
+ }
5321
+
5322
+ return SDValue ();
5323
+ }
5324
+
5300
5325
SDValue NVPTXTargetLowering::PerformDAGCombine (SDNode *N,
5301
5326
DAGCombinerInfo &DCI) const {
5302
5327
CodeGenOptLevel OptLevel = getTargetMachine ().getOptLevel ();
@@ -5333,6 +5358,8 @@ SDValue NVPTXTargetLowering::PerformDAGCombine(SDNode *N,
5333
5358
return PerformBUILD_VECTORCombine (N, DCI);
5334
5359
case ISD::OR:
5335
5360
return PerformORCombine (N, DCI, OptLevel);
5361
+ case ISD::TRUNCATE:
5362
+ return PerformTRUNCATECombine (N, DCI, OptLevel);
5336
5363
}
5337
5364
return SDValue ();
5338
5365
}
0 commit comments