[llvm-bugs] [Bug 27506] New: GVN's propagateEquality propagates	wrong equality
    via llvm-bugs 
    llvm-bugs at lists.llvm.org
       
    Mon Apr 25 01:39:05 PDT 2016
    
    
  
https://llvm.org/bugs/show_bug.cgi?id=27506
            Bug ID: 27506
           Summary: GVN's propagateEquality propagates wrong equality
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
          Assignee: unassignedbugs at nondot.org
          Reporter: kyoonss at gmail.com
                CC: llvm-bugs at lists.llvm.org
    Classification: Unclassified
Created attachment 16264
  --> https://llvm.org/bugs/attachment.cgi?id=16264&action=edit
llvm code that exposes error
GVN's `propagateEquality` propagates wrong equality related to icmp
instructions.
When it propagates such as "(icmp eq A B) == true", it also propagates "A ==
B". However, this may cause an incorrect behavior if either A or B is an
undefined value.
When the source code like below is given, GVN transforms the "b1" block as
shown. Suppose %x has a normal value and %u has the undef value. In the source,
"%aa" is always defined. However, in the target, "%aa" is replaced with "%u",
which is undef.
We attach an input llvm file of "opt -gvn" and a C example code that exposes
the same problem when compiled using "clang -O2". We tested this in both clang
3.7.1 and the trunk.
b0:
  %a = add i32 %x, 1
  %c = icmp eq i32 %a, %u
  br i1 %c, label %b1, label %b2
b1:
  %aa = add i32 %x, 1
  %d = call i32 @bar(i32 %aa)
->
b1:
  %d = call i32 @bar(i32 %u)
-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160425/4f1f284f/attachment-0001.html>
    
    
More information about the llvm-bugs
mailing list