@@ -363,6 +363,19 @@ SDValue SelectionDAGLegalize::ExpandConstant(ConstantSDNode *CP) {
363
363
return Result;
364
364
}
365
365
366
+ // Helper function that generates an MMO that considers the alignment of the
367
+ // stack, and the size of the stack object
368
+ static MachineMemOperand *getStackAlignedMMO (SDValue StackPtr,
369
+ MachineFunction &MF,
370
+ bool isObjectScalable) {
371
+ auto &MFI = MF.getFrameInfo ();
372
+ int FI = cast<FrameIndexSDNode>(StackPtr)->getIndex ();
373
+ MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack (MF, FI);
374
+ uint64_t ObjectSize = isObjectScalable ? ~UINT64_C (0 ) : MFI.getObjectSize (FI);
375
+ return MF.getMachineMemOperand (PtrInfo, MachineMemOperand::MOStore,
376
+ ObjectSize, MFI.getObjectAlign (FI));
377
+ }
378
+
366
379
// / Some target cannot handle a variable insertion index for the
367
380
// / INSERT_VECTOR_ELT instruction. In this case, it
368
381
// / is necessary to spill the vector being inserted into to memory, perform
@@ -384,23 +397,23 @@ SDValue SelectionDAGLegalize::PerformInsertVectorEltInMemory(SDValue Vec,
384
397
EVT VT = Tmp1.getValueType ();
385
398
EVT EltVT = VT.getVectorElementType ();
386
399
SDValue StackPtr = DAG.CreateStackTemporary (VT);
387
-
388
- int SPFI = cast<FrameIndexSDNode>( StackPtr. getNode ())-> getIndex ( );
400
+ MachineMemOperand *AlignedMMO = getStackAlignedMMO (
401
+ StackPtr, DAG. getMachineFunction (), EltVT. isScalableVector () );
389
402
390
403
// Store the vector.
391
- SDValue Ch = DAG.getStore (
392
- DAG.getEntryNode (), dl, Tmp1, StackPtr,
393
- MachinePointerInfo::getFixedStack (DAG.getMachineFunction (), SPFI));
404
+ SDValue Ch = DAG.getStore (DAG.getEntryNode (), dl, Vec, StackPtr, AlignedMMO);
394
405
395
406
SDValue StackPtr2 = TLI.getVectorElementPointer (DAG, StackPtr, VT, Tmp3);
396
407
397
408
// Store the scalar value.
398
- Ch = DAG.getTruncStore (
399
- Ch, dl, Tmp2, StackPtr2,
400
- MachinePointerInfo::getUnknownStack (DAG.getMachineFunction ()), EltVT);
401
- // Load the updated vector.
402
- return DAG.getLoad (VT, dl, Ch, StackPtr, MachinePointerInfo::getFixedStack (
403
- DAG.getMachineFunction (), SPFI));
409
+ Ch = DAG.getTruncStore (Ch, dl, Tmp2, StackPtr2, EltVT, AlignedMMO);
410
+
411
+ Align ElementAlignment = std::min (cast<StoreSDNode>(Ch)->getAlign (),
412
+ DAG.getDataLayout ().getPrefTypeAlign (
413
+ VT.getTypeForEVT (*DAG.getContext ())));
414
+
415
+ return DAG.getLoad (VT, dl, Ch, StackPtr, MachinePointerInfo (),
416
+ ElementAlignment);
404
417
}
405
418
406
419
SDValue SelectionDAGLegalize::ExpandINSERT_VECTOR_ELT (SDValue Vec, SDValue Val,
@@ -1378,19 +1391,6 @@ void SelectionDAGLegalize::LegalizeOp(SDNode *Node) {
1378
1391
}
1379
1392
}
1380
1393
1381
- // Helper function that generates an MMO that considers the alignment of the
1382
- // stack, and the size of the stack object
1383
- static MachineMemOperand *getStackAlignedMMO (SDValue StackPtr,
1384
- MachineFunction &MF,
1385
- bool isObjectScalable) {
1386
- auto &MFI = MF.getFrameInfo ();
1387
- int FI = cast<FrameIndexSDNode>(StackPtr)->getIndex ();
1388
- MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack (MF, FI);
1389
- uint64_t ObjectSize = isObjectScalable ? ~UINT64_C (0 ) : MFI.getObjectSize (FI);
1390
- return MF.getMachineMemOperand (PtrInfo, MachineMemOperand::MOStore,
1391
- ObjectSize, MFI.getObjectAlign (FI));
1392
- }
1393
-
1394
1394
SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack (SDValue Op) {
1395
1395
SDValue Vec = Op.getOperand (0 );
1396
1396
SDValue Idx = Op.getOperand (1 );
@@ -1488,24 +1488,27 @@ SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {
1488
1488
EVT VecVT = Vec.getValueType ();
1489
1489
EVT SubVecVT = Part.getValueType ();
1490
1490
SDValue StackPtr = DAG.CreateStackTemporary (VecVT);
1491
- int FI = cast<FrameIndexSDNode>(StackPtr.getNode ())->getIndex ();
1492
- MachinePointerInfo PtrInfo =
1493
- MachinePointerInfo::getFixedStack (DAG.getMachineFunction (), FI);
1491
+ MachineMemOperand *AlignedMMO = getStackAlignedMMO (
1492
+ StackPtr, DAG.getMachineFunction (), VecVT.isScalableVector ());
1494
1493
1495
1494
// First store the whole vector.
1496
- SDValue Ch = DAG.getStore (DAG.getEntryNode (), dl, Vec, StackPtr, PtrInfo );
1495
+ SDValue Ch = DAG.getStore (DAG.getEntryNode (), dl, Vec, StackPtr, AlignedMMO );
1497
1496
1498
1497
// Then store the inserted part.
1499
1498
SDValue SubStackPtr =
1500
1499
TLI.getVectorSubVecPointer (DAG, StackPtr, VecVT, SubVecVT, Idx);
1501
1500
1502
1501
// Store the subvector.
1503
- Ch = DAG.getStore (
1504
- Ch, dl, Part, SubStackPtr,
1505
- MachinePointerInfo::getUnknownStack (DAG.getMachineFunction ()));
1502
+ Ch = DAG.getStore (Ch, dl, Part, SubStackPtr, AlignedMMO);
1503
+
1504
+ Align ElementAlignment =
1505
+ std::min (cast<StoreSDNode>(Ch)->getAlign (),
1506
+ DAG.getDataLayout ().getPrefTypeAlign (
1507
+ Op.getValueType ().getTypeForEVT (*DAG.getContext ())));
1506
1508
1507
1509
// Finally, load the updated vector.
1508
- return DAG.getLoad (Op.getValueType (), dl, Ch, StackPtr, PtrInfo);
1510
+ return DAG.getLoad (Op.getValueType (), dl, Ch, StackPtr, MachinePointerInfo (),
1511
+ ElementAlignment);
1509
1512
}
1510
1513
1511
1514
SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack (SDNode* Node) {
0 commit comments