[llvm-bugs] [Bug 32273] New: Miscompilation introduced between r297481 and r297513

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Mar 14 18:10:30 PDT 2017


https://bugs.llvm.org/show_bug.cgi?id=32273

            Bug ID: 32273
           Summary: Miscompilation introduced between r297481 and r297513
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: AArch64
          Assignee: unassignedbugs at nondot.org
          Reporter: andrew.b.adams at gmail.com
                CC: llvm-bugs at lists.llvm.org

Created attachment 18093
  --> https://bugs.llvm.org/attachment.cgi?id=18093&action=edit
.ll that reproduces the bug

The .ll in the attachment, when compiled like so:

llc  -march=aarch64 -O3 -filetype=asm -o good.s test.ll

produces different outputs at r297481 and r297513. The older commit is the
correct one.

It's a boundary condition test, which pads the sides of an image with 42s. It's
a bit weird in that it uses 32-element vectors, which is not a native vector
width on arm. The error does not show up with narrower vectors.

The relevant piece of .ll is:

  %820 = icmp sge i64 %indvars.iv, %368
  %821 = insertelement <32 x i1> undef, i1 %820, i32 0
  %822 = shufflevector <32 x i1> %821, <32 x i1> undef, <32 x i32>
zeroinitializer
...
  %1019 = icmp sle <32 x i32> %362, %825
  %1020 = icmp slt <32 x i32> %825, %363
  %1021 = or <32 x i1> %1019, %822
  %1022 = or <32 x i1> %1021, %1020
  %1023 = select <32 x i1> %1022, <32 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42,
i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8
42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8
42, i8 42, i8 42, i8 42, i8 42>, <32 x i8> %1018
...

Looking at the asm diffs (which are small), the <32 x i1> conditions are
lowered to <32 x i8> vectors in v28 and v31 (%1022), and then the entries are
normalized to either 0 or 255 by a shift left of 7 bits followed by a signed
shift right of 7 bits. The mask is then used in the select instruction to
produce %1023. This normalization is necessary because the select lowers to
bsl, which is a bitwise select. This normalization seems to be missing in the
newer rev. 

I think perhaps llvm has decided it isn't necessary, because many of the things
that go into making v28 and v31 have already been normalized in this way. But
not all of them. I think v9 and v11 (%822?) come from w22 (%820?), which is
last touched by a cset, so it's either 0 or 1, not 0 or 255.

This makes sense given the bad output I'm seeing. I think w22 is the condition
which checks whether we're out-of-bounds in the y axis. The error in the output
I'm seeing is that pixels that are out of bounds are treated as if they are
in-bounds. So w22 being true is not having the desired effect, probably because
it's 1 instead of 255.

-- 
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/20170315/3e371eaf/attachment-0001.html>


More information about the llvm-bugs mailing list