[flang-commits] [flang] 914b9ee - [Flang] Fixes for XArrayCoorOp
Kiran Chandramohan via flang-commits
flang-commits at lists.llvm.org
Fri Jun 17 10:15:44 PDT 2022
Author: Kiran Chandramohan
Date: 2022-06-17T17:14:55Z
New Revision: 914b9eec04b5759884ae6ac4995d8293e21efc7e
URL: https://github.com/llvm/llvm-project/commit/914b9eec04b5759884ae6ac4995d8293e21efc7e
DIFF: https://github.com/llvm/llvm-project/commit/914b9eec04b5759884ae6ac4995d8293e21efc7e.diff
LOG: [Flang] Fixes for XArrayCoorOp
The upstreamed code was not incrementing the sliceOffset in multiples
of 3. This issue is fixed by using Offsets and incrementing by 3 during
every iteration.
In the conversion pattern, we were comparing the definingOp of an
operand with an FIR::UndefOp. Use LLVM::UndefOp for conversion.
Reviewed By: clementval, Leporacanthicus
Differential Revision: https://reviews.llvm.org/D128017
Added:
Modified:
flang/lib/Optimizer/CodeGen/CodeGen.cpp
flang/test/Fir/convert-to-llvm.fir
Removed:
################################################################################
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index da88962e7f3f..f1777afd4299 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -2076,6 +2076,11 @@ struct XArrayCoorOpConversion
assert(coor.shift().empty() || coor.shift().size() == rank);
assert(coor.slice().empty() || coor.slice().size() == 3 * rank);
mlir::Type idxTy = lowerTy().indexType();
+ unsigned indexOffset = coor.indicesOffset();
+ unsigned shapeOffset = coor.shapeOffset();
+ unsigned shiftOffset = coor.shiftOffset();
+ unsigned sliceOffset = coor.sliceOffset();
+ auto sliceOps = coor.slice().begin();
mlir::Value one = genConstantIndex(loc, idxTy, rewriter, 1);
mlir::Value prevExt = one;
mlir::Value zero = genConstantIndex(loc, idxTy, rewriter, 0);
@@ -2085,29 +2090,30 @@ struct XArrayCoorOpConversion
const bool baseIsBoxed = coor.memref().getType().isa<fir::BoxType>();
// For each dimension of the array, generate the offset calculation.
- for (unsigned i = 0; i < rank; ++i) {
+ for (unsigned i = 0; i < rank; ++i, ++indexOffset, ++shapeOffset,
+ ++shiftOffset, sliceOffset += 3, sliceOps += 3) {
mlir::Value index =
- integerCast(loc, rewriter, idxTy, operands[coor.indicesOffset() + i]);
- mlir::Value lb = isShifted ? integerCast(loc, rewriter, idxTy,
- operands[coor.shiftOffset() + i])
- : one;
+ integerCast(loc, rewriter, idxTy, operands[indexOffset]);
+ mlir::Value lb =
+ isShifted ? integerCast(loc, rewriter, idxTy, operands[shiftOffset])
+ : one;
mlir::Value step = one;
bool normalSlice = isSliced;
// Compute zero based index in dimension i of the element, applying
// potential triplets and lower bounds.
if (isSliced) {
- mlir::Value ub = operands[coor.sliceOffset() + i + 1];
- normalSlice = !mlir::isa_and_nonnull<fir::UndefOp>(ub.getDefiningOp());
+ mlir::Value originalUb = *(sliceOps + 1);
+ normalSlice =
+ !mlir::isa_and_nonnull<fir::UndefOp>(originalUb.getDefiningOp());
if (normalSlice)
- step = integerCast(loc, rewriter, idxTy,
- operands[coor.sliceOffset() + i + 2]);
+ step = integerCast(loc, rewriter, idxTy, operands[sliceOffset + 2]);
}
auto idx = rewriter.create<mlir::LLVM::SubOp>(loc, idxTy, index, lb);
mlir::Value
diff =
rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, idx, step);
if (normalSlice) {
mlir::Value sliceLb =
- integerCast(loc, rewriter, idxTy, operands[coor.sliceOffset() + i]);
+ integerCast(loc, rewriter, idxTy, operands[sliceOffset]);
auto adj = rewriter.create<mlir::LLVM::SubOp>(loc, idxTy, sliceLb, lb);
diff = rewriter.create<mlir::LLVM::AddOp>(loc, idxTy,
diff , adj);
}
@@ -2125,8 +2131,7 @@ struct XArrayCoorOpConversion
offset = rewriter.create<mlir::LLVM::AddOp>(loc, idxTy, sc, offset);
// Compute next stride assuming contiguity of the base array
// (in element number).
- auto nextExt =
- integerCast(loc, rewriter, idxTy, operands[coor.shapeOffset() + i]);
+ auto nextExt = integerCast(loc, rewriter, idxTy, operands[shapeOffset]);
prevExt =
rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, prevExt, nextExt);
}
diff --git a/flang/test/Fir/convert-to-llvm.fir b/flang/test/Fir/convert-to-llvm.fir
index 99379b4433c3..2ee507a00164 100644
--- a/flang/test/Fir/convert-to-llvm.fir
+++ b/flang/test/Fir/convert-to-llvm.fir
@@ -2117,15 +2117,15 @@ func.func @ext_array_coor6(%arg0: !fir.ref<!fir.array<?x?x?xi32>>, %idx1 : index
// CHECK: %[[VAL_13:.*]] = llvm.add %[[VAL_12]], %[[VAL_7]] : i64
// CHECK: %[[VAL_14:.*]] = llvm.mul %[[VAL_6]], %[[VAL_1]] : i64
// CHECK: %[[VAL_15:.*]] = llvm.sub %[[VAL_5]], %[[VAL_6]] : i64
-// CHECK: %[[VAL_16:.*]] = llvm.mul %[[VAL_15]], %[[VAL_2]] : i64
-// CHECK: %[[VAL_17:.*]] = llvm.sub %[[VAL_3]], %[[VAL_6]] : i64
+// CHECK: %[[VAL_16:.*]] = llvm.mul %[[VAL_15]], %[[VAL_4]] : i64
+// CHECK: %[[VAL_17:.*]] = llvm.sub %[[VAL_2]], %[[VAL_6]] : i64
// CHECK: %[[VAL_18:.*]] = llvm.add %[[VAL_16]], %[[VAL_17]] : i64
// CHECK: %[[VAL_19:.*]] = llvm.mul %[[VAL_18]], %[[VAL_14]] : i64
// CHECK: %[[VAL_20:.*]] = llvm.add %[[VAL_19]], %[[VAL_13]] : i64
// CHECK: %[[VAL_21:.*]] = llvm.mul %[[VAL_14]], %[[VAL_1]] : i64
// CHECK: %[[VAL_22:.*]] = llvm.sub %[[VAL_5]], %[[VAL_6]] : i64
-// CHECK: %[[VAL_23:.*]] = llvm.mul %[[VAL_22]], %[[VAL_3]] : i64
-// CHECK: %[[VAL_24:.*]] = llvm.sub %[[VAL_4]], %[[VAL_6]] : i64
+// CHECK: %[[VAL_23:.*]] = llvm.mul %[[VAL_22]], %[[VAL_4]] : i64
+// CHECK: %[[VAL_24:.*]] = llvm.sub %[[VAL_2]], %[[VAL_6]] : i64
// CHECK: %[[VAL_25:.*]] = llvm.add %[[VAL_23]], %[[VAL_24]] : i64
// CHECK: %[[VAL_26:.*]] = llvm.mul %[[VAL_25]], %[[VAL_21]] : i64
// CHECK: %[[VAL_27:.*]] = llvm.add %[[VAL_26]], %[[VAL_20]] : i64
More information about the flang-commits
mailing list