================
@@ -2479,6 +2480,72 @@ OpFoldResult cir::UnaryOp::fold(FoldAdaptor adaptor) {
if (isBoolNot(previous))
return previous.getInput();
+ // Avoid introducing unnecessary duplicate constants in cases where we are
+ // just folding the operation to its input value. If we return the
+ // input attribute from the adapter, a new constant is materialized, but
+ // if we return the input value directly, it avoids that.
+ if (auto srcConst = getInput().getDefiningOp<cir::ConstantOp>()) {
+ if (getKind() == cir::UnaryOpKind::Plus ||
+ (mlir::isa<cir::BoolType>(srcConst.getType()) &&
+ getKind() == cir::UnaryOpKind::Minus))
+ return srcConst.getResult();
+ }
+
+ // Fold unary operations with constant inputs. If the input is a ConstantOp,
+ // it "folds" to its value attribute. If it was some other operation that
+ // was folded, it will be an mlir::Attribute that hasn't yet been
+ // materialized. If it was a value that couldn't be folded, it will be null.
+ if (mlir::Attribute attr = adaptor.getInput()) {
+ // For now, we only attempt to fold simple scalar values.
+ OpFoldResult result =
+ llvm::TypeSwitch<mlir::Attribute, OpFoldResult>(attr)
----------------
xlauko wrote:
nit: I guess auto can be used her as result type is defined in `TypeSwitch`
template.
```suggestion
auto result = llvm::TypeSwitch<mlir::Attribute, OpFoldResult>(attr)
```
https://github.com/llvm/llvm-project/pull/174882
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits