blob: 213073b90327540a41a80235ce9d90b3f2f0ac60 [file] [log] [blame]
From 4d15e8e71d8749e1066a27e3bb8064d0637546bd Mon Sep 17 00:00:00 2001
From: Bogdan Graur <bgraur@google.com>
Date: Fri, 10 Dec 2021 16:44:36 +0100
Subject: [PATCH] Revert "X86InstrInfo: Support immediates that are +1/-1
different in optimizeCompareInstr"
This reverts commit 847a6807332b13f43704327c2d30103ec0347c77.
The reverted revision was causing miscompiles that manifest on AMD
machines.
Differential Revision: https://reviews.llvm.org/D115528
---
llvm/lib/Target/X86/X86InstrInfo.cpp | 93 +-----
llvm/lib/Target/X86/X86InstrInfo.h | 3 +-
llvm/test/CodeGen/X86/optimize-compare.mir | 304 ------------------
llvm/test/CodeGen/X86/peep-test-5.ll | 56 ----
.../X86/use-cr-result-of-dom-icmp-st.ll | 12 +-
5 files changed, 25 insertions(+), 443 deletions(-)
delete mode 100644 llvm/test/CodeGen/X86/peep-test-5.ll
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp
index bb5637a31947..ec5d2ac3a5d6 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.cpp
+++ b/llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -4088,8 +4088,8 @@ bool X86InstrInfo::analyzeCompare(const MachineInstr &MI, Register &SrcReg,
bool X86InstrInfo::isRedundantFlagInstr(const MachineInstr &FlagI,
Register SrcReg, Register SrcReg2,
int64_t ImmMask, int64_t ImmValue,
- const MachineInstr &OI, bool *IsSwapped,
- int64_t *ImmDelta) const {
+ const MachineInstr &OI,
+ bool *IsSwapped) const {
switch (OI.getOpcode()) {
case X86::CMP64rr:
case X86::CMP32rr:
@@ -4140,21 +4140,10 @@ bool X86InstrInfo::isRedundantFlagInstr(const MachineInstr &FlagI,
int64_t OIMask;
int64_t OIValue;
if (analyzeCompare(OI, OISrcReg, OISrcReg2, OIMask, OIValue) &&
- SrcReg == OISrcReg && ImmMask == OIMask) {
- if (OIValue == ImmValue) {
- *ImmDelta = 0;
- return true;
- } else if (static_cast<uint64_t>(ImmValue) ==
- static_cast<uint64_t>(OIValue) - 1) {
- *ImmDelta = -1;
- return true;
- } else if (static_cast<uint64_t>(ImmValue) ==
- static_cast<uint64_t>(OIValue) + 1) {
- *ImmDelta = 1;
- return true;
- } else {
- return false;
- }
+ SrcReg == OISrcReg && ImmMask == OIMask && OIValue == ImmValue) {
+ assert(SrcReg2 == X86::NoRegister && OISrcReg2 == X86::NoRegister &&
+ "should not have 2nd register");
+ return true;
}
}
return FlagI.isIdenticalTo(OI);
@@ -4404,7 +4393,6 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
bool ShouldUpdateCC = false;
bool IsSwapped = false;
X86::CondCode NewCC = X86::COND_INVALID;
- int64_t ImmDelta = 0;
// Search backward from CmpInstr for the next instruction defining EFLAGS.
const TargetRegisterInfo *TRI = &getRegisterInfo();
@@ -4451,7 +4439,7 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
// ... // EFLAGS not changed
// cmp x, y // <-- can be removed
if (isRedundantFlagInstr(CmpInstr, SrcReg, SrcReg2, CmpMask, CmpValue,
- Inst, &IsSwapped, &ImmDelta)) {
+ Inst, &IsSwapped)) {
Sub = &Inst;
break;
}
@@ -4485,7 +4473,7 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
// It is safe to remove CmpInstr if EFLAGS is redefined or killed.
// If we are done with the basic block, we need to check whether EFLAGS is
// live-out.
- bool FlagsMayLiveOut = true;
+ bool IsSafe = false;
SmallVector<std::pair<MachineInstr*, X86::CondCode>, 4> OpsToUpdate;
MachineBasicBlock::iterator AfterCmpInstr =
std::next(MachineBasicBlock::iterator(CmpInstr));
@@ -4495,7 +4483,7 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
// We should check the usage if this instruction uses and updates EFLAGS.
if (!UseEFLAGS && ModifyEFLAGS) {
// It is safe to remove CmpInstr if EFLAGS is updated again.
- FlagsMayLiveOut = false;
+ IsSafe = true;
break;
}
if (!UseEFLAGS && !ModifyEFLAGS)
@@ -4503,7 +4491,7 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
// EFLAGS is used by this instruction.
X86::CondCode OldCC = X86::COND_INVALID;
- if (MI || IsSwapped || ImmDelta != 0) {
+ if (MI || IsSwapped) {
// We decode the condition code from opcode.
if (Instr.isBranch())
OldCC = X86::getCondFromBranch(Instr);
@@ -4555,60 +4543,11 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
// to be changed from r2 > r1 to r1 < r2, from r2 < r1 to r1 > r2, etc.
// We swap the condition code and synthesize the new opcode.
ReplacementCC = getSwappedCondition(OldCC);
- if (ReplacementCC == X86::COND_INVALID) return false;
- ShouldUpdateCC = true;
- } else if (ImmDelta != 0) {
- unsigned BitWidth = TRI->getRegSizeInBits(*MRI->getRegClass(SrcReg));
- // Shift amount for min/max constants to adjust for 8/16/32 instruction
- // sizes.
- switch (OldCC) {
- case X86::COND_L: // x <s (C + 1) --> x <=s C
- if (ImmDelta != 1 || APInt::getSignedMinValue(BitWidth) == CmpValue)
- return false;
- ReplacementCC = X86::COND_LE;
- break;
- case X86::COND_B: // x <u (C + 1) --> x <=u C
- if (ImmDelta != 1 || CmpValue == 0)
- return false;
- ReplacementCC = X86::COND_BE;
- break;
- case X86::COND_GE: // x >=s (C + 1) --> x >s C
- if (ImmDelta != 1 || APInt::getSignedMinValue(BitWidth) == CmpValue)
- return false;
- ReplacementCC = X86::COND_G;
- break;
- case X86::COND_AE: // x >=u (C + 1) --> x >u C
- if (ImmDelta != 1 || CmpValue == 0)
- return false;
- ReplacementCC = X86::COND_A;
- break;
- case X86::COND_G: // x >s (C - 1) --> x >=s C
- if (ImmDelta != -1 || APInt::getSignedMaxValue(BitWidth) == CmpValue)
- return false;
- ReplacementCC = X86::COND_GE;
- break;
- case X86::COND_A: // x >u (C - 1) --> x >=u C
- if (ImmDelta != -1 || APInt::getMaxValue(BitWidth) == CmpValue)
- return false;
- ReplacementCC = X86::COND_AE;
- break;
- case X86::COND_LE: // x <=s (C - 1) --> x <s C
- if (ImmDelta != -1 || APInt::getSignedMaxValue(BitWidth) == CmpValue)
- return false;
- ReplacementCC = X86::COND_L;
- break;
- case X86::COND_BE: // x <=u (C - 1) --> x <u C
- if (ImmDelta != -1 || APInt::getMaxValue(BitWidth) == CmpValue)
- return false;
- ReplacementCC = X86::COND_B;
- break;
- default:
+ if (ReplacementCC == X86::COND_INVALID)
return false;
- }
- ShouldUpdateCC = true;
}
- if (ShouldUpdateCC && ReplacementCC != OldCC) {
+ if ((ShouldUpdateCC || IsSwapped) && ReplacementCC != OldCC) {
// Push the MachineInstr to OpsToUpdate.
// If it is safe to remove CmpInstr, the condition code of these
// instructions will be modified.
@@ -4616,14 +4555,14 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
}
if (ModifyEFLAGS || Instr.killsRegister(X86::EFLAGS, TRI)) {
// It is safe to remove CmpInstr if EFLAGS is updated again or killed.
- FlagsMayLiveOut = false;
+ IsSafe = true;
break;
}
}
- // If we have to update users but EFLAGS is live-out abort, since we cannot
- // easily find all of the users.
- if (ShouldUpdateCC && FlagsMayLiveOut) {
+ // If EFLAGS is not killed nor re-defined, we should check whether it is
+ // live-out. If it is live-out, do not optimize.
+ if ((MI || IsSwapped) && !IsSafe) {
for (MachineBasicBlock *Successor : CmpMBB.successors())
if (Successor->isLiveIn(X86::EFLAGS))
return false;
diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h
index 33ce55bbdb2b..537ada6222bf 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.h
+++ b/llvm/lib/Target/X86/X86InstrInfo.h
@@ -643,8 +643,7 @@ private:
/// CMP %1, %2 and %3 = SUB %2, %1 ; IsSwapped=true
bool isRedundantFlagInstr(const MachineInstr &FlagI, Register SrcReg,
Register SrcReg2, int64_t ImmMask, int64_t ImmValue,
- const MachineInstr &OI, bool *IsSwapped,
- int64_t *ImmDelta) const;
+ const MachineInstr &OI, bool *IsSwapped) const;
};
} // namespace llvm
diff --git a/llvm/test/CodeGen/X86/optimize-compare.mir b/llvm/test/CodeGen/X86/optimize-compare.mir
index 968ee7804b83..dc15cbbab8b1 100644
--- a/llvm/test/CodeGen/X86/optimize-compare.mir
+++ b/llvm/test/CodeGen/X86/optimize-compare.mir
@@ -379,307 +379,3 @@ body: |
CMP64ri32 %0, 24, implicit-def $eflags
$cl = SETCCr 3, implicit $eflags
...
----
-name: opt_redundant_flags_adjusted_imm_0
-body: |
- bb.0:
- ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_0
- ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
- ; CHECK-NEXT: CMP64ri8 [[COPY]], 1, implicit-def $eflags
- ; CHECK-NEXT: $cl = SETCCr 4, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 7, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 14, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags
- %0:gr64 = COPY $rsi
- ; CMP+SETCC %0 == 1
- CMP64ri8 %0, 1, implicit-def $eflags
- $cl = SETCCr 4, implicit $eflags
- ; CMP+SETCC %0 >= 2; CMP can be removed.
- CMP64ri8 %0, 2, implicit-def $eflags
- ; %0 >=s 2 --> %0 >s 1
- $bl = SETCCr 13, implicit $eflags
- ; %0 >=u 2 --> %0 >u 1
- $bl = SETCCr 3, implicit $eflags
- ; %0 <s 2 --> %0 <=s 1
- $bl = SETCCr 12, implicit $eflags
- ; %0 <u 2 --> %0 <=u 1
- $bl = SETCCr 2, implicit $eflags
-...
----
-name: opt_redundant_flags_adjusted_imm_1
-body: |
- bb.0:
- ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_1
- ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
- ; CHECK-NEXT: CMP64ri8 [[COPY]], 42, implicit-def $eflags
- ; CHECK-NEXT: $cl = SETCCr 5, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 13, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 3, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags
- ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
- %0:gr64 = COPY $rsi
- ; CMP+SETCC %0 != 42
- CMP64ri8 %0, 42, implicit-def $eflags
- $cl = SETCCr 5, implicit $eflags
- ; CMP+SETCC %0 >= 2; CMP can be removed.
- CMP64ri8 %0, 41, implicit-def $eflags
- ; %0 >s 41 --> %0 >=s 42
- $bl = SETCCr 15, implicit $eflags
- ; %0 >u 41 --> %0 >=u 42
- $bl = SETCCr 7, implicit $eflags
- ; %0 <=s 41 --> %0 <s 42
- $bl = SETCCr 14, implicit $eflags
- ; %0 <=u 41 --> %0 <u 42
- $bl = SETCCr 6, implicit $eflags
-...
----
-name: opt_redundant_flags_adjusted_imm_test_cmp
-body: |
- bb.0:
- ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_test_cmp
- ; CHECK: [[COPY:%[0-9]+]]:gr8 = COPY $bl
- ; CHECK-NEXT: TEST8rr [[COPY]], [[COPY]], implicit-def $eflags
- ; CHECK-NEXT: $cl = SETCCr 14, implicit $eflags
- ; CHECK-NEXT: $cl = SETCCr 7, implicit $eflags
- ; CHECK-NEXT: $cl = SETCCr 12, implicit $eflags
- %0:gr8 = COPY $bl
- TEST8rr %0, %0, implicit-def $eflags
- ; SET %0 <=s 0
- $cl = SETCCr 14, implicit $eflags
- ; CMP should be removed (%0 >=u 1)
- CMP8ri %0, 1, implicit-def $eflags
- $cl = SETCCr 3, implicit $eflags
-
- ; CMP should be removed (%0 <=s -1)
- CMP8ri %0, -1, implicit-def $eflags
- $cl = SETCCr 14, implicit $eflags
-...
----
-name: opt_redundant_flags_adjusted_imm_cmp_test
-body: |
- bb.0:
- ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_cmp_test
- ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
- ; CHECK-NEXT: CMP64ri32 [[COPY]], 1, implicit-def $eflags
- ; CHECK-NEXT: $cl = SETCCr 13, implicit $eflags
- ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $edi
- ; CHECK-NEXT: CMP64ri32 [[COPY1]], -1, implicit-def $eflags
- ; CHECK-NEXT: $cl = SETCCr 14, implicit $eflags
- %0:gr64 = COPY $rsi
- CMP64ri32 %0, 1, implicit-def $eflags
- ; TEST should be removed
- TEST64rr %0, %0, implicit-def $eflags
- $cl = SETCCr 15, implicit $eflags
-
- %1:gr64 = COPY $edi
- CMP64ri32 %1, -1, implicit-def $eflags
- ; TEST should be removed
- TEST64rr %1, %1, implicit-def $eflags
- $cl = SETCCr 12, implicit $eflags
-...
----
-name: opt_redundant_flags_adjusted_imm_noopt_0
-body: |
- bb.0:
- ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_0
- ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
- ; CHECK-NEXT: CMP64ri8 [[COPY]], 42, implicit-def $eflags
- ; CHECK-NEXT: $cl = SETCCr 4, implicit $eflags
- ; CHECK-NEXT: CMP64ri8 [[COPY]], 41, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 4, implicit $eflags
- %0:gr64 = COPY $rsi
- ; CMP+SETCC %0 <s 1
- CMP64ri8 %0, 42, implicit-def $eflags
- $cl = SETCCr 4, implicit $eflags
- ; CMP should not be removed.
- CMP64ri8 %0, 41, implicit-def $eflags
- ; %0 == 41
- $bl = SETCCr 4, implicit $eflags
-...
----
-name: opt_redundant_flags_adjusted_imm_noopt_1
-body: |
- bb.0:
- ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_1
- ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
- ; CHECK-NEXT: CMP32ri [[COPY]], 2147483647, implicit-def $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], 2147483647, implicit-def $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 13, implicit $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags
- ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 3, implicit $eflags
- %0:gr32 = COPY $esi
- ; CMP+SETCC %0 == INT32_MAX
- CMP32ri %0, 2147483647, implicit-def $eflags
- ; CMP should not be removed.
- CMP32ri %0, -2147483648, implicit-def $eflags
- ; %0 <s INT32_MIN
- $bl = SETCCr 12, implicit $eflags
-
- CMP32ri %0, 4294967295, implicit-def $eflags
- ; CMP should not be removed.
- CMP32ri %0, -2147483648, implicit-def $eflags
- $bl = SETCCr 12, implicit $eflags
-
- CMP32ri %0, 2147483647, implicit-def $eflags
- ; CMP should not be removed.
- CMP32ri %0, -2147483648, implicit-def $eflags
- $bl = SETCCr 13, implicit $eflags
-
- CMP32ri %0, 4294967295, implicit-def $eflags
- ; should not be removed
- CMP32ri %0, 0, implicit-def $eflags
- $bl = SETCCr 2, implicit $eflags
-
- CMP32ri %0, 4294967295, implicit-def $eflags
- ; should not be removed
- CMP32ri %0, 0, implicit-def $eflags
- $bl = SETCCr 3, implicit $eflags
-...
----
-name: opt_redundant_flags_adjusted_imm_noopt_2
-body: |
- bb.0:
- ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_2
- ; CHECK: [[COPY:%[0-9]+]]:gr16 = COPY $cx
- ; CHECK-NEXT: CMP16ri [[COPY]], -32768, implicit-def $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], -32768, implicit-def $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 14, implicit $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 0, implicit-def $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 4, implicit $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 0, implicit-def $eflags
- ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags
- ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags
- %0:gr16 = COPY $cx
- ; CMP+SETCC %0 == INT16_MIN
- CMP16ri %0, -32768, implicit-def $eflags
- ; CMP should not be removed.
- CMP16ri %0, 32767, implicit-def $eflags
- ; %0 >s INT16_MAX
- $bl = SETCCr 15, implicit $eflags
-
- CMP16ri %0, 65535, implicit-def $eflags
- ; CMP should not be removed.
- CMP16ri %0, 32767, implicit-def $eflags
- $bl = SETCCr 15, implicit $eflags
-
- CMP16ri %0, -32768, implicit-def $eflags
- ; CMP should not be removed.
- CMP16ri %0, 32767, implicit-def $eflags
- $bl = SETCCr 14, implicit $eflags
-
- CMP16ri %0, 0, implicit-def $eflags
- ; should not be removed
- CMP16ri %0, 65535, implicit-def $eflags
- $bl = SETCCr 4, implicit $eflags
-
- CMP16ri %0, 0, implicit-def $eflags
- ; should not be removed
- CMP16ri %0, 65535, implicit-def $eflags
- $bl = SETCCr 6, implicit $eflags
-...
----
-name: opt_adjusted_imm_multiple_blocks
-body: |
- ; CHECK-LABEL: name: opt_adjusted_imm_multiple_blocks
- ; CHECK: bb.0:
- ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.3(0x40000000)
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $eax
- ; CHECK-NEXT: CMP32ri [[COPY]], 20, implicit-def $eflags
- ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit $eflags
- ; CHECK-NEXT: JMP_1 %bb.3
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: bb.1:
- ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: JCC_1 %bb.2, 15, implicit $eflags
- ; CHECK-NEXT: JMP_1 %bb.3
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: bb.2:
- ; CHECK-NEXT: successors: %bb.3(0x80000000)
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: JMP_1 %bb.3
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: bb.3:
- ; CHECK-NEXT: RET64
- bb.0:
- %0:gr32 = COPY $eax
- CMP32ri %0, 20, implicit-def $eflags
- JCC_1 %bb.1, 4, implicit $eflags
- JMP_1 %bb.3
-
- bb.1:
- ; CMP can be removed when adjusting the JCC.
- CMP32ri %0, 21, implicit-def $eflags
- JCC_1 %bb.2, 13, implicit $eflags
- JMP_1 %bb.3
-
- bb.2:
- JMP_1 %bb.3
-
- bb.3:
- RET64
-...
----
-name: opt_adjusted_imm_multiple_blocks_noopt
-body: |
- ; CHECK-LABEL: name: opt_adjusted_imm_multiple_blocks_noopt
- ; CHECK: bb.0:
- ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.3(0x40000000)
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $eax
- ; CHECK-NEXT: CMP32ri [[COPY]], 20, implicit-def $eflags
- ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit $eflags
- ; CHECK-NEXT: JMP_1 %bb.3
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: bb.1:
- ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: CMP32ri [[COPY]], 21, implicit-def $eflags
- ; CHECK-NEXT: JCC_1 %bb.2, 13, implicit $eflags
- ; CHECK-NEXT: JMP_1 %bb.3
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: bb.2:
- ; CHECK-NEXT: successors: %bb.3(0x80000000)
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: bb.3:
- ; CHECK-NEXT: RET64
- bb.0:
- %0:gr32 = COPY $eax
- CMP32ri %0, 20, implicit-def $eflags
- JCC_1 %bb.1, 4, implicit $eflags
- JMP_1 %bb.3
-
- bb.1:
- ; The following CMP should not be optimized because $eflags is live-out
- CMP32ri %0, 21, implicit-def $eflags
- JCC_1 %bb.2, 13, implicit $eflags
- JMP_1 %bb.3
-
- bb.2:
- liveins: $eflags
- $al = SETCCr 4, implicit $eflags
-
- bb.3:
- RET64
-...
diff --git a/llvm/test/CodeGen/X86/peep-test-5.ll b/llvm/test/CodeGen/X86/peep-test-5.ll
deleted file mode 100644
index 2530cf6576b8..000000000000
--- a/llvm/test/CodeGen/X86/peep-test-5.ll
+++ /dev/null
@@ -1,56 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc -o - %s -mtriple=x86_64-- | FileCheck %s
-; Example of a decref operation with "immortal" objects.
-; void decref(long* refcount) {
-; long count = *refcount;
-; if (count == 1) { free_object() }
-; else if (count > 1) { *refcount = count - 1; }
-; else { /* immortal */ }
-; }
-; Resulting assembly should share flags from single CMP instruction for both
-; conditions!
-define void @decref(i32* %p) {
-; CHECK-LABEL: decref:
-; CHECK: # %bb.0:
-; CHECK-NEXT: pushq %rax
-; CHECK-NEXT: .cfi_def_cfa_offset 16
-; CHECK-NEXT: movl (%rdi), %eax
-; CHECK-NEXT: cmpl $1, %eax
-; CHECK-NEXT: jne .LBB0_2
-; CHECK-NEXT: # %bb.1: # %bb_free
-; CHECK-NEXT: callq free_object@PLT
-; CHECK-NEXT: .LBB0_4: # %end
-; CHECK-NEXT: popq %rax
-; CHECK-NEXT: .cfi_def_cfa_offset 8
-; CHECK-NEXT: retq
-; CHECK-NEXT: .LBB0_2: # %bb2
-; CHECK-NEXT: .cfi_def_cfa_offset 16
-; CHECK-NEXT: jle .LBB0_4
-; CHECK-NEXT: # %bb.3: # %bb_dec
-; CHECK-NEXT: decl %eax
-; CHECK-NEXT: movl %eax, (%rdi)
-; CHECK-NEXT: popq %rax
-; CHECK-NEXT: .cfi_def_cfa_offset 8
-; CHECK-NEXT: retq
- %count = load i32, i32* %p, align 4
- %cmp0 = icmp eq i32 %count, 1
- br i1 %cmp0, label %bb_free, label %bb2
-
-bb2:
- %cmp1 = icmp sgt i32 %count, 1
- br i1 %cmp1, label %bb_dec, label %end
-
-bb_dec:
- %dec = add nsw i32 %count, -1
- store i32 %dec, i32* %p, align 4
- br label %end
-
-bb_free:
- call void @free_object()
- br label %end
-
-end:
- ret void
-}
-
-declare void @free_object()
diff --git a/llvm/test/CodeGen/X86/use-cr-result-of-dom-icmp-st.ll b/llvm/test/CodeGen/X86/use-cr-result-of-dom-icmp-st.ll
index ae25f0522575..baae1ab539e0 100644
--- a/llvm/test/CodeGen/X86/use-cr-result-of-dom-icmp-st.ll
+++ b/llvm/test/CodeGen/X86/use-cr-result-of-dom-icmp-st.ll
@@ -117,8 +117,9 @@ define i64 @ll_a_op_b_1(i64 %a, i64 %b) {
; CHECK-NEXT: cmpq $1, %rdx
; CHECK-NEXT: jg .LBB3_2
; CHECK-NEXT: # %bb.1: # %if.end
+; CHECK-NEXT: testq %rdx, %rdx
; CHECK-NEXT: movl $1, %ecx
-; CHECK-NEXT: cmovlq %rcx, %rax
+; CHECK-NEXT: cmovleq %rcx, %rax
; CHECK-NEXT: imulq %rdi, %rax
; CHECK-NEXT: .LBB3_2: # %return
; CHECK-NEXT: retq
@@ -255,8 +256,9 @@ define i64 @ll_a_1(i64 %a, i64 %b) {
; CHECK-NEXT: cmpq $1, %rdi
; CHECK-NEXT: jg .LBB8_2
; CHECK-NEXT: # %bb.1: # %if.end
+; CHECK-NEXT: testq %rdi, %rdi
; CHECK-NEXT: movl $1, %ecx
-; CHECK-NEXT: cmovlq %rcx, %rax
+; CHECK-NEXT: cmovleq %rcx, %rax
; CHECK-NEXT: imulq %rdi, %rax
; CHECK-NEXT: .LBB8_2: # %return
; CHECK-NEXT: retq
@@ -410,8 +412,9 @@ define i64 @i_a_op_b_1(i32 signext %a, i32 signext %b) {
; CHECK-NEXT: cmpl $1, %eax
; CHECK-NEXT: jg .LBB13_2
; CHECK-NEXT: # %bb.1: # %if.end
+; CHECK-NEXT: testl %eax, %eax
; CHECK-NEXT: movl $1, %eax
-; CHECK-NEXT: cmovll %eax, %ecx
+; CHECK-NEXT: cmovlel %eax, %ecx
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: .LBB13_2: # %return
; CHECK-NEXT: movslq %ecx, %rax
@@ -560,8 +563,9 @@ define i64 @i_a_1(i32 signext %a, i32 signext %b) {
; CHECK-NEXT: cmpl $1, %edi
; CHECK-NEXT: jg .LBB18_2
; CHECK-NEXT: # %bb.1: # %if.end
+; CHECK-NEXT: testl %edi, %edi
; CHECK-NEXT: movl $1, %eax
-; CHECK-NEXT: cmovll %eax, %esi
+; CHECK-NEXT: cmovlel %eax, %esi
; CHECK-NEXT: imull %edi, %esi
; CHECK-NEXT: .LBB18_2: # %return
; CHECK-NEXT: movslq %esi, %rax
--
2.35.0.rc0.227.g00780c9af4-goog