forked from OSchip/llvm-project
[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
This commit is contained in:
parent
fd5a26e610
commit
914b9eec04
|
@ -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])
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue