Skip to content

Commit 440c584

Browse files
Merge branch 'main' into extract_vec
2 parents 230f5c6 + 1b2c8f1 commit 440c584

File tree

11 files changed

+62
-26
lines changed

11 files changed

+62
-26
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4562,15 +4562,17 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
45624562
ResolverName += ".resolver";
45634563
}
45644564

4565+
bool ShouldReturnIFunc =
4566+
getTarget().supportsIFunc() && !FD->isCPUSpecificMultiVersion();
4567+
45654568
// If the resolver has already been created, just return it. This lookup may
45664569
// yield a function declaration instead of a resolver on AArch64. That is
45674570
// because we didn't know whether a resolver will be generated when we first
45684571
// encountered a use of the symbol named after this resolver. Therefore,
45694572
// targets which support ifuncs should not return here unless we actually
45704573
// found an ifunc.
45714574
llvm::GlobalValue *ResolverGV = GetGlobalValue(ResolverName);
4572-
if (ResolverGV &&
4573-
(isa<llvm::GlobalIFunc>(ResolverGV) || !getTarget().supportsIFunc()))
4575+
if (ResolverGV && (isa<llvm::GlobalIFunc>(ResolverGV) || !ShouldReturnIFunc))
45744576
return ResolverGV;
45754577

45764578
const CGFunctionInfo &FI = getTypes().arrangeGlobalDeclaration(GD);
@@ -4583,7 +4585,7 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
45834585

