|
19 | 19 | #include "Z80Subtarget.h" |
20 | 20 | #include "Z80TargetMachine.h" |
21 | 21 | #include "llvm/ADT/Sequence.h" |
| 22 | +#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" |
22 | 23 | #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" |
23 | 24 | #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h" |
24 | 25 | #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" |
@@ -2472,6 +2473,29 @@ Z80InstructionSelector::foldCompare(MachineInstr &I, MachineIRBuilder &MIB, |
2472 | 2473 | return Z80::COND_INVALID; |
2473 | 2474 | } |
2474 | 2475 |
|
| 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 | + |
2475 | 2499 | if (IsSigned && !OptSize) { |
2476 | 2500 | int64_t Sign = minIntN(OpSize); |
2477 | 2501 | if (OpSize == 8) { |
@@ -2574,7 +2598,7 @@ Z80InstructionSelector::foldCompare(MachineInstr &I, MachineIRBuilder &MIB, |
2574 | 2598 | auto Cmp = MIB.buildInstr(Opc, {}, Ops); |
2575 | 2599 | if (!constrainSelectedInstRegOperands(*Cmp, TII, TRI, RBI)) |
2576 | 2600 | return Z80::COND_INVALID; |
2577 | | - if (IsSigned && OptSize) |
| 2601 | + if (NeedSignedOverflowFix) |
2578 | 2602 | STI.getCallLowering()->buildSCMP(MIB); |
2579 | 2603 | return CC; |
2580 | 2604 | } |
|
0 commit comments