Adding support for TargetLoweringBase::LibCall


Adding support for TargetLoweringBase::LibCall

TargetLoweringBase::Expand is defined as "Try to expand this to other ops,
otherwise use a libcall." For ISD::UDIV and ISD::SDIV, the choice between
the two possibilities was defined in a rather convoluted way:

  • if DIVREM is legal, expand to DIVREM
  • if DIVREM has a custom lowering, expand to DIVREM
  • if DIVREM libcall is defined and a remainder from the same division is computed elsewhere, expand to a DIVREM libcall
  • else, expand to a DIV libcall

This had the undesirable effect that if both DIV and DIVREM are implemented
as libcalls, then ISD::UDIV and ISD::SDIV are expanded to the heavier DIVREM
libcall, even when the remainder isn't used.

The new code adds a new LegalizeAction, TargetLoweringBase::LibCall, so that
backends can directly control whether they prefer an expansion or a conversion
to a libcall. This makes the generic lowering code even more generic,
allowing its reuse in a wider range of target-specific configurations.

The useful effect is that ARM backend will now generate a call
to aeabi_{i,u}div rather than aeabi_{i,u}divmod in cases where
it doesn't need the remainder. There's no functional change outside
the ARM backend.

Reviewers: t.p.northover, rengolin

Subscribers: t.p.northover, llvm-commits, aemerson

Differential Revision: http://reviews.llvm.org/D13862


askrobovOct 20 2015, 6:14 AM
Differential Revision
D13862: Adding support for TargetLoweringBase::LibCall
rL250825: Combining DIV+REM->DIVREM doesn't belong in LegalizeDAG; move it over into…