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
Nadav, As I peel this onion, it looks like you might know something about InnerLoopVectorizer::addRuntimeCheck. What does it do, and can it be causing the below described issue? Could resuming somehow (indeterministically) switch the order of PHIs in the original code? Thanks a lot. Sergei. --- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation> -----Original Message----- > From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] > On Behalf Of Sergei Larin > Sent: Tuesday, January 29, 2013 10:31 AM > To: llvmdev at cs.uiuc.edu > Subject: [LLVMdev] Apparent indeterminism in PreVerifier > > > 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 > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Hi Sergei, "addRuntimeCheck" inserts code that checks that two or more arrays are disjoint. I looked at the code and it looks fine. We generate PHIs in the order that they appear in a vector. The values are inserted in 'canVectorizeMemory', which also looks fine. Please let me know if you think I missed something. Thanks, Nadav On Jan 29, 2013, at 8:48 AM, Sergei Larin <slarin at codeaurora.org> wrote:> Nadav, > > As I peel this onion, it looks like you might know something about > InnerLoopVectorizer::addRuntimeCheck. > What does it do, and can it be causing the below described issue? Could > resuming somehow (indeterministically) switch the order of PHIs in the > original code? > > Thanks a lot. > > Sergei. > > --- > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by > The Linux Foundation > > >> -----Original Message----- >> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] >> On Behalf Of Sergei Larin >> Sent: Tuesday, January 29, 2013 10:31 AM >> To: llvmdev at cs.uiuc.edu >> Subject: [LLVMdev] Apparent indeterminism in PreVerifier >> >> >> 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 >> >> >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >