[LLVMdev] GVN miscompile debugging help

Villmow, Micah Micah.Villmow at amd.com
Fri Aug 10 14:31:00 PDT 2012


Ok, after discussing with this internally some more because of this email, its determined that GVN is doing the right thing here, so this email can be ignored.
Micah

From: Villmow, Micah
Sent: Friday, August 10, 2012 12:49 PM
To: Developers Mailing List
Cc: 'Duncan Sands'
Subject: RE: GVN miscompile debugging help

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> [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/5db9fc28/attachment.html>


More information about the llvm-dev mailing list