Skip to content

Commit bb41af6

Browse files
committed
[CIR] Replace CIRAttrVisitor with TypeSwitch
We previously discussed having an mlir-tblgen utility to complete the CIRAttrVisitor implementation with all support attribute types, but when I proposed an implementation to do this, a reviewer suggested using TypeSwitch instead, and I have done that in the incubator. See llvm#126332 This change brings the TypeSwitch implementation into the upstream repo to replace the visitor class.
1 parent 3989b78 commit bb41af6

File tree

2 files changed

+22
-61
lines changed

2 files changed

+22
-61
lines changed

clang/include/clang/CIR/Dialect/IR/CIRAttrVisitor.h

Lines changed: 0 additions & 52 deletions
This file was deleted.

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
2525
#include "mlir/Target/LLVMIR/Export.h"
2626
#include "mlir/Transforms/DialectConversion.h"
27-
#include "clang/CIR/Dialect/IR/CIRAttrVisitor.h"
2827
#include "clang/CIR/Dialect/IR/CIRDialect.h"
2928
#include "clang/CIR/MissingFeatures.h"
3029
#include "clang/CIR/Passes.h"
30+
#include "llvm/ADT/TypeSwitch.h"
3131
#include "llvm/IR/Module.h"
3232
#include "llvm/Support/TimeProfiler.h"
3333

@@ -37,7 +37,7 @@ using namespace llvm;
3737
namespace cir {
3838
namespace direct {
3939

40-
class CIRAttrToValue : public CirAttrVisitor<CIRAttrToValue, mlir::Value> {
40+
class CIRAttrToValue {
4141
public:
4242
CIRAttrToValue(mlir::Operation *parentOp,
4343
mlir::ConversionPatternRewriter &rewriter,
@@ -46,19 +46,26 @@ class CIRAttrToValue : public CirAttrVisitor<CIRAttrToValue, mlir::Value> {
4646

4747
mlir::Value lowerCirAttrAsValue(mlir::Attribute attr) { return visit(attr); }
4848

49-
mlir::Value visitCirIntAttr(cir::IntAttr intAttr) {
49+
mlir::Value visit(mlir::Attribute attr) {
50+
return llvm::TypeSwitch<mlir::Attribute, mlir::Value>(attr)
51+
.Case<cir::IntAttr, cir::FPAttr, cir::ConstPtrAttr>(
52+
[&](auto attrT) { return visitCirAttr(attrT); })
53+
.Default([&](auto attrT) { return mlir::Value(); });
54+
}
55+
56+
mlir::Value visitCirAttr(cir::IntAttr intAttr) {
5057
mlir::Location loc = parentOp->getLoc();
5158
return rewriter.create<mlir::LLVM::ConstantOp>(
5259
loc, converter->convertType(intAttr.getType()), intAttr.getValue());
5360
}
5461

55-
mlir::Value visitCirFPAttr(cir::FPAttr fltAttr) {
62+
mlir::Value visitCirAttr(cir::FPAttr fltAttr) {
5663
mlir::Location loc = parentOp->getLoc();
5764
return rewriter.create<mlir::LLVM::ConstantOp>(
5865
loc, converter->convertType(fltAttr.getType()), fltAttr.getValue());
5966
}
6067

61-
mlir::Value visitCirConstPtrAttr(cir::ConstPtrAttr ptrAttr) {
68+
mlir::Value visitCirAttr(cir::ConstPtrAttr ptrAttr) {
6269
mlir::Location loc = parentOp->getLoc();
6370
if (ptrAttr.isNullValue()) {
6471
return rewriter.create<mlir::LLVM::ZeroOp>(
@@ -81,19 +88,25 @@ class CIRAttrToValue : public CirAttrVisitor<CIRAttrToValue, mlir::Value> {
8188

8289
// This class handles rewriting initializer attributes for types that do not
8390
// require region initialization.
84-
class GlobalInitAttrRewriter
85-
: public CirAttrVisitor<GlobalInitAttrRewriter, mlir::Attribute> {
91+
class GlobalInitAttrRewriter {
8692
public:
8793
GlobalInitAttrRewriter(mlir::Type type,
8894
mlir::ConversionPatternRewriter &rewriter)
8995
: llvmType(type), rewriter(rewriter) {}
9096

9197
mlir::Attribute rewriteInitAttr(mlir::Attribute attr) { return visit(attr); }
9298

93-
mlir::Attribute visitCirIntAttr(cir::IntAttr attr) {
99+
mlir::Attribute visit(mlir::Attribute attr) {
100+
return llvm::TypeSwitch<mlir::Attribute, mlir::Attribute>(attr)
101+
.Case<cir::IntAttr, cir::FPAttr>(
102+
[&](auto attrT) { return visitCirAttr(attrT); })
103+
.Default([&](auto attrT) { return mlir::Attribute(); });
104+
}
105+
106+
mlir::Attribute visitCirAttr(cir::IntAttr attr) {
94107
return rewriter.getIntegerAttr(llvmType, attr.getValue());
95108
}
96-
mlir::Attribute visitCirFPAttr(cir::FPAttr attr) {
109+
mlir::Attribute visitCirAttr(cir::FPAttr attr) {
97110
return rewriter.getFloatAttr(llvmType, attr.getValue());
98111
}
99112

0 commit comments

Comments
 (0)