@@ -153,6 +153,7 @@ static const unsigned MaxParallelChains = 64;
153
153
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL,
154
154
const SDValue *Parts, unsigned NumParts,
155
155
MVT PartVT, EVT ValueVT, const Value *V,
156
+ SDValue InChain,
156
157
std::optional<CallingConv::ID> CC);
157
158
158
159
/// getCopyFromParts - Create a value that contains the specified legal parts
@@ -163,6 +164,7 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL,
163
164
static SDValue
164
165
getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
165
166
unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V,
167
+ SDValue InChain,
166
168
std::optional<CallingConv::ID> CC = std::nullopt,
167
169
std::optional<ISD::NodeType> AssertOp = std::nullopt) {
168
170
// Let the target assemble the parts if it wants to
@@ -173,7 +175,7 @@ getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
173
175
174
176
if (ValueVT.isVector())
175
177
return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT, V,
176
- CC);
178
+ InChain, CC);
177
179
178
180
assert(NumParts > 0 && "No parts to assemble!");
179
181
SDValue Val = Parts[0];
@@ -194,10 +196,10 @@ getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
194
196
EVT HalfVT = EVT::getIntegerVT(*DAG.getContext(), RoundBits/2);
195
197
196
198
if (RoundParts > 2) {
197
- Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2,
198
- PartVT, HalfVT, V );
199
- Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2,
200
- RoundParts / 2, PartVT, HalfVT, V);
199
+ Lo = getCopyFromParts(DAG, DL, Parts, RoundParts / 2, PartVT, HalfVT, V,
200
+ InChain );
201
+ Hi = getCopyFromParts(DAG, DL, Parts + RoundParts / 2, RoundParts / 2,
202
+ PartVT, HalfVT, V, InChain );
201
203
} else {
202
204
Lo = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[0]);
203
205
Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);
@@ -213,7 +215,7 @@ getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
213
215
unsigned OddParts = NumParts - RoundParts;
214
216
EVT OddVT = EVT::getIntegerVT(*DAG.getContext(), OddParts * PartBits);
215
217
Hi = getCopyFromParts(DAG, DL, Parts + RoundParts, OddParts, PartVT,
216
- OddVT, V, CC);
218
+ OddVT, V, InChain, CC);
217
219
218
220
// Combine the round and odd parts.
219
221
Lo = Val;
@@ -243,7 +245,8 @@ getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
243
245
assert(ValueVT.isFloatingPoint() && PartVT.isInteger() &&
244
246
!PartVT.isVector() && "Unexpected split");
245
247
EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), ValueVT.getSizeInBits());
246
- Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V, CC);
248
+ Val = getCopyFromParts(DAG, DL, Parts, NumParts, PartVT, IntVT, V,
249
+ InChain, CC);
247
250
}
248
251
}
249
252
@@ -283,10 +286,20 @@ getCopyFromParts(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts,
283
286
284
287
if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
285
288
// FP_ROUND's are always exact here.
286
- if (ValueVT.bitsLT(Val.getValueType()))
287
- return DAG.getNode(
288
- ISD::FP_ROUND, DL, ValueVT, Val,
289
- DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout())));
289
+ if (ValueVT.bitsLT(Val.getValueType())) {
290
+
291
+ SDValue NoChange =
292
+ DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout()));
293
+
294
+ if (DAG.getMachineFunction().getFunction().getAttributes().hasFnAttr(
295
+ llvm::Attribute::StrictFP)) {
296
+ return DAG.getNode(ISD::STRICT_FP_ROUND, DL,
297
+ DAG.getVTList(ValueVT, MVT::Other), InChain, Val,
298
+ NoChange);
299
+ }
300
+
301
+ return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, NoChange);
302
+ }
290
303
291
304
return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
292
305
}
@@ -324,6 +337,7 @@ static void diagnosePossiblyInvalidConstraint(LLVMContext &Ctx, const Value *V,
324
337
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL,
325
338
const SDValue *Parts, unsigned NumParts,
326
339
MVT PartVT, EVT ValueVT, const Value *V,
340
+ SDValue InChain,
327
341
std::optional<CallingConv::ID> CallConv) {
328
342
assert(ValueVT.isVector() && "Not a vector value");
329
343
assert(NumParts > 0 && "No parts to assemble!");
@@ -362,17 +376,17 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, const SDLoc &DL,
362
376
// If the register was not expanded, truncate or copy the value,
363
377
// as appropriate.
364
378
for (unsigned i = 0; i != NumParts; ++i)
365
- Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1,
366
- PartVT, IntermediateVT, V , CallConv);
379
+ Ops[i] = getCopyFromParts(DAG, DL, &Parts[i], 1, PartVT, IntermediateVT,
380
+ V, InChain , CallConv);
367
381
} else if (NumParts > 0) {
368
382
// If the intermediate type was expanded, build the intermediate
369
383
// operands from the parts.
370
384
assert(NumParts % NumIntermediates == 0 &&
371
385
"Must expand into a divisible number of parts!");
372
386
unsigned Factor = NumParts / NumIntermediates;
373
387
for (unsigned i = 0; i != NumIntermediates; ++i)
374
- Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor,
375
- PartVT, IntermediateVT, V, CallConv);
388
+ Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor, PartVT,
389
+ IntermediateVT, V, InChain , CallConv);
376
390
}
377
391
378
392
// Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
@@ -926,7 +940,7 @@ SDValue RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
926
940
}
927
941
928
942
Values[Value] = getCopyFromParts(DAG, dl, Parts.begin(), NumRegs,
929
- RegisterVT, ValueVT, V, CallConv);
943
+ RegisterVT, ValueVT, V, Chain, CallConv);
930
944
Part += NumRegs;
931
945
Parts.clear();
932
946
}
@@ -10635,9 +10649,9 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
10635
10649
unsigned NumRegs = getNumRegistersForCallingConv(CLI.RetTy->getContext(),
10636
10650
CLI.CallConv, VT);
10637
10651
10638
- ReturnValues.push_back(getCopyFromParts(CLI.DAG, CLI.DL, &InVals[CurReg],
10639
- NumRegs, RegisterVT, VT, nullptr,
10640
- CLI.CallConv, AssertOp));
10652
+ ReturnValues.push_back(getCopyFromParts(
10653
+ CLI.DAG, CLI.DL, &InVals[CurReg], NumRegs, RegisterVT, VT, nullptr,
10654
+ CLI.Chain, CLI.CallConv, AssertOp));
10641
10655
CurReg += NumRegs;
10642
10656
}
10643
10657
@@ -11116,8 +11130,9 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
11116
11130
MVT VT = ValueVTs[0].getSimpleVT();
11117
11131
MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
11118
11132
std::optional<ISD::NodeType> AssertOp;
11119
- SDValue ArgValue = getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT,
11120
- nullptr, F.getCallingConv(), AssertOp);
11133
+ SDValue ArgValue =
11134
+ getCopyFromParts(DAG, dl, &InVals[0], 1, RegVT, VT, nullptr, NewRoot,
11135
+ F.getCallingConv(), AssertOp);
11121
11136
11122
11137
MachineFunction& MF = SDB->DAG.getMachineFunction();
11123
11138
MachineRegisterInfo& RegInfo = MF.getRegInfo();
@@ -11189,7 +11204,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
11189
11204
AssertOp = ISD::AssertZext;
11190
11205
11191
11206
ArgValues.push_back(getCopyFromParts(DAG, dl, &InVals[i], NumParts,
11192
- PartVT, VT, nullptr,
11207
+ PartVT, VT, nullptr, NewRoot,
11193
11208
F.getCallingConv(), AssertOp));
11194
11209
}
11195
11210
0 commit comments