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"
39
40
#include "llvm/CodeGen/MachineBasicBlock.h"
40
41
#include "llvm/CodeGen/MachineFrameInfo.h"
41
42
#include "llvm/CodeGen/MachineFunction.h"
@@ -197,6 +198,11 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
197
198
}
198
199
199
200
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);
200
206
201
207
// On P10, the default lowering generates better code using the
202
208
// setbc instruction.
@@ -266,15 +272,6 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
266
272
setIndexedStoreAction(ISD::PRE_INC, MVT::f64, Legal);
267
273
}
268
274
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
-
278
275
if (Subtarget.useCRBits()) {
279
276
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
280
277
@@ -1864,6 +1861,14 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
1864
1861
return "PPCISD::SETBC";
1865
1862
case PPCISD::SETBCR:
1866
1863
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";
1867
1872
}
1868
1873
return nullptr;
1869
1874
}
@@ -12150,43 +12155,74 @@ SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
12150
12155
llvm_unreachable("ERROR:Should return for all cases within swtich.");
12151
12156
}
12152
12157
12153
- SDValue PPCTargetLowering::LowerUaddo(SDValue Op, SelectionDAG &DAG) const {
12154
- // Default to target independent lowering if there is a logical user of the
12155
- // carry-bit.
12156
- for (SDNode *U : Op->users()) {
12157
- if (U->getOpcode() == ISD::SELECT)
12158
- return SDValue();
12159
- if (ISD::isBitwiseLogicOp(U->getOpcode())) {
12160
- for (unsigned i = 0, ie = U->getNumOperands(); i != ie; ++i) {
12161
- if (U->getOperand(i).getOpcode() != ISD::UADDO &&
12162
- U->getOperand(i).getOpcode() != ISD::MERGE_VALUES)
12163
- return SDValue();
12164
- }
12165
- }
12166
- }
12167
- SDValue LHS = Op.getOperand(0);
12168
- SDValue RHS = Op.getOperand(1);
12169
- SDLoc dl(Op);
12170
-
12171
- // Default to target independent lowering for special cases handled there.
12172
- if (isOneConstant(RHS) || isAllOnesConstant(RHS))
12173
- return SDValue();
12158
+ static SDValue ConvertCarryValueToCarryFlag(EVT SumType, SDValue Value,
12159
+ SelectionDAG &DAG,
12160
+ const PPCSubtarget &STI) {
12161
+ SDLoc DL(Value);
12162
+ if (STI.useCRBits())
12163
+ Value = DAG.getNode(ISD::SELECT, DL, SumType, Value,
12164
+ DAG.getConstant(1, DL, SumType),
12165
+ DAG.getConstant(0, DL, SumType));
12166
+ else
12167
+ Value = DAG.getZExtOrTrunc(Value, DL, SumType);
12168
+ SDValue Sum = DAG.getNode(PPCISD::ADDC, DL, DAG.getVTList(SumType, MVT::i32),
12169
+ Value, DAG.getAllOnesConstant(DL, SumType));
12170
+ return Sum.getValue(1);
12171
+ }
12174
12172
12175
- EVT VT = Op.getNode()->getValueType(0);
12173
+ static SDValue ConvertCarryFlagToCarryValue(EVT SumType, SDValue Flag,
12174
+ EVT CarryType, SelectionDAG &DAG,
12175
+ const PPCSubtarget &STI) {
12176
+ SDLoc DL(Flag);
12177
+ SDValue Zero = DAG.getConstant(0, DL, SumType);
12178
+ SDValue Carry = DAG.getNode(
12179
+ PPCISD::ADDE, DL, DAG.getVTList(SumType, MVT::i32), Zero, Zero, Flag);
12180
+ if (STI.useCRBits())
12181
+ return DAG.getSetCC(DL, CarryType, Carry, Zero, ISD::SETNE);
12182
+ return DAG.getZExtOrTrunc(Carry, DL, CarryType);
12183
+ }
12176
12184
12177
- SDValue ADDC;
12178
- SDValue Overflow;
12179
- SDVTList VTs = Op.getNode()->getVTList();
12185
+ SDValue PPCTargetLowering::LowerADDSUBO(SDValue Op, SelectionDAG &DAG) const {
12180
12186
12181
- ADDC = DAG.getNode(ISD::ADDC, dl, DAG.getVTList(VT, MVT::Glue), LHS, RHS);
12182
- Overflow = DAG.getNode(ISD::ADDE, dl, DAG.getVTList(VT, MVT::Glue),
12183
- DAG.getConstant(0, dl, VT), DAG.getConstant(0, dl, VT),
12184
- ADDC.getValue(1));
12185
- SDValue OverflowTrunc =
12186
- DAG.getNode(ISD::TRUNCATE, dl, Op.getNode()->getValueType(1), Overflow);
12187
- SDValue Res =
12188
- DAG.getNode(ISD::MERGE_VALUES, dl, VTs, ADDC.getValue(0), OverflowTrunc);
12189
- return Res;
12187
+ SDLoc DL(Op);
12188
+ SDNode *N = Op.getNode();
12189
+ EVT VT = N->getValueType(0);
12190
+ EVT CarryType = N->getValueType(1);
12191
+ unsigned Opc = N->getOpcode();
12192
+ bool IsAdd = Opc == ISD::UADDO;
12193
+ Opc = IsAdd ? PPCISD::ADDC : PPCISD::SUBC;
12194
+ SDValue Sum = DAG.getNode(Opc, DL, DAG.getVTList(VT, MVT::i32),
12195
+ N->getOperand(0), N->getOperand(1));
12196
+ SDValue Carry = ConvertCarryFlagToCarryValue(VT, Sum.getValue(1), CarryType,
12197
+ DAG, Subtarget);
12198
+ if (!IsAdd)
12199
+ Carry = DAG.getNode(ISD::XOR, DL, CarryType, Carry,
12200
+ DAG.getConstant(1UL, DL, CarryType));
12201
+ return DAG.getNode(ISD::MERGE_VALUES, DL, N->getVTList(), Sum, Carry);
12202
+ }
12203
+
12204
+ SDValue PPCTargetLowering::LowerADDSUBO_CARRY(SDValue Op,
12205
+ SelectionDAG &DAG) const {
12206
+ SDLoc DL(Op);
12207
+ SDNode *N = Op.getNode();
12208
+ unsigned Opc = N->getOpcode();
12209
+ EVT VT = N->getValueType(0);
12210
+ EVT CarryType = N->getValueType(1);
12211
+ SDValue CarryOp = N->getOperand(2);
12212
+ bool IsAdd = Opc == ISD::UADDO_CARRY;
12213
+ Opc = IsAdd ? PPCISD::ADDE : PPCISD::SUBE;
12214
+ if (!IsAdd)
12215
+ CarryOp = DAG.getNode(ISD::XOR, DL, CarryOp.getValueType(), CarryOp,
12216
+ DAG.getAllOnesConstant(DL, CarryOp.getValueType()));
12217
+ CarryOp = ConvertCarryValueToCarryFlag(VT, CarryOp, DAG, Subtarget);
12218
+ SDValue Sum = DAG.getNode(Opc, DL, DAG.getVTList(VT, MVT::i32),
12219
+ Op.getOperand(0), Op.getOperand(1), CarryOp);
12220
+ CarryOp = ConvertCarryFlagToCarryValue(VT, Sum.getValue(1), CarryType, DAG,
12221
+ Subtarget);
12222
+ if (!IsAdd)
12223
+ CarryOp = DAG.getNode(ISD::XOR, DL, CarryOp.getValueType(), CarryOp,
12224
+ DAG.getConstant(1UL, DL, CarryOp.getValueType()));
12225
+ return DAG.getNode(ISD::MERGE_VALUES, DL, N->getVTList(), Sum, CarryOp);
12190
12226
}
12191
12227
12192
12228
SDValue PPCTargetLowering::LowerSSUBO(SDValue Op, SelectionDAG &DAG) const {
@@ -12217,8 +12253,8 @@ SDValue PPCTargetLowering::LowerSSUBO(SDValue Op, SelectionDAG &DAG) const {
12217
12253
///
12218
12254
SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
12219
12255
switch (Op.getOpcode()) {
12220
- default: llvm_unreachable("Wasn't expecting to be able to lower this!");
12221
- case ISD::UADDO: return LowerUaddo(Op, DAG );
12256
+ default:
12257
+ llvm_unreachable("Wasn't expecting to be able to lower this!" );
12222
12258
case ISD::FPOW: return lowerPow(Op, DAG);
12223
12259
case ISD::FSIN: return lowerSin(Op, DAG);
12224
12260
case ISD::FCOS: return lowerCos(Op, DAG);
@@ -12311,6 +12347,12 @@ SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
12311
12347
return LowerATOMIC_LOAD_STORE(Op, DAG);
12312
12348
case ISD::IS_FPCLASS:
12313
12349
return LowerIS_FPCLASS(Op, DAG);
12350
+ case ISD::UADDO:
12351
+ case ISD::USUBO:
12352
+ return LowerADDSUBO(Op, DAG);
12353
+ case ISD::UADDO_CARRY:
12354
+ case ISD::USUBO_CARRY:
12355
+ return LowerADDSUBO_CARRY(Op, DAG);
12314
12356
}
12315
12357
}
12316
12358
@@ -13393,6 +13435,11 @@ PPCTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
13393
13435
F->insert(It, copy0MBB);
13394
13436
F->insert(It, sinkMBB);
13395
13437
13438
+ if (isPhysRegUsedAfter(PPC::CARRY, MI.getIterator())) {
13439
+ copy0MBB->addLiveIn(PPC::CARRY);
13440
+ sinkMBB->addLiveIn(PPC::CARRY);
13441
+ }
13442
+
13396
13443
// Set the call frame size on entry to the new basic blocks.
13397
13444
// See https://reviews.llvm.org/D156113.
13398
13445
unsigned CallFrameSize = TII->getCallFrameSizeAt(MI);
@@ -16245,6 +16292,21 @@ static bool isStoreConditional(SDValue Intrin, unsigned &StoreWidth) {
16245
16292
return true;
16246
16293
}
16247
16294
16295
+ static SDValue DAGCombineAddc(SDNode *N,
16296
+ llvm::PPCTargetLowering::DAGCombinerInfo &DCI) {
16297
+ if (N->getOpcode() == PPCISD::ADDC && N->hasAnyUseOfValue(1)) {
16298
+ // (ADDC (ADDE 0, 0, C), -1) -> C
16299
+ SDValue LHS = N->getOperand(0);
16300
+ SDValue RHS = N->getOperand(1);
16301
+ if (LHS->getOpcode() == PPCISD::ADDE &&
16302
+ isNullConstant(LHS->getOperand(0)) &&
16303
+ isNullConstant(LHS->getOperand(1)) && isAllOnesConstant(RHS)) {
16304
+ return DCI.CombineTo(N, SDValue(N, 0), LHS->getOperand(2));
16305
+ }
16306
+ }
16307
+ return SDValue();
16308
+ }
16309
+
16248
16310
SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
16249
16311
DAGCombinerInfo &DCI) const {
16250
16312
SelectionDAG &DAG = DCI.DAG;
@@ -17033,6 +17095,8 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
17033
17095
}
17034
17096
case ISD::BUILD_VECTOR:
17035
17097
return DAGCombineBuildVector(N, DCI);
17098
+ case PPCISD::ADDC:
17099
+ return DAGCombineAddc(N, DCI);
17036
17100
}
17037
17101
17038
17102
return SDValue();
@@ -17086,6 +17150,16 @@ void PPCTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
17086
17150
Known.Zero = 0xFFFF0000;
17087
17151
break;
17088
17152
}
17153
+ case PPCISD::ADDE: {
17154
+ if (Op.getResNo() == 0) {
17155
+ // (0|1), _ = ADDE 0, 0, CARRY
17156
+ SDValue LHS = Op.getOperand(0);
17157
+ SDValue RHS = Op.getOperand(1);
17158
+ if (isNullConstant(LHS) && isNullConstant(RHS))
17159
+ Known.Zero = ~1ULL;
17160
+ }
17161
+ break;
17162
+ }
17089
17163
case ISD::INTRINSIC_WO_CHAIN: {
17090
17164
switch (Op.getConstantOperandVal(0)) {
17091
17165
default: break;
@@ -18355,7 +18429,8 @@ static SDValue combineADDToADDZE(SDNode *N, SelectionDAG &DAG,
18355
18429
return SDValue();
18356
18430
18357
18431
SDLoc DL(N);
18358
- SDVTList VTs = DAG.getVTList(MVT::i64, MVT::Glue);
18432
+ EVT CarryType = Subtarget.useCRBits() ? MVT::i1 : MVT::i32;
18433
+ SDVTList VTs = DAG.getVTList(MVT::i64, CarryType);
18359
18434
SDValue Cmp = RHS.getOperand(0);
18360
18435
SDValue Z = Cmp.getOperand(0);
18361
18436
auto *Constant = cast<ConstantSDNode>(Cmp.getOperand(1));
@@ -18373,11 +18448,14 @@ static SDValue combineADDToADDZE(SDNode *N, SelectionDAG &DAG,
18373
18448
SDValue Add = DAG.getNode(ISD::ADD, DL, MVT::i64, Z,
18374
18449
DAG.getConstant(NegConstant, DL, MVT::i64));
18375
18450
SDValue AddOrZ = NegConstant != 0 ? Add : Z;
18376
- SDValue Addc = DAG.getNode(ISD::ADDC, DL, DAG.getVTList(MVT::i64, MVT::Glue),
18377
- AddOrZ, DAG.getAllOnesConstant(DL, MVT::i64));
18378
- return DAG.getNode(ISD::ADDE, DL, VTs, LHS, DAG.getConstant(0, DL, MVT::i64),
18451
+ SDValue Addc =
18452
+ DAG.getNode(ISD::UADDO_CARRY, DL, DAG.getVTList(MVT::i64, CarryType),
18453
+ AddOrZ, DAG.getAllOnesConstant(DL, MVT::i64),
18454
+ DAG.getConstant(0, DL, CarryType));
18455
+ return DAG.getNode(ISD::UADDO_CARRY, DL, VTs, LHS,
18456
+ DAG.getConstant(0, DL, MVT::i64),
18379
18457
SDValue(Addc.getNode(), 1));
18380
- }
18458
+ }
18381
18459
case ISD::SETEQ: {
18382
18460
// when C == 0
18383
18461
// --> addze X, (subfic Z, 0).carry
@@ -18388,11 +18466,15 @@ static SDValue combineADDToADDZE(SDNode *N, SelectionDAG &DAG,
18388
18466
SDValue Add = DAG.getNode(ISD::ADD, DL, MVT::i64, Z,
18389
18467
DAG.getConstant(NegConstant, DL, MVT::i64));
18390
18468
SDValue AddOrZ = NegConstant != 0 ? Add : Z;
18391
- SDValue Subc = DAG.getNode(ISD::SUBC, DL, DAG.getVTList(MVT::i64, MVT::Glue),
18392
- DAG.getConstant(0, DL, MVT::i64), AddOrZ);
18393
- return DAG.getNode(ISD::ADDE, DL, VTs, LHS, DAG.getConstant(0, DL, MVT::i64),
18394
- SDValue(Subc.getNode(), 1));
18395
- }
18469
+ SDValue Subc =
18470
+ DAG.getNode(ISD::USUBO_CARRY, DL, DAG.getVTList(MVT::i64, CarryType),
18471
+ DAG.getConstant(0, DL, MVT::i64), AddOrZ,
18472
+ DAG.getConstant(0, DL, CarryType));
18473
+ SDValue Invert = DAG.getNode(ISD::XOR, DL, CarryType, Subc.getValue(1),
18474
+ DAG.getConstant(1UL, DL, CarryType));
18475
+ return DAG.getNode(ISD::UADDO_CARRY, DL, VTs, LHS,
18476
+ DAG.getConstant(0, DL, MVT::i64), Invert);
18477
+ }
18396
18478
}
18397
18479
18398
18480
return SDValue();
0 commit comments