[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