Skip to content

[mlir][arith] Erroneous canonicalization pattern for arith.addi #140328

Open
@math-fehr

Description

@math-fehr

When running mlir-opt --canonicalize (https://godbolt.org/z/6q9ehf7q7), the following program:

func.func @foo(%x : i2) -> i2 {
  %c-1 = arith.constant -1 : i2
  %c-2 = arith.constant -2 : i2
  %temp = arith.addi %x, %c-2 overflow<nsw> : i2
  %res = arith.addi %temp, %c-1 overflow<nsw> : i2
  func.return %res : i2
}

gets compiled into the following program:

func.func @foo(%arg0: i2) -> i2 {
  %c1_i2 = arith.constant 1 : i2
  %0 = arith.addi %arg0, %c1_i2 overflow<nsw> : i2
  return %0 : i2
}

Note that while I use i2 for the example, there is equivalent issues for any integer sizes (besides 1). Reminder, the allowed values are -2, -1, 0, 1 for i2.
When the input is 1, the first program will return -2, while the second program will return poison.

I played a bit with the alive-like tool I am working on, and what I'm getting is that this canonicalization pattern is buggy whenever the two input adds have only the nsw flag, or if one has the nsw flag and the other has the nsw and nuw flag.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions