1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -memcpyopt -S | FileCheck %s 3 4; Test memcpy-memcpy dependencies across invoke edges. 5 6; Test that memcpyopt works across the non-unwind edge of an invoke. 7; TODO: Not supported yet. 8 9define hidden void @test_normal(i8* noalias %dst, i8* %src) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 10; CHECK-LABEL: @test_normal( 11; CHECK-NEXT: entry: 12; CHECK-NEXT: [[TEMP:%.*]] = alloca i8, i32 64, align 1 13; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TEMP]], i8* nonnull align 8 [[SRC:%.*]], i64 64, i1 false) 14; CHECK-NEXT: invoke void @invoke_me() 15; CHECK-NEXT: to label [[TRY_CONT:%.*]] unwind label [[LPAD:%.*]] 16; CHECK: lpad: 17; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 } 18; CHECK-NEXT: catch i8* null 19; CHECK-NEXT: ret void 20; CHECK: try.cont: 21; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[DST:%.*]], i8* align 8 [[TEMP]], i64 64, i1 false) 22; CHECK-NEXT: ret void 23; 24entry: 25 %temp = alloca i8, i32 64 26 call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %temp, i8* nonnull align 8 %src, i64 64, i1 false) 27 invoke void @invoke_me() 28 to label %try.cont unwind label %lpad 29 30lpad: 31 landingpad { i8*, i32 } 32 catch i8* null 33 ret void 34 35try.cont: 36 call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %dst, i8* align 8 %temp, i64 64, i1 false) 37 ret void 38} 39 40; Test that memcpyopt works across the unwind edge of an invoke. 41; TODO: Not supported yet. 42 43define hidden void @test_unwind(i8* noalias %dst, i8* %src) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 44; CHECK-LABEL: @test_unwind( 45; CHECK-NEXT: entry: 46; CHECK-NEXT: [[TEMP:%.*]] = alloca i8, i32 64, align 1 47; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TEMP]], i8* nonnull align 8 [[SRC:%.*]], i64 64, i1 false) 48; CHECK-NEXT: invoke void @invoke_me() 49; CHECK-NEXT: to label [[TRY_CONT:%.*]] unwind label [[LPAD:%.*]] 50; CHECK: lpad: 51; CHECK-NEXT: [[TMP0:%.*]] = landingpad { i8*, i32 } 52; CHECK-NEXT: catch i8* null 53; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[DST:%.*]], i8* align 8 [[TEMP]], i64 64, i1 false) 54; CHECK-NEXT: ret void 55; CHECK: try.cont: 56; CHECK-NEXT: ret void 57; 58entry: 59 %temp = alloca i8, i32 64 60 call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %temp, i8* nonnull align 8 %src, i64 64, i1 false) 61 invoke void @invoke_me() 62 to label %try.cont unwind label %lpad 63 64lpad: 65 landingpad { i8*, i32 } 66 catch i8* null 67 call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %dst, i8* align 8 %temp, i64 64, i1 false) 68 ret void 69 70try.cont: 71 ret void 72} 73 74declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) 75declare i32 @__gxx_personality_v0(...) 76declare void @invoke_me() readnone 77