[llvm-bugs] [Bug 36129] New: Misoptimization involving memset and store

via llvm-bugs llvm-bugs at lists.llvm.org
Sun Jan 28 14:01:30 PST 2018


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

            Bug ID: 36129
           Summary: Misoptimization involving memset and store
           Product: libraries
           Version: 6.0
          Hardware: Macintosh
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
          Assignee: unassignedbugs at nondot.org
          Reporter: jbc.engelen at gmail.com
                CC: llvm-bugs at lists.llvm.org

Created attachment 19760
  --> https://bugs.llvm.org/attachment.cgi?id=19760&action=edit
O3 output LLVM5.0

The `llvm5.ll` is the optimized (-O3) output of LLVM 5.0 opt of a simple
testcase compiled by LDC. The testcase is setting %dt and %dt2 to the same
value by different means, and asserts that they are equal indeed.
`llvm6.ll` is the output of opt 6.0.0 when optimizing `llvm5.ll`:
reproducer= `opt -O3 llvm5.ll -S -o llvm6.ll`.

LLVM6.0 does a misoptimization and the assert fails.
Zooming in:

```
%datum.DateTime = type { %datum.Date, %datum.TimeOfDay, [1 x i8] }
%datum.Date = type { i16, i8, [1 x i8] }
%datum.TimeOfDay = type { i8, i8, i8 }

define i32 @main....
  %dt2 = alloca i64, align 8
  %tmpcast = bitcast i64* %dt2 to %datum.DateTime*
;...
  %5 = bitcast i64* %dt2 to i8*
  store i64 1, i64* %dt2, align 8
  %6 = getelementptr inbounds %datum.DateTime, %datum.DateTime* %tmpcast, i64
0, i32 1, i32 0
  call void @llvm.memset.p0i8.i64(i8* %6, i8 0, i64 3, i32 4, i1 false) #5
  %7 = getelementptr inbounds %datum.DateTime, %datum.DateTime* %tmpcast, i64
0, i32 1, i32 1
  store i8 30, i8* %7, align 1
```
is optimized to
```
define i32 @main....
  %dt2 = alloca i64, align 8
  %tmpcast = bitcast i64* %dt2 to %datum.DateTime*
;...
  %5 = bitcast i64* %dt2 to i8*
  ; The following store is correct I think
  store i64 32985348833281, i64* %dt2, align 8
  %6 = getelementptr inbounds %datum.DateTime, %datum.DateTime* %tmpcast, i64
0, i32 1, i32 0
  ; This memset overwrites partly the correct value.
  ; I think if this memset would not be there, all would be fine.
  call void @llvm.memset.p0i8.i64(i8* nonnull %6, i8 0, i64 3, i32 4, i1 false)
#4
```

[Remark: I can see that perhaps endianness is tricky here. But actually, the
LLVM optimizer itself converted the type of %dt2 to i64* (instead of
%datum.DateTime*).]

-- 
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/20180128/b36c0f5e/attachment.html>


More information about the llvm-bugs mailing list