36
36
#include "llvm/ADT/StringRef.h"
37
37
#include "llvm/CodeGen/CallingConvLower.h"
38
38
#include "llvm/CodeGen/ISDOpcodes.h"
39
- #include "llvm/CodeGen/LivePhysRegs.h"
40
39
#include "llvm/CodeGen/MachineBasicBlock.h"
41
40
#include "llvm/CodeGen/MachineFrameInfo.h"
42
41
#include "llvm/CodeGen/MachineFunction.h"
@@ -198,11 +197,6 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
198
197
}
199
198
200
199
setOperationAction(ISD::UADDO, RegVT, Custom);
201
- setOperationAction(ISD::USUBO, RegVT, Custom);
202
-
203
- // PowerPC uses addo_carry,subo_carry to propagate carry.
204
- setOperationAction(ISD::UADDO_CARRY, RegVT, Custom);
205
- setOperationAction(ISD::USUBO_CARRY, RegVT, Custom);
206
200
207
201
// On P10, the default lowering generates better code using the
208
202
// setbc instruction.
@@ -272,6 +266,15 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
272
266
setIndexedStoreAction(ISD::PRE_INC, MVT::f64, Legal);
273
267
}
274
268
269
+ // PowerPC uses ADDC/ADDE/SUBC/SUBE to propagate carry.
270
+ const MVT ScalarIntVTs[] = { MVT::i32, MVT::i64 };
271
+ for (MVT VT : ScalarIntVTs) {
272
+ setOperationAction(ISD::ADDC, VT, Legal);
273
+ setOperationAction(ISD::ADDE, VT, Legal);
274
+ setOperationAction(ISD::SUBC, VT, Legal);
275
+ setOperationAction(ISD::SUBE, VT, Legal);
276
+ }
277
+
275
278
if (Subtarget.useCRBits()) {
276
279
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
277
280
@@ -1861,14 +1864,6 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
1861
1864
return "PPCISD::SETBC";
1862
1865
case PPCISD::SETBCR:
1863
1866
return "PPCISD::SETBCR";
1864
- case PPCISD::ADDC:
1865
- return "PPCISD::ADDC";
1866
- case PPCISD::ADDE:
1867
- return "PPCISD::ADDE";
1868
- case PPCISD::SUBC:
1869
- return "PPCISD::SUBC";
1870
- case PPCISD::SUBE:
1871
- return "PPCISD::SUBE";
1872
1867
}
1873
1868
return nullptr;
1874
1869
}
@@ -12265,74 +12260,43 @@ SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
12265
12260
llvm_unreachable("ERROR:Should return for all cases within swtich.");
12266
12261
}
12267
12262
12268
- static SDValue ConvertCarryValueToCarryFlag(EVT SumType, SDValue Value,
12269
- SelectionDAG &DAG,
12270
- const PPCSubtarget &STI) {
12271
- SDLoc DL(Value);
12272
- if (STI.useCRBits())
12273
- Value = DAG.getNode(ISD::SELECT, DL, SumType, Value,
12274
- DAG.getConstant(1, DL, SumType),
12275
- DAG.getConstant(0, DL, SumType));
12276
- else
12277
- Value = DAG.getZExtOrTrunc(Value, DL, SumType);
12278
- SDValue Sum = DAG.getNode(PPCISD::ADDC, DL, DAG.getVTList(SumType, MVT::i32),
12279
- Value, DAG.getAllOnesConstant(DL, SumType));
12280
- return Sum.getValue(1);
12281
- }
12263
+ SDValue PPCTargetLowering::LowerUaddo(SDValue Op, SelectionDAG &DAG) const {
12264
+ // Default to target independent lowering if there is a logical user of the
12265
+ // carry-bit.
12266
+ for (SDNode *U : Op->users()) {
12267
+ if (U->getOpcode() == ISD::SELECT)
12268
+ return SDValue();
12269
+ if (ISD::isBitwiseLogicOp(U->getOpcode())) {
12270
+ for (unsigned i = 0, ie = U->getNumOperands(); i != ie; ++i) {
12271
+ if (U->getOperand(i).getOpcode() != ISD::UADDO &&
12272
+ U->getOperand(i).getOpcode() != ISD::MERGE_VALUES)
12273
+ return SDValue();
12274
+ }
12275
+ }
12276
+ }
12277
+ SDValue LHS = Op.getOperand(0);
12278
+ SDValue RHS = Op.getOperand(1);
12279
+ SDLoc dl(Op);
12282
12280
12283
- static SDValue ConvertCarryFlagToCarryValue(EVT SumType, SDValue Flag,
12284
- EVT CarryType, SelectionDAG &DAG,
12285
- const PPCSubtarget &STI) {
12286
- SDLoc DL(Flag);
12287
- SDValue Zero = DAG.getConstant(0, DL, SumType);
12288
- SDValue Carry = DAG.getNode(
12289
- PPCISD::ADDE, DL, DAG.getVTList(SumType, MVT::i32), Zero, Zero, Flag);
12290
- if (STI.useCRBits())
12291
- return DAG.getSetCC(DL, CarryType, Carry, Zero, ISD::SETNE);
12292
- return DAG.getZExtOrTrunc(Carry, DL, CarryType);
12293
- }
12281
+ // Default to target independent lowering for special cases handled there.
12282
+ if (isOneConstant(RHS) || isAllOnesConstant(RHS))
12283
+ return SDValue();
12294
12284
12295
- SDValue PPCTargetLowering::LowerADDSUBO(SDValue Op, SelectionDAG &DAG) const {
12285
+ EVT VT = Op.getNode()->getValueType(0);
12296
12286
12297
- SDLoc DL(Op);
12298
- SDNode *N = Op.getNode();
12299
- EVT VT = N->getValueType(0);
12300
- EVT CarryType = N->getValueType(1);
12301
- unsigned Opc = N->getOpcode();
12302
- bool IsAdd = Opc == ISD::UADDO;
12303
- Opc = IsAdd ? PPCISD::ADDC : PPCISD::SUBC;
12304
- SDValue Sum = DAG.getNode(Opc, DL, DAG.getVTList(VT, MVT::i32),
12305
- N->getOperand(0), N->getOperand(1));
12306
- SDValue Carry = ConvertCarryFlagToCarryValue(VT, Sum.getValue(1), CarryType,
12307
- DAG, Subtarget);
12308
- if (!IsAdd)
12309
- Carry = DAG.getNode(ISD::XOR, DL, CarryType, Carry,
12310
- DAG.getConstant(1UL, DL, CarryType));
12311
- return DAG.getNode(ISD::MERGE_VALUES, DL, N->getVTList(), Sum, Carry);
12312
- }
12313
-
12314
- SDValue PPCTargetLowering::LowerADDSUBO_CARRY(SDValue Op,
12315
- SelectionDAG &DAG) const {
12316
- SDLoc DL(Op);
12317
- SDNode *N = Op.getNode();
12318
- unsigned Opc = N->getOpcode();
12319
- EVT VT = N->getValueType(0);
12320
- EVT CarryType = N->getValueType(1);
12321
- SDValue CarryOp = N->getOperand(2);
12322
- bool IsAdd = Opc == ISD::UADDO_CARRY;
12323
- Opc = IsAdd ? PPCISD::ADDE : PPCISD::SUBE;
12324
- if (!IsAdd)
12325
- CarryOp = DAG.getNode(ISD::XOR, DL, CarryOp.getValueType(), CarryOp,
12326
- DAG.getAllOnesConstant(DL, CarryOp.getValueType()));
12327
- CarryOp = ConvertCarryValueToCarryFlag(VT, CarryOp, DAG, Subtarget);
12328
- SDValue Sum = DAG.getNode(Opc, DL, DAG.getVTList(VT, MVT::i32),
12329
- Op.getOperand(0), Op.getOperand(1), CarryOp);
12330
- CarryOp = ConvertCarryFlagToCarryValue(VT, Sum.getValue(1), CarryType, DAG,
12331
- Subtarget);
12332
- if (!IsAdd)
12333
- CarryOp = DAG.getNode(ISD::XOR, DL, CarryOp.getValueType(), CarryOp,
12334
- DAG.getConstant(1UL, DL, CarryOp.getValueType()));
12335
- return DAG.getNode(ISD::MERGE_VALUES, DL, N->getVTList(), Sum, CarryOp);
12287
+ SDValue ADDC;
12288
+ SDValue Overflow;
12289
+ SDVTList VTs = Op.getNode()->getVTList();
12290
+
12291
+ ADDC = DAG.getNode(ISD::ADDC, dl, DAG.getVTList(VT, MVT::Glue), LHS, RHS);
12292
+ Overflow = DAG.getNode(ISD::ADDE, dl, DAG.getVTList(VT, MVT::Glue),
12293
+ DAG.getConstant(0, dl, VT), DAG.getConstant(0, dl, VT),
12294
+ ADDC.getValue(1));
12295
+ SDValue OverflowTrunc =
12296
+ DAG.getNode(ISD::TRUNCATE, dl, Op.getNode()->getValueType(1), Overflow);
12297
+ SDValue Res =
12298
+ DAG.getNode(ISD::MERGE_VALUES, dl, VTs, ADDC.getValue(0), OverflowTrunc);
12299
+ return Res;
12336
12300
}
12337
12301
12338
12302
SDValue PPCTargetLowering::LowerSSUBO(SDValue Op, SelectionDAG &DAG) const {
@@ -12363,8 +12327,8 @@ SDValue PPCTargetLowering::LowerSSUBO(SDValue Op, SelectionDAG &DAG) const {
12363
12327
///
12364
12328
SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
12365
12329
switch (Op.getOpcode()) {
12366
- default:
12367
- llvm_unreachable("Wasn't expecting to be able to lower this!" );
12330
+ default: llvm_unreachable("Wasn't expecting to be able to lower this!");
12331
+ case ISD::UADDO: return LowerUaddo(Op, DAG );
12368
12332
case ISD::FPOW: return lowerPow(Op, DAG);
12369
12333
case ISD::FSIN: return lowerSin(Op, DAG);
12370
12334
case ISD::FCOS: return lowerCos(Op, DAG);
@@ -12457,12 +12421,6 @@ SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
12457
12421
return LowerATOMIC_LOAD_STORE(Op, DAG);
12458
12422
case ISD::IS_FPCLASS:
12459
12423
return LowerIS_FPCLASS(Op, DAG);
12460
- case ISD::UADDO:
12461
- case ISD::USUBO:
12462
- return LowerADDSUBO(Op, DAG);
12463
- case ISD::UADDO_CARRY:
12464
- case ISD::USUBO_CARRY:
12465
- return LowerADDSUBO_CARRY(Op, DAG);
12466
12424
}
12467
12425
}
12468
12426
@@ -13545,11 +13503,6 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
13545
13503
F->insert(It, copy0MBB);
13546
13504
F->insert(It, sinkMBB);
13547
13505
13548
- if (isPhysRegUsedAfter(PPC::CARRY, MI.getIterator())) {
13549
- copy0MBB->addLiveIn(PPC::CARRY);
13550
- sinkMBB->addLiveIn(PPC::CARRY);
13551
- }
13552
-
13553
13506
// Set the call frame size on entry to the new basic blocks.
13554
13507
// See https://reviews.llvm.org/D156113.
13555
13508
unsigned CallFrameSize = TII->getCallFrameSizeAt(MI);
@@ -16402,21 +16355,6 @@ static bool isStoreConditional(SDValue Intrin, unsigned &StoreWidth) {
16402
16355
return true;
16403
16356
}
16404
16357
16405
- static SDValue DAGCombineAddc(SDNode *N,
16406
- llvm::PPCTargetLowering::DAGCombinerInfo &DCI) {
16407
- if (N->getOpcode() == PPCISD::ADDC && N->hasAnyUseOfValue(1)) {
16408
- // (ADDC (ADDE 0, 0, C), -1) -> C
16409
- SDValue LHS = N->getOperand(0);
16410
- SDValue RHS = N->getOperand(1);
16411
- if (LHS->getOpcode() == PPCISD::ADDE &&
16412
- isNullConstant(LHS->getOperand(0)) &&
16413
- isNullConstant(LHS->getOperand(1)) && isAllOnesConstant(RHS)) {
16414
- return DCI.CombineTo(N, SDValue(N, 0), LHS->getOperand(2));
16415
- }
16416
- }
16417
- return SDValue();
16418
- }
16419
-
16420
16358
SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
16421
16359
DAGCombinerInfo &DCI) const {
16422
16360
SelectionDAG &DAG = DCI.DAG;
@@ -17205,8 +17143,6 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
17205
17143
}
17206
17144
case ISD::BUILD_VECTOR:
17207
17145
return DAGCombineBuildVector(N, DCI);
17208
- case PPCISD::ADDC:
17209
- return DAGCombineAddc(N, DCI);
17210
17146
}
17211
17147
17212
17148
return SDValue();
@@ -17260,16 +17196,6 @@ void PPCTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
17260
17196
Known.Zero = 0xFFFF0000;
17261
17197
break;
17262
17198
}
17263
- case PPCISD::ADDE: {
17264
- if (Op.getResNo() == 0) {
17265
- // (0|1), _ = ADDE 0, 0, CARRY
17266
- SDValue LHS = Op.getOperand(0);
17267
- SDValue RHS = Op.getOperand(1);
17268
- if (isNullConstant(LHS) && isNullConstant(RHS))
17269
- Known.Zero = ~1ULL;
17270
- }
17271
- break;
17272
- }
17273
17199
case ISD::INTRINSIC_WO_CHAIN: {
17274
17200
switch (Op.getConstantOperandVal(0)) {
17275
17201
default: break;
@@ -18539,8 +18465,7 @@ static SDValue combineADDToADDZE(SDNode *N, SelectionDAG &DAG,
18539
18465
return SDValue();
18540
18466
18541
18467
SDLoc DL(N);
18542
- EVT CarryType = Subtarget.useCRBits() ? MVT::i1 : MVT::i32;
18543
- SDVTList VTs = DAG.getVTList(MVT::i64, CarryType);
18468
+ SDVTList VTs = DAG.getVTList(MVT::i64, MVT::Glue);
18544
18469
SDValue Cmp = RHS.getOperand(0);
18545
18470
SDValue Z = Cmp.getOperand(0);
18546
18471
auto *Constant = cast<ConstantSDNode>(Cmp.getOperand(1));
@@ -18558,14 +18483,11 @@ static SDValue combineADDToADDZE(SDNode *N, SelectionDAG &DAG,
18558
18483
SDValue Add = DAG.getNode(ISD::ADD, DL, MVT::i64, Z,
18559
18484
DAG.getConstant(NegConstant, DL, MVT::i64));
18560
18485
SDValue AddOrZ = NegConstant != 0 ? Add : Z;
18561
- SDValue Addc =
18562
- DAG.getNode(ISD::UADDO_CARRY, DL, DAG.getVTList(MVT::i64, CarryType),
18563
- AddOrZ, DAG.getAllOnesConstant(DL, MVT::i64),
18564
- DAG.getConstant(0, DL, CarryType));
18565
- return DAG.getNode(ISD::UADDO_CARRY, DL, VTs, LHS,
18566
- DAG.getConstant(0, DL, MVT::i64),
18486
+ SDValue Addc = DAG.getNode(ISD::ADDC, DL, DAG.getVTList(MVT::i64, MVT::Glue),
18487
+ AddOrZ, DAG.getAllOnesConstant(DL, MVT::i64));
18488
+ return DAG.getNode(ISD::ADDE, DL, VTs, LHS, DAG.getConstant(0, DL, MVT::i64),
18567
18489
SDValue(Addc.getNode(), 1));
18568
- }
18490
+ }
18569
18491
case ISD::SETEQ: {
18570
18492
// when C == 0
18571
18493
// --> addze X, (subfic Z, 0).carry
@@ -18576,15 +18498,11 @@ static SDValue combineADDToADDZE(SDNode *N, SelectionDAG &DAG,
18576
18498
SDValue Add = DAG.getNode(ISD::ADD, DL, MVT::i64, Z,
18577
18499
DAG.getConstant(NegConstant, DL, MVT::i64));
18578
18500
SDValue AddOrZ = NegConstant != 0 ? Add : Z;
18579
- SDValue Subc =
18580
- DAG.getNode(ISD::USUBO_CARRY, DL, DAG.getVTList(MVT::i64, CarryType),
18581
- DAG.getConstant(0, DL, MVT::i64), AddOrZ,
18582
- DAG.getConstant(0, DL, CarryType));
18583
- SDValue Invert = DAG.getNode(ISD::XOR, DL, CarryType, Subc.getValue(1),
18584
- DAG.getConstant(1UL, DL, CarryType));
18585
- return DAG.getNode(ISD::UADDO_CARRY, DL, VTs, LHS,
18586
- DAG.getConstant(0, DL, MVT::i64), Invert);
18587
- }
18501
+ SDValue Subc = DAG.getNode(ISD::SUBC, DL, DAG.getVTList(MVT::i64, MVT::Glue),
18502
+ DAG.getConstant(0, DL, MVT::i64), AddOrZ);
18503
+ return DAG.getNode(ISD::ADDE, DL, VTs, LHS, DAG.getConstant(0, DL, MVT::i64),
18504
+ SDValue(Subc.getNode(), 1));
18505
+ }
18588
18506
}
18589
18507
18590
18508
return SDValue();
0 commit comments