[llvm] 96d2cb4 - [LLVM][CodeGen][DirectX] Fix scalarisation when vector ConstantFP is used. (#172684)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 5 05:18:43 PST 2026
Author: Paul Walker
Date: 2026-02-05T13:18:38Z
New Revision: 96d2cb4145b7ae98dda5b4f7492cd6c116fe5ee7
URL: https://github.com/llvm/llvm-project/commit/96d2cb4145b7ae98dda5b4f7492cd6c116fe5ee7
DIFF: https://github.com/llvm/llvm-project/commit/96d2cb4145b7ae98dda5b4f7492cd6c116fe5ee7.diff
LOG: [LLVM][CodeGen][DirectX] Fix scalarisation when vector ConstantFP is used. (#172684)
When using -use-constant-fp-for-fixed-length-splat `splat (float C)`
becomes ConstantFP(C) rather than ConstantVector(C, C, C...).
Added:
llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
Modified:
llvm/lib/Target/DirectX/DXILDataScalarization.cpp
llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
Removed:
llvm/test/CodeGen/DirectX/scalar-bug-117273.ll
################################################################################
diff --git a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp
index b752c49c75dbf..1e069e24e0ade 100644
--- a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp
+++ b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp
@@ -367,18 +367,14 @@ static Constant *transformInitializer(Constant *Init, Type *OrigType,
if (isa<VectorType>(OrigType) && isa<ArrayType>(NewType)) {
// Convert vector initializer to array initializer
SmallVector<Constant *, MaxVecSize> ArrayElements;
- if (ConstantVector *ConstVecInit = dyn_cast<ConstantVector>(Init)) {
- for (unsigned I = 0; I < ConstVecInit->getNumOperands(); ++I)
- ArrayElements.push_back(ConstVecInit->getOperand(I));
- } else if (ConstantDataVector *ConstDataVecInit =
- llvm::dyn_cast<llvm::ConstantDataVector>(Init)) {
- for (unsigned I = 0; I < ConstDataVecInit->getNumElements(); ++I)
- ArrayElements.push_back(ConstDataVecInit->getElementAsConstant(I));
- } else {
- assert(false && "Expected a ConstantVector or ConstantDataVector for "
- "vector initializer!");
- }
+ unsigned E = cast<FixedVectorType>(OrigType)->getNumElements();
+ for (unsigned I = 0; I != E; ++I)
+ if (Constant *Elt = Init->getAggregateElement(I))
+ ArrayElements.push_back(Elt);
+
+ assert(ArrayElements.size() == E &&
+ "Expected fixed length constant aggregate for vector initializer!");
return ConstantArray::get(cast<ArrayType>(NewType), ArrayElements);
}
diff --git a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
index 48a9085820471..57b94ebe19375 100644
--- a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
+++ b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
@@ -2016,7 +2016,7 @@ void DXILBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,
}
} else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
Code = bitc::CST_CODE_FLOAT;
- Type *Ty = CFP->getType();
+ Type *Ty = CFP->getType()->getScalarType();
if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy()) {
Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
} else if (Ty->isX86_FP80Ty()) {
diff --git a/llvm/test/CodeGen/DirectX/scalar-bug-117273.ll b/llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
similarity index 91%
rename from llvm/test/CodeGen/DirectX/scalar-bug-117273.ll
rename to llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
index 43bbe9249aac0..c77a3043303e5 100644
--- a/llvm/test/CodeGen/DirectX/scalar-bug-117273.ll
+++ b/llvm/test/CodeGen/DirectX/scalarize-static-array-of-float-vectors.ll
@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes='dxil-data-scalarization,dxil-flatten-arrays,function(scalarizer<load-store>),dxil-op-lower' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
+; RUN: opt -S -passes='dxil-data-scalarization,dxil-flatten-arrays,function(scalarizer<load-store>),dxil-op-lower' -mtriple=dxil-pc-shadermodel6.3-library -use-constant-fp-for-fixed-length-splat %s | FileCheck %s
@StaticArr = internal constant [8 x <3 x float>] [<3 x float> zeroinitializer, <3 x float> splat (float 5.000000e-01), <3 x float> <float 1.000000e+00, float 5.000000e-01, float 5.000000e-01>, <3 x float> <float 5.000000e-01, float 1.000000e+00, float 5.000000e-01>, <3 x float> <float 5.000000e-01, float 5.000000e-01, float 1.000000e+00>, <3 x float> <float 5.000000e-01, float 1.000000e+00, float 1.000000e+00>, <3 x float> <float 1.000000e+00, float 5.000000e-01, float 1.000000e+00>, <3 x float> <float 1.000000e+00, float 1.000000e+00, float 5.000000e-01>], align 16
More information about the llvm-commits
mailing list