- Notifications
You must be signed in to change notification settings - Fork 15.1k
Closed
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzilla
Description
| Bugzilla Link | 36129 |
| Resolution | FIXED |
| Resolved on | Feb 02, 2018 08:51 |
| Version | 6.0 |
| OS | All |
| Blocks | #35152 |
| Attachments | O3 output LLVM5.0, llvm6.ll output of LLVM6.0's opt on with llvm5.ll as input |
| CC | @DMG862,@zmodem,@hfinkel,@RKSimon,@JonPsson,@rotateright |
Extended Description
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*).]
Metadata
Metadata
Assignees
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzilla