llvm-project/llvm/test/Transforms/InstCombine/pr31990_wrong_memcpy.ll
Mikael Holmen 760dc9aba7 Remove sometimes faulty rewrite of memcpy in instcombine.
Summary:
Solves PR 31990.

The bad rewrite could replace a memcpy of one word with
 store i4 -1
while it should actually be
 store i8 -1

Hopefully opt and llc has improved enough so the original optimization
done by the code isn't needed anymore.

One already existing testcase is affected. It originally tested that
the memcpy was replaced with
 load double
but since we now remove that rewrite it will be
 load i64
instead.

Patch suggestion by Eli Friedman.

Reviewers: eli.friedman, majnemer, efriedma

Reviewed By: efriedma

Subscribers: efriedma, llvm-commits

Differential Revision: https://reviews.llvm.org/D30254

llvm-svn: 296585
2017-03-01 06:45:20 +00:00

27 lines
739 B
LLVM

; RUN: opt -S -instcombine %s -o - | FileCheck %s
; Regression test of PR31990. A memcpy of one byte, copying 0xff, was
; replaced with a single store of an i4 0xf.
@g = constant i8 -1
define void @foo() {
entry:
%0 = alloca i8
%1 = bitcast i8* %0 to i4*
call void @bar(i4* %1)
%2 = bitcast i4* %1 to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %2, i8* @g, i32 1, i32 1, i1 false)
call void @gaz(i8* %2)
ret void
}
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly,
i8* nocapture readonly, i32, i32, i1)
declare void @bar(i4*)
declare void @gaz(i8*)
; The mempcy should be simplified to a single store of an i8, not i4
; CHECK: store i8 -1
; CHECK-NOT: store i4 -1