[llvm] [AMDGPU] Elide bitcast fold i64 imm to build_vector (PR #154115)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 4 06:51:01 PDT 2025
================
@@ -14584,13 +14584,39 @@ SITargetLowering::performExtractVectorEltCombine(SDNode *N,
return V;
}
+ // EXTRACT_VECTOR_ELT (v2i32 bitcast (i64/f64:k), Idx)
+ // =>
+ // i32:Lo(k) if Idx == 0, or
+ // i32:Hi(k) if Idx == 1
+ auto *Idx = dyn_cast<ConstantSDNode>(N->getOperand(1));
+ if (Vec.getOpcode() == ISD::BITCAST && VecVT == MVT::v2i32 && Idx) {
+ SDLoc SL(N);
+ SDValue PeekThrough = peekThroughBitcasts(Vec);
+ auto *KImm = dyn_cast<ConstantSDNode>(PeekThrough);
+ if (KImm && KImm->getValueType(0).getSizeInBits() == 64) {
+ uint64_t KImmValue = KImm->getZExtValue();
+ if (Idx->getZExtValue() == 0)
+ return DAG.getConstant(Lo_32(KImmValue), SL, MVT::i32);
+ else
+ return DAG.getConstant(Hi_32(KImmValue), SL, MVT::i32);
+ }
+ auto *KFPImm = dyn_cast<ConstantFPSDNode>(PeekThrough);
+ if (KFPImm && KFPImm->getValueType(0).getSizeInBits() == 64) {
+ uint64_t KFPImmValue =
+ KFPImm->getValueAPF().bitcastToAPInt().getZExtValue();
+ if (Idx->getZExtValue() == 0)
+ return DAG.getConstant(Lo_32(KFPImmValue), SL, MVT::i32);
+ else
+ return DAG.getConstant(Hi_32(KFPImmValue), SL, MVT::i32);
----------------
arsenm wrote:
Same as above
https://github.com/llvm/llvm-project/pull/154115
More information about the llvm-commits
mailing list