Skip to content

Misoptimization involving memset and store #35477

@JohanEngelen

Description

@JohanEngelen
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

No one assigned

    Labels

    bugzillaIssues migrated from bugzilla

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions