Issue 159844
Summary createOrFold arith.addi for 0+x doesn't fully fold
Labels new issue
Assignees
Reporter jumerckx
    The fold method for `arith.addi` and similar operations does not define a fold for `0+x-->x`, only for `x+0-->x`. This means that `createOrFold` for `arith.addi(%zero, %a)` creates `arith.addi(%a, %zero)` thanks to the `Commutative` foldTrait.
Is this intended? I think it would make sense for folding to fully fold an addition with zero in all cases.

```cpp
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/Location.h"
#include "mlir/IR/MLIRContext.h"
#include "mlir/IR/Verifier.h"
#include "llvm/Support/raw_ostream.h"

using namespace mlir;
using namespace mlir::arith;

int main() {
  MLIRContext context;
  context.getOrLoadDialect<ArithDialect>();
  
  OpBuilder builder(&context);
  Location loc = builder.getUnknownLoc();
    
  Type i32Type = builder.getI32Type();

  Block b = Block();
  Value blockArg = b.addArgument(i32Type, loc);
  
  Value constantZero = builder.create<ConstantOp>(loc, i32Type, builder.getI32IntegerAttr(0)).getResult();
  Value addiResult = builder.createOrFold<AddIOp>(loc, constantZero, blockArg);
 addiResult.getDefiningOp()->dump(); // 0 + a --> a + 0
  
  
  Value addiResult2 = builder.createOrFold<AddIOp>(loc, blockArg, constantZero);
 addiResult2.dump(); // a + 0 --> a
  return 0;
}
```
```
%0 = arith.addi <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>> : i32
<block argument> of type 'i32' at index: 0
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to