Skip to content

Commit 10d6c6d

Browse files
committed
[Z80] Prevent __setflags emission when signed overflow is impossible
1 parent 6126833 commit 10d6c6d

1 file changed

Lines changed: 25 additions & 1 deletion

File tree

llvm/lib/Target/Z80/GISel/Z80InstructionSelector.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "Z80Subtarget.h"
2020
#include "Z80TargetMachine.h"
2121
#include "llvm/ADT/Sequence.h"
22+
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
2223
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
2324
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
2425
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
@@ -2472,6 +2473,29 @@ Z80InstructionSelector::foldCompare(MachineInstr &I, MachineIRBuilder &MIB,
24722473
return Z80::COND_INVALID;
24732474
}
24742475

2476+
bool NeedSignedOverflowFix = IsSigned && OptSize;
2477+
if (NeedSignedOverflowFix) {
2478+
int64_t SignedMin = minIntN(OpSize);
2479+
int64_t SignedMax = maxIntN(OpSize);
2480+
int64_t LHSMin = SignedMin, LHSMax = SignedMax;
2481+
int64_t RHSMin = SignedMin, RHSMax = SignedMax;
2482+
2483+
KnownBits LHSKnown = this->KB->getKnownBits(LHSReg);
2484+
LHSMin = LHSKnown.getSignedMinValue().getSExtValue();
2485+
LHSMax = LHSKnown.getSignedMaxValue().getSExtValue();
2486+
2487+
if (ConstRHS) {
2488+
RHSMin = RHSMax = ConstRHS->Value.getSExtValue();
2489+
} else {
2490+
KnownBits RHSKnown = this->KB->getKnownBits(RHSReg);
2491+
RHSMin = RHSKnown.getSignedMinValue().getSExtValue();
2492+
RHSMax = RHSKnown.getSignedMaxValue().getSExtValue();
2493+
}
2494+
2495+
NeedSignedOverflowFix = LHSMin - RHSMax < SignedMin ||
2496+
LHSMax - RHSMin > SignedMax;
2497+
}
2498+
24752499
if (IsSigned && !OptSize) {
24762500
int64_t Sign = minIntN(OpSize);
24772501
if (OpSize == 8) {
@@ -2574,7 +2598,7 @@ Z80InstructionSelector::foldCompare(MachineInstr &I, MachineIRBuilder &MIB,
25742598
auto Cmp = MIB.buildInstr(Opc, {}, Ops);
25752599
if (!constrainSelectedInstRegOperands(*Cmp, TII, TRI, RBI))
25762600
return Z80::COND_INVALID;
2577-
if (IsSigned && OptSize)
2601+
if (NeedSignedOverflowFix)
25782602
STI.getCallLowering()->buildSCMP(MIB);
25792603
return CC;
25802604
}

0 commit comments

Comments
 (0)