https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86136

            Bug ID: 86136
           Summary: Modular multiplication optimization
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mcccs at gmx dot com
  Target Milestone: ---

Optimization: Ofast

GCC can't see that

(a * n) % k = (a * (n % k)) % k

(even) when n is known at compile time.

As a result,

int k (int a) {
    return (a * t) % 5;
}

always gives a different assembly for t = 1, 2, ...

you can also replace 5 with any number

Play with it here: https://godbolt.org/g/HkyHqg

Clang has this bug too.

Reply via email to