[llvm-dev] RFC: Moving DAG heuristic-based transforms to MI passes

Andrew V. Tischenko via llvm-dev llvm-dev at lists.llvm.org
Fri Jan 27 08:30:30 PST 2017

All llvm-devs,

We're going to introduce the new possible implementation for such 
optimizations as reciprocal estimation instead of fdiv. In short it's a 
replacement of fdiv instruction (which is very expensive in most of 
CPUs) with alternative sequence of instructions which is usually cheaper 
but has appropriate precision (see genReciprocalDiv in 
lib/Target/X86/X86InstrInfo.cpp for details). There are other similar 
optimizations like usage of rsqrt, etc. but at the moment we're dealing 
with recip estimation only - see https://reviews.llvm.org/D26855 for 

The current version of optimization is done at DAG Combiner level when 
we don't know the exact target instructions which will be used by 
CodeGen. As result we don't know the real cost of the alternative 
sequence and can't compare that cost with the cost of the single fdiv. 
As result the decision to select an alternative sequence (made on 
compiler options only) could be wrong because modern CPUs introduce very 
cheap fdiv and we should use it directly.

We suggest to move the implementation from DAG heuristics to 
MI-scheduler-based transformations (Machine Combiner). At that time we 
know exact target instructions and are able to use scheduler-based cost 
model. This knowledge allows as to select proper code sequence for final 
target code generation.

A possible disadvantage of the new implementation is compile time 
increasing (as discussed in D26855), but we expect to make improvements 
in that area. For the initial change (reciprocal transform), any 
difference is limited to fast-math compilations.

Any objections, suggestion, comments?

More information about the llvm-dev mailing list