[LLVMdev] GVN miscompile debugging help
Villmow, Micah
Micah.Villmow at amd.com
Fri Aug 10 12:49:05 PDT 2012
Ok, I think I have a handle on the problem. The changes that cause this were introduced in R141177.
Take this basic block:
f.end: ; preds = %if.else, %if.then62, %if.then
%x.0 = phi i32 [ %conv, %if.then ], [ %tmp81, %if.then62 ], [ %tmp55, %if.else ]
%y.0 = phi i32 [ %conv37, %if.then ], [ %tmp71, %if.then62 ], [ %conv45, %if.else ]
...
%cmp106 = icmp eq i32 %x.0, %y.0
br i1 %cmp106, label %if.then108, label %if.else109
When processing the branch instruction, GVN somehow thinks that it is safe to switch %y.0 for %x.0
Here is if.then108:
if.then108: ; preds = %if.end
br i1 %cmp83, label %if.then113, label %if.end112
Here is if.end112:
if.end112: ; preds = %if.then113, %if.then108
tail call void @barrier(i32 0, i32 1) nounwind
%cmp151 = icmp ult i32 %tmp95, 216
%tmp153 = shl i32 %x.0, 5
%tmp155 = or i32 %., %tmp153
%tmp209 = extractelement <4 x float> %tmp99, i32 0
%tmp210 = insertelement <3 x float> undef, float %tmp209, i32 0
%tmp211 = extractelement <4 x float> %tmp99, i32 1
%tmp212 = insertelement <3 x float> %tmp210, float %tmp211, i32 1
%tmp213 = extractelement <4 x float> %tmp99, i32 2
%tmp214 = insertelement <3 x float> %tmp212, float %tmp213, i32 2
%tmp279 = extractelement <4 x float> %tmp99, i32 3
%tmp280 = fmul float %tmp279, 0xC061252760000000
br label %for.body
Somehow, this optimization on the br instruction is turning
%tmp153 = shl i32 %y.0, 5
into
%tmp153 = shl i32 %x.0, 5
breaking our applications.
My proposed solution is to add this to propagateEquality:
// Don't try to propogate equalities between phi nodes.
if (isa<PHINode>(LHS) || isa<PHINode>(RHS)) continue;
The only other thing I can think of is that isOnlyReachableViaThisEdge has a bug in its logic in this case.
Micah
From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Villmow, Micah
Sent: Friday, August 10, 2012 11:34 AM
To: Developers Mailing List
Subject: [LLVMdev] GVN miscompile debugging help
I found a case where GVN seems to miscompile an OpenCL program. What I am trying to figure out is given a bitcode file, how can I reduce it to a simpler case with bugpoint when I don't have a valid reference compiler available.
Thanks for any tips,
Micah
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120810/0bf193ee/attachment.html>
More information about the llvm-dev
mailing list