Nikita Popov | 84feca6 | 2020-10-02 19:16:37 +0200 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
Nikita Popov | cd6f40f | 2020-10-02 20:48:39 +0200 | [diff] [blame^] | 2 | ; RUN: opt < %s -memcpyopt -S -enable-memcpyopt-memoryssa=0 | FileCheck %s --check-prefixes=CHECK,NO_MSSA |
| 3 | ; RUN: opt < %s -memcpyopt -S -enable-memcpyopt-memoryssa=1 -verify-memoryssa | FileCheck %s --check-prefixes=CHECK,MSSA |
Nikita Popov | 84feca6 | 2020-10-02 19:16:37 +0200 | [diff] [blame] | 4 | |
| 5 | target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" |
| 6 | |
| 7 | ; Don't delete the memcpy in %if.then, even though it depends on an instruction |
| 8 | ; which will be deleted. |
| 9 | |
| 10 | define void @foo(i1 %c, i8* %d, i8* %e, i8* %f) { |
| 11 | ; CHECK-LABEL: @foo( |
| 12 | ; CHECK-NEXT: entry: |
| 13 | ; CHECK-NEXT: [[TMP:%.*]] = alloca [50 x i8], align 8 |
| 14 | ; CHECK-NEXT: [[TMP4:%.*]] = bitcast [50 x i8]* [[TMP]] to i8* |
| 15 | ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, i8* [[TMP4]], i64 1 |
| 16 | ; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* nonnull [[D:%.*]], i8 0, i64 10, i1 false) |
| 17 | ; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP4]], i8 0, i64 11, i1 false) |
| 18 | ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]] |
| 19 | ; CHECK: if.then: |
| 20 | ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[F:%.*]], i8* nonnull align 8 [[TMP4]], i64 30, i1 false) |
| 21 | ; CHECK-NEXT: br label [[EXIT]] |
| 22 | ; CHECK: exit: |
| 23 | ; CHECK-NEXT: ret void |
| 24 | ; |
| 25 | entry: |
| 26 | %tmp = alloca [50 x i8], align 8 |
| 27 | %tmp4 = bitcast [50 x i8]* %tmp to i8* |
| 28 | %tmp1 = getelementptr inbounds i8, i8* %tmp4, i64 1 |
| 29 | call void @llvm.memset.p0i8.i64(i8* nonnull %d, i8 0, i64 10, i1 false) |
| 30 | store i8 0, i8* %tmp4, align 8 |
| 31 | call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull %tmp1, i8* nonnull %d, i64 10, i1 false) |
| 32 | br i1 %c, label %if.then, label %exit |
| 33 | |
| 34 | if.then: |
| 35 | call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %f, i8* nonnull align 8 %tmp4, i64 30, i1 false) |
| 36 | br label %exit |
| 37 | |
| 38 | exit: |
| 39 | ret void |
| 40 | } |
| 41 | |
| 42 | declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i1) |
| 43 | declare void @llvm.memset.p0i8.i64(i8*, i8, i64, i1) |