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>