Any indispensable passes?

Hi everyone,

I am currently testing out a combination of IR->IR passes with opt to benchmark how they affect performance. The source code works fine if simply use the clang (-O0/-O3) to directly compile to object files and link them. However, when I use opt with a select set of passes and then use llc to compile them to binary, the compiled binary is wrong.

That makes me wonder if there are any IR->IR passes that are indispensable and they are to guarantee the semantics?

Here’s my workflow just in case:

Regards,
Kevin

Can you clarify what you mean by “binary is wrong”? Does the program not link, or does it produce incorrect results when executed? You might try running mem2reg before any other passes in your random list of optimizations. mem2reg does SSA construction; I’d bet that you’re more likely to trigger a bug in other passes if you haven’t run mem2reg first. That said, I don’t think any passes are needed for correctness. You might also try using bugpoint to reduce the bug that you’re seeing. As I said before, you may be triggering bugs that don’t usually show up in the standard pass pipeline. Reducing the bug (and fixing it if you are willing and able) would help improve the quality of the code. Regards, John Criswell

Hi everyone,

I am currently testing out a combination of IR->IR passes with opt to
benchmark how they affect performance. The source code works fine if simply
use the clang (-O0/-O3) to directly compile to object files and link them.
However, when I use opt with a select set of passes and then use llc to
compile them to binary, the compiled binary is wrong.

Can you clarify what you mean by "binary is wrong"? Does the program not
link, or does it produce incorrect results when executed?

You might try running mem2reg before any other passes in your random list
of optimizations. mem2reg does SSA construction; I'd bet that you're more
likely to trigger a bug in other passes if you haven't run mem2reg first.
That said, I don't think any passes are needed for correctness.

SROA does this too (among other things).

-- Sean Silva

Hum, interesting. That would surprise me. I assumed them to do the same thing, but I am not exactly sure. I just tried to clang instead of llc, it seems like the problem remains.

Peizhao

“binary is wrong” refers to it compiles & links but produces incorrect results. I actually tried another combination, in which I used -O3 for opt, and then -O0 for llc, the problem didn’t go away, but when I use -O3 for llc, the binary produces expected results.

Thanks for pointing out for the -mem2reg pass and using the bugpoint tool. BTW, the problem comes from compiling and running gcc in SPEC CPU2006.

Best,
Peizhao

Yeah, it looks like SROA does mem2reg too. One more update is that the following two combinations are fine:

  1. opt (no optimization) + llc (-O0)
  2. opt (-O3) + llc (-O3)

And the problematic combination is “opt (-O3) + llc (-O0)”. Now I suspect that there are even synergistic effects between frontend and backend optimizations. Any comments about that?

Thanks,
Peizhao
http://plrg.eecs.uci.edu/~peizhaoo/profile/

There are passes like UnifyExitNodes that some passes may assume have already been executed. That could trigger a misoptimization. That said, I would really like to see bugpoint try to reduce this bug. Your situation is a perfect case for bugpoint, and bugpoint should be able to reduce the optimizations and code down to a point where someone can tell whether it’s a missing optimization or a bug in an optimization. Regards, John Criswell

Thanks again John. I will go for that direction and hopefully report the problem later if I manage to pinpoint it.

Best,
Peizhao