[llvm] [X86][ARM] Invert the low bit to get the inverse predicate (NFC) (PR #151748)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 1 11:52:57 PDT 2025
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/151748
>From d506a736198cfa9d5e8a3580631c339ae6456400 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Fri, 1 Aug 2025 14:42:41 -0400
Subject: [PATCH 1/3] [X86][ARM] Invert the low bit to get the inverse
predicate (NFC)
Both ARM and x86 defined their predicate in such a way to allow bit twiddling to get inverse predicates
---
llvm/lib/Target/ARM/Utils/ARMBaseInfo.h | 20 ++---------
llvm/lib/Target/X86/X86InstrInfo.cpp | 45 -------------------------
llvm/lib/Target/X86/X86InstrInfo.h | 6 +++-
3 files changed, 8 insertions(+), 63 deletions(-)
diff --git a/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h b/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
index dc4f811e075c6..ebf4eaa122481 100644
--- a/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
+++ b/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
@@ -46,23 +46,9 @@ enum CondCodes { // Meaning (integer) Meaning (floating-point)
};
inline static CondCodes getOppositeCondition(CondCodes CC) {
- switch (CC) {
- default: llvm_unreachable("Unknown condition code");
- case EQ: return NE;
- case NE: return EQ;
- case HS: return LO;
- case LO: return HS;
- case MI: return PL;
- case PL: return MI;
- case VS: return VC;
- case VC: return VS;
- case HI: return LS;
- case LS: return HI;
- case GE: return LT;
- case LT: return GE;
- case GT: return LE;
- case LE: return GT;
- }
+ // To reverse a condition it's necessary to only invert the low bit:
+
+ return static_cast<CondCodes>(static_cast<unsigned>(CC) ^ 0x1);
}
/// getSwappedCondition - assume the flags are set by MI(a,b), return
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp
index abf365eedec39..6071bbe3da18c 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.cpp
+++ b/llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -3297,51 +3297,6 @@ unsigned X86::getNonNDVariant(unsigned Opc) {
return getNewOpcFromTable(X86ND2NonNDTable, Opc);
}
-/// Return the inverse of the specified condition,
-/// e.g. turning COND_E to COND_NE.
-X86::CondCode X86::GetOppositeBranchCondition(X86::CondCode CC) {
- switch (CC) {
- default:
- llvm_unreachable("Illegal condition code!");
- case X86::COND_E:
- return X86::COND_NE;
- case X86::COND_NE:
- return X86::COND_E;
- case X86::COND_L:
- return X86::COND_GE;
- case X86::COND_LE:
- return X86::COND_G;
- case X86::COND_G:
- return X86::COND_LE;
- case X86::COND_GE:
- return X86::COND_L;
- case X86::COND_B:
- return X86::COND_AE;
- case X86::COND_BE:
- return X86::COND_A;
- case X86::COND_A:
- return X86::COND_BE;
- case X86::COND_AE:
- return X86::COND_B;
- case X86::COND_S:
- return X86::COND_NS;
- case X86::COND_NS:
- return X86::COND_S;
- case X86::COND_P:
- return X86::COND_NP;
- case X86::COND_NP:
- return X86::COND_P;
- case X86::COND_O:
- return X86::COND_NO;
- case X86::COND_NO:
- return X86::COND_O;
- case X86::COND_NE_OR_P:
- return X86::COND_E_AND_NP;
- case X86::COND_E_AND_NP:
- return X86::COND_NE_OR_P;
- }
-}
-
/// Assuming the flags are set by MI(a,b), return the condition code if we
/// modify the instructions such that flags are set by MI(b,a).
static X86::CondCode getSwappedCondition(X86::CondCode CC) {
diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h
index 9dc5f4b0e086e..6237c6bc989df 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.h
+++ b/llvm/lib/Target/X86/X86InstrInfo.h
@@ -85,7 +85,11 @@ unsigned getNonNDVariant(unsigned Opc);
/// GetOppositeBranchCondition - Return the inverse of the specified cond,
/// e.g. turning COND_E to COND_NE.
-CondCode GetOppositeBranchCondition(CondCode CC);
+CondCode GetOppositeBranchCondition(CondCode CC) {
+ // To reverse a condition it's necessary to only invert the low bit:
+
+ return static_cast<CondCode>(static_cast<unsigned>(CC) ^ 0x1);
+}
/// Get the VPCMP immediate for the given condition.
unsigned getVPCMPImmForCond(ISD::CondCode CC);
>From 71533c5d2aacb858677eec45d7a1b1ab815dcdf2 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Fri, 1 Aug 2025 14:51:10 -0400
Subject: [PATCH 2/3] Fix concerns
---
llvm/lib/Target/ARM/Utils/ARMBaseInfo.h | 4 +++-
llvm/lib/Target/X86/X86InstrInfo.h | 1 -
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h b/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
index ebf4eaa122481..2af3e8f0eac80 100644
--- a/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
+++ b/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
@@ -47,7 +47,9 @@ enum CondCodes { // Meaning (integer) Meaning (floating-point)
inline static CondCodes getOppositeCondition(CondCodes CC) {
// To reverse a condition it's necessary to only invert the low bit:
-
+ // Note that unlike in AArch64, flipping the bottom bit for AL is not a valid
+ // predicate.
+ assert(CC != AL && "AL has no opposite condition");
return static_cast<CondCodes>(static_cast<unsigned>(CC) ^ 0x1);
}
diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h
index 6237c6bc989df..822134ed327fc 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.h
+++ b/llvm/lib/Target/X86/X86InstrInfo.h
@@ -87,7 +87,6 @@ unsigned getNonNDVariant(unsigned Opc);
/// e.g. turning COND_E to COND_NE.
CondCode GetOppositeBranchCondition(CondCode CC) {
// To reverse a condition it's necessary to only invert the low bit:
-
return static_cast<CondCode>(static_cast<unsigned>(CC) ^ 0x1);
}
>From 9181c3153ec0a1ed9b0de73a110488a8e90f571b Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Fri, 1 Aug 2025 14:52:47 -0400
Subject: [PATCH 3/3] Add assert for x86
---
llvm/lib/Target/X86/X86InstrInfo.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h
index 822134ed327fc..fb7011431fb31 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.h
+++ b/llvm/lib/Target/X86/X86InstrInfo.h
@@ -87,6 +87,7 @@ unsigned getNonNDVariant(unsigned Opc);
/// e.g. turning COND_E to COND_NE.
CondCode GetOppositeBranchCondition(CondCode CC) {
// To reverse a condition it's necessary to only invert the low bit:
+ assert(CC != COND_INVALID && "COND_INVALID has no inverse!");
return static_cast<CondCode>(static_cast<unsigned>(CC) ^ 0x1);
}
More information about the llvm-commits
mailing list