@@ -398,22 +398,24 @@ SDValue SelectionDAGLegalize::PerformInsertVectorEltInMemory(SDValue Vec,
398
398
EVT EltVT = VT.getVectorElementType ();
399
399
SDValue StackPtr = DAG.CreateStackTemporary (VT);
400
400
401
- int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode ())->getIndex ();
401
+ MachineMemOperand *AlignedMMO = getStackAlignedMMO (
402
+ StackPtr, DAG.getMachineFunction (), EltVT.isScalableVector ());
402
403
403
404
// Store the vector.
404
- SDValue Ch = DAG.getStore (
405
- DAG.getEntryNode (), dl, Tmp1, StackPtr,
406
- MachinePointerInfo::getFixedStack (DAG.getMachineFunction (), SPFI));
405
+ SDValue Ch = DAG.getStore (DAG.getEntryNode (), dl, Vec, StackPtr, AlignedMMO);
406
+
407
407
408
408
SDValue StackPtr2 = TLI.getVectorElementPointer (DAG, StackPtr, VT, Tmp3);
409
409
410
410
// Store the scalar value.
411
- Ch = DAG.getTruncStore (
412
- Ch, dl, Tmp2, StackPtr2,
413
- MachinePointerInfo::getUnknownStack (DAG.getMachineFunction ()), EltVT);
414
- // Load the updated vector.
415
- return DAG.getLoad (VT, dl, Ch, StackPtr, MachinePointerInfo::getFixedStack (
416
- DAG.getMachineFunction (), SPFI));
411
+ Ch = DAG.getTruncStore (Ch, dl, Tmp2, StackPtr2, EltVT, AlignedMMO);
412
+
413
+ Align ElementAlignment = std::min (cast<StoreSDNode>(Ch)->getAlign (),
414
+ DAG.getDataLayout ().getPrefTypeAlign (
415
+ VT.getTypeForEVT (*DAG.getContext ())));
416
+
417
+ return DAG.getLoad (VT, dl, Ch, StackPtr, MachinePointerInfo (),
418
+ ElementAlignment);
417
419
}
418
420
419
421
SDValue SelectionDAGLegalize::ExpandINSERT_VECTOR_ELT (SDValue Vec, SDValue Val,
@@ -1489,24 +1491,27 @@ SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {
1489
1491
EVT VecVT = Vec.getValueType ();
1490
1492
EVT SubVecVT = Part.getValueType ();
1491
1493
SDValue StackPtr = DAG.CreateStackTemporary (VecVT);
1492
- int FI = cast<FrameIndexSDNode>(StackPtr.getNode ())->getIndex ();
1493
- MachinePointerInfo PtrInfo =
1494
- MachinePointerInfo::getFixedStack (DAG.getMachineFunction (), FI);
1494
+ MachineMemOperand *AlignedMMO = getStackAlignedMMO (
1495
+ StackPtr, DAG.getMachineFunction (), VecVT.isScalableVector ());
1495
1496
1496
1497
// First store the whole vector.
1497
- SDValue Ch = DAG.getStore (DAG.getEntryNode (), dl, Vec, StackPtr, PtrInfo );
1498
+ SDValue Ch = DAG.getStore (DAG.getEntryNode (), dl, Vec, StackPtr, AlignedMMO );
1498
1499
1499
1500
// Then store the inserted part.
1500
1501
SDValue SubStackPtr =
1501
1502
TLI.getVectorSubVecPointer (DAG, StackPtr, VecVT, SubVecVT, Idx);
1502
1503
1503
1504
// Store the subvector.
1504
- Ch = DAG.getStore (
1505
- Ch, dl, Part, SubStackPtr,
1506
- MachinePointerInfo::getUnknownStack (DAG.getMachineFunction ()));
1505
+ Ch = DAG.getStore (Ch, dl, Part, SubStackPtr, AlignedMMO);
1506
+
1507
+ Align ElementAlignment =
1508
+ std::min (cast<StoreSDNode>(Ch)->getAlign (),
1509
+ DAG.getDataLayout ().getPrefTypeAlign (
1510
+ Op.getValueType ().getTypeForEVT (*DAG.getContext ())));
1507
1511
1508
1512
// Finally, load the updated vector.
1509
- return DAG.getLoad (Op.getValueType (), dl, Ch, StackPtr, PtrInfo);
1513
+ return DAG.getLoad (Op.getValueType (), dl, Ch, StackPtr, MachinePointerInfo (),
1514
+ ElementAlignment);
1510
1515
}
1511
1516
1512
1517
SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack (SDNode* Node) {
0 commit comments