[llvm-dev] DetectDeadLanes is undefing used operands - am I violating an unspoken register hierarchy rule?
via llvm-dev
llvm-dev at lists.llvm.org
Thu Oct 31 20:09:27 PDT 2019
I've spent some time trying to understand LaneBitmasks sufficiently to
understand why DetectDeadLanes is undefing this def-use chain (and many like
it):
(%11 mask=0x0) %11:rwb = AND.
(%8 mask=0x2) %8:rwf_all = COPY %11.sub_l1:rwb
$r0f = COPY %8:rwf_all
Where:
rwf_all is an i1
r0f is in class rwf_all
rwb is an i8, with a single subregister representing the lowermost
bit, sub_l1.
getMaxLaneMaskForVReg(rwf_all) == 0x2 (initial value for %8)
The issue appears to be caused by addUseLanesOnOperand:
composeSubRegIndexLaneMask(sub_l1, 0x2) == 0x4
which is masked by MRI->getMaxLaneMaskForVReg(%11) = 0x2
0x4 & 0x2 yielding 0x0 for %11.
The pass then goes ahead and marks a bunch of things undef/dead, which of
course results in a faulty program.
The one suspicion I have is that it is related to the nature of the rwf_all
class. Every register in rwb has a subregister inside of rwf_all, but not
vice versa. Specifically, rwf_all also includes some flags that are entirely
standalone, not contained within any other register. I believe this is
standard, but is it related to my problem?
-- I also note this comment, within determineInitialDefinedLanes:
// COPY/PHI can copy across unrelated register classes (example:
float/int)
// with incompatible subregister structure. Do not include these in the
// dataflow analysis since we cannot transfer lanemasks in a meaningful
way.
Which may apply to my case, however isCrossCopy is satisfied that rwf_all
and sub_l1::rwb is _not_ a cross copy, as getMatchingSuperRegClass(rwb,
rwf_all, sub_l1)==rwb.
Any insight is appreciated, thank you.
More information about the llvm-dev
mailing list