[LLVMdev] Apparent indeterminism in PreVerifier

Sergei Larin slarin at codeaurora.org
Tue Jan 29 08:31:29 PST 2013


Hello everybody,


  I have a case of suspected indeterminism and I would like to verify that
it is not a known issue before I dig deep into it.
It seems to happen during PreVerifier pass ("Preliminary module
verification"). The little I understand/assume about it, a verifier pass is
not supposed to change the code (or is it?) but in debug stream I see the
following:

Common predecessor:

*** IR Dump After Loop-Closed SSA Form Pass ***
for.body.us68:                                    ; preds =
%for.body.lr.ph.us81, %for.body.us68
  %arrayidx.us70.phi = phi i8* [ %buf.0.ph, %for.body.lr.ph.us81 ], [
%arrayidx.us70.inc, %for.body.us68 ]
  %add.ptr4.us72.phi = phi i8* [ %add.ptr4.us72.gep, %for.body.lr.ph.us81 ],
[ %add.ptr4.us72.inc, %for.body.us68 ]
  %i.043.us69 = phi i32 [ 0, %for.body.lr.ph.us81 ], [ %inc.us73,
%for.body.us68 ]
  ...

LV: Found a vectorizable loop (8) in core_state.i
LV: Adding RT check for range:  %add.ptr4.us72.phi = phi i8* [
%add.ptr4.us72.gep, %for.body.lr.ph.us81 ], [ %add.ptr4.us72.inc,
%for.body.us68 ]
LV: Adding RT check for range:  %arrayidx.us70.phi = phi i8* [ %buf.0.ph,
%for.body.lr.ph.us81 ], [ %arrayidx.us70.inc, %for.body.us68 ]



Then there are two possible outcomes triggered by a code change in
completely unrelated portion of the code and rebuild:

*** IR Dump After Preliminary module verification ***

First version:

for.body.us68:                                    ; preds = %scalar.ph,
%for.body.us68
  %arrayidx.us70.phi = phi i8* [ %resume.val200, %scalar.ph ], [
%arrayidx.us70.inc, %for.body.us68 ]
  %add.ptr4.us72.phi = phi i8* [ %resume.val, %scalar.ph ], [
%add.ptr4.us72.inc, %for.body.us68 ]

Second version:

for.body.us68:                                    ; preds = %scalar.ph,
%for.body.us68
  %arrayidx.us70.phi = phi i8* [ %resume.val, %scalar.ph ], [
%arrayidx.us70.inc, %for.body.us68 ]
  %add.ptr4.us72.phi = phi i8* [ %resume.val200, %scalar.ph ], [
%add.ptr4.us72.inc, %for.body.us68 ]

This difference snowballs there after causing different instruction order
and ultimately a different code.

If it rings the bell for anyone, or it is a known issue, please let me know.

Thanks.

Sergei


---
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by
The Linux Foundation






More information about the llvm-dev mailing list