[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