https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94356
Bug ID: 94356 Summary: Missed optimisation: useless multiplication generated for pointer comparison Product: gcc Version: 9.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: pascal_cuoq at hotmail dot com Target Milestone: --- The closest existing ticket I found for this one is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48316 but this seems different enough, although it might be linked. Consider the function: typedef int t[100000]; int f(t *p, long long o) { return p < p+o; } GCC 9.3 with -O2, targeting x86-64, correctly simplifies by p, but still generates a 64x64->64 multiplication in the computation of the offset: f: imulq $400000, %rsi, %rsi xorl %eax, %eax testq %rsi, %rsi setg %al ret (Compiler Explorer link: https://gcc.godbolt.org/z/_pT8E- ) Clang 10 avoids generating the multiplication on this example: f: # @f xorl %eax, %eax testq %rsi, %rsi setg %al retq A variant of this example is this other function g with two offsets: int g(t *p, long long o1, long long o2) { return p+o1 < p+o2; } Clang generates the same code as for “o1<o2”, whereas GCC generates two multiplications: g: imulq $400000, %rsi, %rsi xorl %eax, %eax imulq $400000, %rdx, %rdx cmpq %rdx, %rsi setl %al ret Compiler Explorer link: https://gcc.godbolt.org/z/sDJyHP