Skip to content

Commit 1deeee3

Browse files
nikictstellar
authored andcommitted
Revert "[Mips] Fix missing sign extension in expansion of sub-word atomic max (#77072)"
These changes caused correctness regressions observed in Rust, see #77072 (comment). This reverts commit 0e501db. This reverts commit fbb27d1.
1 parent 995539c commit 1deeee3

File tree

2 files changed

+81
-594
lines changed

2 files changed

+81
-594
lines changed

llvm/lib/Target/Mips/MipsExpandPseudo.cpp

Lines changed: 9 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -388,32 +388,18 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
388388
Opcode = Mips::XOR;
389389
break;
390390
case Mips::ATOMIC_LOAD_UMIN_I8_POSTRA:
391-
IsUnsigned = true;
392-
IsMin = true;
393-
break;
394391
case Mips::ATOMIC_LOAD_UMIN_I16_POSTRA:
395392
IsUnsigned = true;
396-
IsMin = true;
397-
break;
393+
[[fallthrough]];
398394
case Mips::ATOMIC_LOAD_MIN_I8_POSTRA:
399-
SEOp = Mips::SEB;
400-
IsMin = true;
401-
break;
402395
case Mips::ATOMIC_LOAD_MIN_I16_POSTRA:
403396
IsMin = true;
404397
break;
405398
case Mips::ATOMIC_LOAD_UMAX_I8_POSTRA:
406-
IsUnsigned = true;
407-
IsMax = true;
408-
break;
409399
case Mips::ATOMIC_LOAD_UMAX_I16_POSTRA:
410400
IsUnsigned = true;
411-
IsMax = true;
412-
break;
401+
[[fallthrough]];
413402
case Mips::ATOMIC_LOAD_MAX_I8_POSTRA:
414-
SEOp = Mips::SEB;
415-
IsMax = true;
416-
break;
417403
case Mips::ATOMIC_LOAD_MAX_I16_POSTRA:
418404
IsMax = true;
419405
break;
@@ -475,42 +461,14 @@ bool MipsExpandPseudo::expandAtomicBinOpSubword(
475461

476462
// For little endian we need to clear uninterested bits.
477463
if (STI->isLittle()) {
478-
if (!IsUnsigned) {
479-
BuildMI(loopMBB, DL, TII->get(Mips::SRAV), OldVal)
480-
.addReg(OldVal)
481-
.addReg(ShiftAmnt);
482-
BuildMI(loopMBB, DL, TII->get(Mips::SRAV), Incr)
483-
.addReg(Incr)
484-
.addReg(ShiftAmnt);
485-
if (STI->hasMips32r2()) {
486-
BuildMI(loopMBB, DL, TII->get(SEOp), OldVal).addReg(OldVal);
487-
BuildMI(loopMBB, DL, TII->get(SEOp), Incr).addReg(Incr);
488-
} else {
489-
const unsigned ShiftImm = SEOp == Mips::SEH ? 16 : 24;
490-
BuildMI(loopMBB, DL, TII->get(Mips::SLL), OldVal)
491-
.addReg(OldVal, RegState::Kill)
492-
.addImm(ShiftImm);
493-
BuildMI(loopMBB, DL, TII->get(Mips::SRA), OldVal)
494-
.addReg(OldVal, RegState::Kill)
495-
.addImm(ShiftImm);
496-
BuildMI(loopMBB, DL, TII->get(Mips::SLL), Incr)
497-
.addReg(Incr, RegState::Kill)
498-
.addImm(ShiftImm);
499-
BuildMI(loopMBB, DL, TII->get(Mips::SRA), Incr)
500-
.addReg(Incr, RegState::Kill)
501-
.addImm(ShiftImm);
502-
}
503-
} else {
504-
// and OldVal, OldVal, Mask
505-
// and Incr, Incr, Mask
506-
BuildMI(loopMBB, DL, TII->get(Mips::AND), OldVal)
507-
.addReg(OldVal)
508-
.addReg(Mask);
509-
BuildMI(loopMBB, DL, TII->get(Mips::AND), Incr)
510-
.addReg(Incr)
511-
.addReg(Mask);
512-
}
464+
// and OldVal, OldVal, Mask
465+
// and Incr, Incr, Mask
466+
BuildMI(loopMBB, DL, TII->get(Mips::AND), OldVal)
467+
.addReg(OldVal)
468+
.addReg(Mask);
469+
BuildMI(loopMBB, DL, TII->get(Mips::AND), Incr).addReg(Incr).addReg(Mask);
513470
}
471+
514472
// unsigned: sltu Scratch4, oldVal, Incr
515473
// signed: slt Scratch4, oldVal, Incr
516474
BuildMI(loopMBB, DL, TII->get(SLTScratch4), Scratch4)

0 commit comments

Comments
 (0)