45844586
// For cpu_specific, don't create an ifunc yet because we don't know if the
45854587
// cpu_dispatch will be emitted in this translation unit.
4586-
if (getTarget().supportsIFunc() && !FD->isCPUSpecificMultiVersion()) {
4588+
if (ShouldReturnIFunc) {
45874589
unsigned AS = getTypes().getTargetAddressSpace(FD->getType());
45884590
llvm::Type *ResolverType =
45894591
llvm::FunctionType::get(llvm::PointerType::get(DeclTy, AS), false);
@@ -4602,11 +4604,9 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) {
46024604

46034605
llvm::Constant *Resolver = GetOrCreateLLVMFunction(
46044606
ResolverName, DeclTy, GlobalDecl{}, /*ForVTable=*/false);
4605-
assert(isa<llvm::GlobalValue>(Resolver) &&
4607+
assert(isa<llvm::GlobalValue>(Resolver) && !ResolverGV &&
46064608
"Resolver should be created for the first time");
46074609
SetCommonAttributes(FD, cast<llvm::GlobalValue>(Resolver));
4608-
if (ResolverGV)
4609-
replaceDeclarationWith(ResolverGV, Resolver);
46104610
return Resolver;
46114611
}
46124612

clang/test/CodeGen/attr-cpuspecific.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ void usages(void) {
154154
CpuSpecificNoDispatch();
155155
// LINUX: @CpuSpecificNoDispatch.ifunc()
156156
// WINDOWS: @CpuSpecificNoDispatch()
157+
//
158+
// Adding another use of CpuSpecificNoDispatch reproduces the
159+
// crash in https://github.com/llvm/llvm-project/issues/115299
160+
CpuSpecificNoDispatch();
161+
// LINUX: @CpuSpecificNoDispatch.ifunc()
162+
// WINDOWS: @CpuSpecificNoDispatch()
157163
OrderDispatchUsageSpecific();
158164
// LINUX: @OrderDispatchUsageSpecific.ifunc()
159165
// WINDOWS: @OrderDispatchUsageSpecific()

mlir/include/mlir/Dialect/Linalg/TransformOps/LinalgTransformOps.td

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@ def ApplyDecomposeTensorPackUnpackPatternsOp
5252
let assemblyFormat = "attr-dict";
5353
}
5454

55+
def ApplyDecomposeTensorPadPatternsOp
56+
: Op<Transform_Dialect, "apply_patterns.linalg.decompose_pad",
57+
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
58+
let description = [{
59+
Collect patterns to decompose tensor.pad into e.g. tensor::EmptyOp,
60+
linalg::FillOp and tensor::InsertSliceOp.
61+
}];
62+
63+
let assemblyFormat = "attr-dict";
64+
}
65+
5566
def ApplyFoldUnitExtentDimsViaReshapesPatternsOp : Op<Transform_Dialect,
5667
"apply_patterns.linalg.fold_unit_extent_dims_via_reshapes",
5768
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {

mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,8 +1503,8 @@ using OptimizeCopyFn =
15031503

15041504
/// Rewrite a tensor::PadOp into a sequence of EmptyOp, FillOp and
15051505
/// InsertSliceOp. For now, only constant padding values are supported.
1506-
struct GeneralizePadOpPattern : public OpRewritePattern<tensor::PadOp> {
1507-
GeneralizePadOpPattern(MLIRContext *context, PatternBenefit benefit = 1)
1506+
struct DecomposePadOpPattern : public OpRewritePattern<tensor::PadOp> {
1507+
DecomposePadOpPattern(MLIRContext *context, PatternBenefit benefit = 1)
15081508
: OpRewritePattern<tensor::PadOp>(context, benefit) {}
15091509
LogicalResult matchAndRewrite(tensor::PadOp padOp,
15101510
PatternRewriter &rewriter) const override;
@@ -1688,6 +1688,10 @@ void populateDecomposeConvolutionPatterns(RewritePatternSet &patterns,
16881688
/// outer dims to be unit.
16891689
void populateDecomposePackUnpackPatterns(RewritePatternSet &patterns);
16901690

1691+
/// Populates patterns to decompose tensor.pad into e.g.
1692+
/// tensor.empty, linalg.fill, tensor.insert_slice.
1693+
void populateDecomposePadPatterns(RewritePatternSet &patterns);
1694+
16911695
/// Populates patterns to transform linalg.conv_2d_xxx operations into
16921696
/// linalg.generic (for img2col packing) and linalg.matmul.
16931697
/// \see rewriteInIm2Col for more details.

mlir/lib/Conversion/TensorToLinalg/TensorToLinalg.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,7 @@ using namespace mlir;
2525
//===----------------------------------------------------------------------===//
2626

2727
void mlir::populateTensorToLinalgPatterns(RewritePatternSet &patterns) {
28-
patterns.add<mlir::linalg::GeneralizePadOpPattern>(patterns.getContext());
28+
// TODO: Add the remaining patterns, e.g. to decompose Pack/Unpack Ops.
29+
// Alternatively, delete this file.
30+
patterns.add<mlir::linalg::DecomposePadOpPattern>(patterns.getContext());
2931
}

mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,11 @@ void transform::ApplyDecomposeTensorPackUnpackPatternsOp::populatePatterns(
234234
linalg::populateDecomposePackUnpackPatterns(patterns);
235235
}
236236

237+
void transform::ApplyDecomposeTensorPadPatternsOp::populatePatterns(
238+
RewritePatternSet &patterns) {
239+
linalg::populateDecomposePadPatterns(patterns);
240+
}
241+
237242
void transform::ApplyFoldUnitExtentDimsViaReshapesPatternsOp::populatePatterns(
238243
RewritePatternSet &patterns) {
239244
linalg::ControlDropUnitDims options;
@@ -3491,8 +3496,12 @@ transform::VectorizeChildrenAndApplyPatternsOp::applyToOne(
34913496
// Add misc. vectorization patterns (e.g. for tensor.insert_slice)
34923497
linalg::populateInsertSliceVectorizationPatterns(patterns);
34933498

3494-
if (getVectorizePadding())
3499+
if (getVectorizePadding()) {
34953500
linalg::populatePadOpVectorizationPatterns(patterns);
3501+
// This creates an alternative path for lowering tensor.pad - by
3502+
// decomposing it into e.g. linalg.fill.
3503+
linalg::populateDecomposePadPatterns(patterns);
3504+
}
34963505
vector::populateVectorStepLoweringPatterns(patterns);
34973506

34983507
TrackingListener listener(state, *this);

mlir/lib/Dialect/Linalg/Transforms/Transforms.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ LogicalResult mlir::linalg::CopyVectorizationPattern::matchAndRewrite(
921921

922922
/// Filling `dest` using FillOp constant padding value if possible.
923923
/// Otherwise, generate a tensor::GenerateOp.
924-
Value GeneralizePadOpPattern::createFillOrGenerateOp(
924+
Value DecomposePadOpPattern::createFillOrGenerateOp(
925925
RewriterBase &rewriter, tensor::PadOp padOp, Value dest,
926926
const SmallVector<Value> &dynSizes) const {
927927
auto padValue = padOp.getConstantPaddingValue();
@@ -938,8 +938,8 @@ Value GeneralizePadOpPattern::createFillOrGenerateOp(
938938
}
939939

940940
LogicalResult
941-
GeneralizePadOpPattern::matchAndRewrite(tensor::PadOp padOp,
942-
PatternRewriter &rewriter) const {
941+
DecomposePadOpPattern::matchAndRewrite(tensor::PadOp padOp,
942+
PatternRewriter &rewriter) const {
943943
// Given an OpFoldResult, return an index-typed value.
944944
auto getIdxValue = [&](OpFoldResult ofr) {
945945
if (auto val = llvm::dyn_cast_if_present<Value>(ofr))
@@ -1623,3 +1623,7 @@ void linalg::populateDecomposePackUnpackPatterns(RewritePatternSet &patterns) {
16231623
// TODO: Add and test patterns for tensor.unpack
16241624
patterns.add<DecomposeOuterUnitDimsPackOpPattern>(patterns.getContext());
16251625
}
1626+
1627+
void linalg::populateDecomposePadPatterns(RewritePatternSet &patterns) {
1628+
patterns.add<DecomposePadOpPattern>(patterns.getContext());
1629+
}

mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2770,12 +2770,6 @@ void mlir::linalg::populateInsertSliceVectorizationPatterns(
27702770

27712771
void mlir::linalg::populatePadOpVectorizationPatterns(
27722772
RewritePatternSet &patterns, PatternBenefit baseBenefit) {
2773-
// TODO: The following pattern implements "decomposition" and
2774-
// optional "vectorization". Seperate "decomposition" into a sepereate
2775-
// pre-processing pattern group.
2776-
patterns.add<GeneralizePadOpPattern>(patterns.getContext(), baseBenefit);
2777-
2778-
// Try these specialized patterns first before resorting to the generic one.
27792773
patterns.add<PadOpVectorizationWithTransferReadPattern,
27802774
PadOpVectorizationWithTransferWritePattern,
27812775
PadOpVectorizationWithInsertSlicePattern>(

mlir/test/Dialect/Linalg/generalize-pad-tensor.mlir renamed to mlir/test/Dialect/Linalg/decompose-pad-tensor.mlir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt -split-input-file --test-linalg-transform-patterns="test-generalize-pad-tensor" %s | FileCheck %s
1+
// RUN: mlir-opt -split-input-file --test-linalg-transform-patterns="test-decompose-pad-tensor" %s | FileCheck %s
22

33
// CHECK-LABEL: func @generalize_pad_tensor_static_shape(
44
// CHECK-SAME: %[[IN:.*]]: tensor<1x28x28x1xf32>) -> tensor<1x32x32x1xf32> {

mlir/test/Dialect/Linalg/vectorization-pad-patterns.mlir

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ module attributes {transform.with_named_sequence} {
202202
%func_op = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.op<"func.func">
203203

204204
transform.apply_patterns to %func_op {
205+
// TODO: Split into two tests, one for each pattern
206+
transform.apply_patterns.linalg.decompose_pad
205207
transform.apply_patterns.linalg.pad_vectorization
206208
} : !transform.op<"func.func">
207209
transform.yield
@@ -236,6 +238,8 @@ module attributes {transform.with_named_sequence} {
236238
%func_op = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.op<"func.func">
237239

238240
transform.apply_patterns to %func_op {
241+
// TODO: Split into two tests, one for each pattern
242+
transform.apply_patterns.linalg.decompose_pad
239243
transform.apply_patterns.linalg.pad_vectorization
240244
} : !transform.op<"func.func">
241245
transform.yield
@@ -270,6 +274,8 @@ module attributes {transform.with_named_sequence} {
270274
%func_op = transform.structured.match ops{["func.func"]} in %arg1 : (!transform.any_op) -> !transform.op<"func.func">
271275

272276
transform.apply_patterns to %func_op {
277+
// TODO: Split into two tests, one for each pattern
278+
transform.apply_patterns.linalg.decompose_pad
273279
transform.apply_patterns.linalg.pad_vectorization
274280
} : !transform.op<"func.func">
275281
transform.yield

0 commit comments

Comments
 (0)