How to test that GlobalsAA is non unintentionally invalidated

Hello,

During the last month we've faced two cases where some performance degradations were observed due to GlobalsAA not being preserved till the LICM:
  1) New pass pgo-memop-opt (fixed in http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20170403/443360.html)
  2) GVNHoist (when it was moved to the simplification part of the pipeline)
So it would be good to guard against such issues. However, this highly depends on the particular structure of the optimization pipeline.
LIT test like this seems to work:

; RUN: opt < %s -O3 -debug-pass=Details -disable-output 2>&1 | FileCheck %s
; CHECK-NOT: is not preserving 'Globals Alias Analysis'
; CHECK: 'Loop Invariant Code Motion' is not preserving 'Rotate Loops'
<some IR with simple loop>

but looks too hard-coded. Are there ways to do it in a cleaner manner?

Thanks,
Andrei

Hello,

During the last month we've faced two cases where some performance
degradations were observed due to GlobalsAA not being preserved till the
LICM:

Do you mean "compile time" or "generated code performance"?

  1) New pass pgo-memop-opt (fixed in http://lists.llvm.org/
pipermail/llvm-commits/Week-of-Mon-20170403/443360.html)
  2) GVNHoist (when it was moved to the simplification part of the
pipeline)
So it would be good to guard against such issues. However, this highly
depends on the particular structure of the optimization pipeline.
LIT test like this seems to work:

; RUN: opt < %s -O3 -debug-pass=Details -disable-output 2>&1 | FileCheck %s
; CHECK-NOT: is not preserving 'Globals Alias Analysis'
; CHECK: 'Loop Invariant Code Motion' is not preserving 'Rotate Loops'
<some IR with simple loop>

but looks too hard-coded. Are there ways to do it in a cleaner manner?

Yes. Add a flag explicitly to output the state of preserved analysis, for

the specific goal of being used in tests, and use that.

But note: I'm not sure it's entirely reasonable to expect everything in
between here and there to preserve something you want preserved.
These are tradeoffs, and adding a test so you can see when it's not true
seems reasonable, but so would xfailing that test if we add something in
between :slight_smile:

I added a somewhat similar test, with similar intentions as part of https://reviews.llvm.org/D19806, committed in http://llvm.org/viewvc/llvm-project?view=revision&revision=268370. That test didn’t get touched in the 10 months it has been in tree, so it seems to me that testing it like this has a reasonable chance of highlighting accidentally dropping GlobalsAA. Maybe just adding a simple loop that should be optimized by LICM to the same test file (test/Transforms/PhaseOrdering/globalaa-retained.ll) might be all what’s needed?

Thanks,

Kristof