[llvm] ea8b1bf - [X86][FastISel] Refactor bitcast selection into separate function (NFC)
Antonio Frighetto via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 17 06:37:53 PDT 2025
Author: Antonio Frighetto
Date: 2025-04-17T15:36:36+02:00
New Revision: ea8b1bf8895aa6b8a5c668577f845e6a13ddc2e9
URL: https://github.com/llvm/llvm-project/commit/ea8b1bf8895aa6b8a5c668577f845e6a13ddc2e9
DIFF: https://github.com/llvm/llvm-project/commit/ea8b1bf8895aa6b8a5c668577f845e6a13ddc2e9.diff
LOG: [X86][FastISel] Refactor bitcast selection into separate function (NFC)
Added:
Modified:
llvm/lib/Target/X86/X86FastISel.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp
index afe5d7f4bc7ed..d7cb93bdb7376 100644
--- a/llvm/lib/Target/X86/X86FastISel.cpp
+++ b/llvm/lib/Target/X86/X86FastISel.cpp
@@ -124,6 +124,7 @@ class X86FastISel final : public FastISel {
bool X86SelectSIToFP(const Instruction *I);
bool X86SelectUIToFP(const Instruction *I);
bool X86SelectIntToFP(const Instruction *I, bool IsSigned);
+ bool X86SelectBitCast(const Instruction *I);
const X86InstrInfo *getInstrInfo() const {
return Subtarget->getInstrInfo();
@@ -2546,6 +2547,36 @@ bool X86FastISel::X86SelectTrunc(const Instruction *I) {
return true;
}
+bool X86FastISel::X86SelectBitCast(const Instruction *I) {
+ // Select SSE2/AVX bitcasts between 128/256/512 bit vector types.
+ MVT SrcVT, DstVT;
+ if (!Subtarget->hasSSE2() ||
+ !isTypeLegal(I->getOperand(0)->getType(), SrcVT) ||
+ !isTypeLegal(I->getType(), DstVT))
+ return false;
+
+ // Only allow vectors that use xmm/ymm/zmm.
+ if (!SrcVT.isVector() || !DstVT.isVector() ||
+ SrcVT.getVectorElementType() == MVT::i1 ||
+ DstVT.getVectorElementType() == MVT::i1)
+ return false;
+
+ Register Reg = getRegForValue(I->getOperand(0));
+ if (!Reg)
+ return false;
+
+ // Emit a reg-reg copy so we don't propagate cached known bits information
+ // with the wrong VT if we fall out of fast isel after selecting this.
+ const TargetRegisterClass *DstClass = TLI.getRegClassFor(DstVT);
+ Register ResultReg = createResultReg(DstClass);
+ BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(TargetOpcode::COPY),
+ ResultReg)
+ .addReg(Reg);
+
+ updateValueMap(I, ResultReg);
+ return true;
+}
+
bool X86FastISel::IsMemcpySmall(uint64_t Len) {
return Len <= (Subtarget->is64Bit() ? 32 : 16);
}
@@ -3693,36 +3724,8 @@ X86FastISel::fastSelectInstruction(const Instruction *I) {
updateValueMap(I, Reg);
return true;
}
- case Instruction::BitCast: {
- // Select SSE2/AVX bitcasts between 128/256/512 bit vector types.
- if (!Subtarget->hasSSE2())
- return false;
-
- MVT SrcVT, DstVT;
- if (!isTypeLegal(I->getOperand(0)->getType(), SrcVT) ||
- !isTypeLegal(I->getType(), DstVT))
- return false;
-
- // Only allow vectors that use xmm/ymm/zmm.
- if (!SrcVT.isVector() || !DstVT.isVector() ||
- SrcVT.getVectorElementType() == MVT::i1 ||
- DstVT.getVectorElementType() == MVT::i1)
- return false;
-
- Register Reg = getRegForValue(I->getOperand(0));
- if (!Reg)
- return false;
-
- // Emit a reg-reg copy so we don't propagate cached known bits information
- // with the wrong VT if we fall out of fast isel after selecting this.
- const TargetRegisterClass *DstClass = TLI.getRegClassFor(DstVT);
- Register ResultReg = createResultReg(DstClass);
- BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
- TII.get(TargetOpcode::COPY), ResultReg).addReg(Reg);
-
- updateValueMap(I, ResultReg);
- return true;
- }
+ case Instruction::BitCast:
+ return X86SelectBitCast(I);
}
return false;
More information about the llvm-commits
mailing list