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