@@ -153,18 +153,12 @@ static void doAtomicBinOpExpansion(const LoongArchInstrInfo *TII,
153153 Register ScratchReg = MI.getOperand (1 ).getReg ();
154154 Register AddrReg = MI.getOperand (2 ).getReg ();
155155 Register IncrReg = MI.getOperand (3 ).getReg ();
156- AtomicOrdering Ordering =
157- static_cast <AtomicOrdering>(MI.getOperand (4 ).getImm ());
158156
159157 // .loop:
160- // if(Ordering != AtomicOrdering::Monotonic)
161- // dbar 0
162158 // ll.[w|d] dest, (addr)
163159 // binop scratch, dest, val
164160 // sc.[w|d] scratch, scratch, (addr)
165161 // beqz scratch, loop
166- if (Ordering != AtomicOrdering::Monotonic)
167- BuildMI (LoopMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
168162 BuildMI (LoopMBB, DL,
169163 TII->get (Width == 32 ? LoongArch::LL_W : LoongArch::LL_D), DestReg)
170164 .addReg (AddrReg)
@@ -251,21 +245,15 @@ static void doMaskedAtomicBinOpExpansion(
251245 Register AddrReg = MI.getOperand (2 ).getReg ();
252246 Register IncrReg = MI.getOperand (3 ).getReg ();
253247 Register MaskReg = MI.getOperand (4 ).getReg ();
254- AtomicOrdering Ordering =
255- static_cast <AtomicOrdering>(MI.getOperand (5 ).getImm ());
256248
257249 // .loop:
258- // if(Ordering != AtomicOrdering::Monotonic)
259- // dbar 0
260250 // ll.w destreg, (alignedaddr)
261251 // binop scratch, destreg, incr
262252 // xor scratch, destreg, scratch
263253 // and scratch, scratch, masktargetdata
264254 // xor scratch, destreg, scratch
265255 // sc.w scratch, scratch, (alignedaddr)
266256 // beqz scratch, loop
267- if (Ordering != AtomicOrdering::Monotonic)
268- BuildMI (LoopMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
269257 BuildMI (LoopMBB, DL, TII->get (LoongArch::LL_W), DestReg)
270258 .addReg (AddrReg)
271259 .addImm (0 );
@@ -372,23 +360,20 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
372360 auto LoopHeadMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
373361 auto LoopIfBodyMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
374362 auto LoopTailMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
375- auto TailMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
376363 auto DoneMBB = MF->CreateMachineBasicBlock (MBB.getBasicBlock ());
377364
378365 // Insert new MBBs.
379366 MF->insert (++MBB.getIterator (), LoopHeadMBB);
380367 MF->insert (++LoopHeadMBB->getIterator (), LoopIfBodyMBB);
381368 MF->insert (++LoopIfBodyMBB->getIterator (), LoopTailMBB);
382- MF->insert (++LoopTailMBB->getIterator (), TailMBB);
383- MF->insert (++TailMBB->getIterator (), DoneMBB);
369+ MF->insert (++LoopTailMBB->getIterator (), DoneMBB);
384370
385371 // Set up successors and transfer remaining instructions to DoneMBB.
386372 LoopHeadMBB->addSuccessor (LoopIfBodyMBB);
387373 LoopHeadMBB->addSuccessor (LoopTailMBB);
388374 LoopIfBodyMBB->addSuccessor (LoopTailMBB);
389375 LoopTailMBB->addSuccessor (LoopHeadMBB);
390- LoopTailMBB->addSuccessor (TailMBB);
391- TailMBB->addSuccessor (DoneMBB);
376+ LoopTailMBB->addSuccessor (DoneMBB);
392377 DoneMBB->splice (DoneMBB->end (), &MBB, MI, MBB.end ());
393378 DoneMBB->transferSuccessors (&MBB);
394379 MBB.addSuccessor (LoopHeadMBB);
@@ -402,11 +387,9 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
402387
403388 //
404389 // .loophead:
405- // dbar 0
406390 // ll.w destreg, (alignedaddr)
407391 // and scratch2, destreg, mask
408392 // move scratch1, destreg
409- BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
410393 BuildMI (LoopHeadMBB, DL, TII->get (LoongArch::LL_W), DestReg)
411394 .addReg (AddrReg)
412395 .addImm (0 );
@@ -463,7 +446,6 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
463446 // .looptail:
464447 // sc.w scratch1, scratch1, (addr)
465448 // beqz scratch1, loop
466- // dbar 0x700
467449 BuildMI (LoopTailMBB, DL, TII->get (LoongArch::SC_W), Scratch1Reg)
468450 .addReg (Scratch1Reg)
469451 .addReg (AddrReg)
@@ -472,18 +454,13 @@ bool LoongArchExpandAtomicPseudo::expandAtomicMinMaxOp(
472454 .addReg (Scratch1Reg)
473455 .addMBB (LoopHeadMBB);
474456
475- // .tail:
476- // dbar 0x700
477- BuildMI (TailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0x700 );
478-
479457 NextMBBI = MBB.end ();
480458 MI.eraseFromParent ();
481459
482460 LivePhysRegs LiveRegs;
483461 computeAndAddLiveIns (LiveRegs, *LoopHeadMBB);
484462 computeAndAddLiveIns (LiveRegs, *LoopIfBodyMBB);
485463 computeAndAddLiveIns (LiveRegs, *LoopTailMBB);
486- computeAndAddLiveIns (LiveRegs, *TailMBB);
487464 computeAndAddLiveIns (LiveRegs, *DoneMBB);
488465
489466 return true ;
@@ -535,12 +512,10 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg(
535512 .addReg (CmpValReg)
536513 .addMBB (TailMBB);
537514 // .looptail:
538- // dbar 0
539515 // move scratch, newval
540516 // sc.[w|d] scratch, scratch, (addr)
541517 // beqz scratch, loophead
542518 // b done
543- BuildMI (LoopTailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
544519 BuildMI (LoopTailMBB, DL, TII->get (LoongArch::OR), ScratchReg)
545520 .addReg (NewValReg)
546521 .addReg (LoongArch::R0);
@@ -573,13 +548,11 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg(
573548 .addMBB (TailMBB);
574549
575550 // .looptail:
576- // dbar 0
577551 // andn scratch, dest, mask
578552 // or scratch, scratch, newval
579553 // sc.[w|d] scratch, scratch, (addr)
580554 // beqz scratch, loophead
581555 // b done
582- BuildMI (LoopTailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0 );
583556 BuildMI (LoopTailMBB, DL, TII->get (LoongArch::ANDN), ScratchReg)
584557 .addReg (DestReg)
585558 .addReg (MaskReg);
@@ -598,9 +571,24 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg(
598571 BuildMI (LoopTailMBB, DL, TII->get (LoongArch::B)).addMBB (DoneMBB);
599572 }
600573
574+ AtomicOrdering Ordering =
575+ static_cast <AtomicOrdering>(MI.getOperand (IsMasked ? 6 : 5 ).getImm ());
576+ int hint;
577+
578+ switch (Ordering) {
579+ case AtomicOrdering::Acquire:
580+ case AtomicOrdering::AcquireRelease:
581+ case AtomicOrdering::SequentiallyConsistent:
582+ // TODO: acquire
583+ hint = 0 ;
584+ break ;
585+ default :
586+ hint = 0x700 ;
587+ }
588+
601589 // .tail:
602- // dbar 0x700
603- BuildMI (TailMBB, DL, TII->get (LoongArch::DBAR)).addImm (0x700 );
590+ // dbar 0x700 | acquire
591+ BuildMI (TailMBB, DL, TII->get (LoongArch::DBAR)).addImm (hint );
604592
605593 NextMBBI = MBB.end ();
606594 MI.eraseFromParent ();
0 commit comments