[Mlir-commits] [mlir] [MLIR] Implement emulation of static indexing subbyte type vector stores (PR #115922)
Andrzej WarzyĆski
llvmlistbot at llvm.org
Fri Jan 10 06:57:09 PST 2025
================
@@ -292,6 +296,89 @@ emulatedVectorLoad(OpBuilder &rewriter, Location loc, Value base,
newLoad);
}
+/// Selects values from two sources based on a mask, and casts the result to a
+/// new type.
+static Value selectAndCast(OpBuilder &builder, Location loc,
+ VectorType castIntoType, Value mask, Value trueValue,
+ Value falseValue) {
+ Value maskedValue =
+ builder.create<arith::SelectOp>(loc, mask, trueValue, falseValue);
+ return builder.create<vector::BitCastOp>(loc, castIntoType, maskedValue);
+}
+
+/// Emits `memref.generic_atomic_rmw` op to store a subbyte-sized value to a
+/// byte in memory, with a mask. The `valueToStore` is a vector of subbyte-sized
+/// elements, with size of 8 bits, and the mask is used to select which elements
+/// to store.
+///
+/// Inputs:
+/// linearizedMemref = |2|2|2|2| : <4xi2> (<1xi8>)
+/// linearizedIndex = 2
+/// valueToStore = |3|3|3|3| : vector<4xi2>
+/// mask = |0|0|1|1| : vector<4xi1>
+///
+/// Result:
+/// linearizedMemref = |2|2|3|3| : <4xi2> (<1xi8>)
+static void atomicStore(OpBuilder &builder, Location loc,
+ MemRefValue linearizedMemref, Value linearizedIndex,
+ VectorValue valueToStore, Value mask) {
+ assert(valueToStore.getType().getRank() == 1 && "expected 1-D vector");
+
+ // Create an atomic load-modify-write region using
+ // `memref.generic_atomic_rmw`.
+ auto atomicOp = builder.create<memref::GenericAtomicRMWOp>(
+ loc, linearizedMemref, ValueRange{linearizedIndex});
+ Value origValue = atomicOp.getCurrentValue();
+
+ OpBuilder::InsertionGuard guard(builder);
+ builder.setInsertionPointToStart(atomicOp.getBody());
+
+ // Load the original value from memory, and cast it to the original element
+ // type.
+ auto oneElemVecType = VectorType::get({1}, origValue.getType());
+ Value origVecValue = builder.create<vector::FromElementsOp>(
+ loc, oneElemVecType, ValueRange{origValue});
+ origVecValue = builder.create<vector::BitCastOp>(loc, valueToStore.getType(),
+ origVecValue);
----------------
banach-space wrote:
Mindful that this bit-cast will also be needed for the non-atomic version, why not move it to `selectAndCast`? To me, this would make most sense:
```cpp
static Value downcastSelectAndUpCast(
OpBuilder &builder,
Location loc,
VectorType downcastType,
VectorType upcastType,
Value mask,
Value trueValue,
Value falseValue) {
// trueDcast = downcast(trueValue);
// falseDcast = downcast(falseValue);
// selectedVal = select(mask, trueValue, falseValue);
// return upcast(selectedVal);
}
```
WDYT? (apologies for poor formatting)
https://github.com/llvm/llvm-project/pull/115922
More information about the Mlir-commits
mailing list