This is an archive of the discontinued LLVM Phabricator instance.

GlobalISel: Reduce G_SHL width if source is extension
ClosedPublic

Authored by arsenm on Aug 17 2020, 5:28 AM.

Details

Summary

shl ([sza]ext x, y) => zext (shl x, y).

Turns expensive 64 bit shifts into 32 bit if it does not overflow the
source type:

This is a port of an AMDGPU DAG combine added in
5fa289f0d8ff85b9e14d2f814a90761378ab54ae. InstCombine does this
already, but we need to do it again here to apply it to shifts
introduced for lowered getelementptrs. This will help matching
addressing modes that use 32-bit offsets in a future patch.

TableGen annoyingly assumes only a single match data operand, so
introduce a reusable struct. However, this still requires defining a
separate GIMatchData for every combine which is still annoying.

Adds a morally equivalent function to the existing
getShiftAmountTy. Without this, we would have to do try to repeatedly
query the legalizer info and guess at what type to use for the shift.

Diff Detail

Event Timeline

arsenm created this revision.Aug 17 2020, 5:28 AM
Herald added a project: Restricted Project. · View Herald TranscriptAug 17 2020, 5:28 AM
arsenm requested review of this revision.Aug 17 2020, 5:28 AM
Petar.Avramovic accepted this revision.Aug 17 2020, 7:31 AM
This revision is now accepted and ready to land.Aug 17 2020, 7:31 AM