brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.8 KiB · 76b7b4b Raw
200 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature2; Use instcombine to cleanup offset computation.3; RUN: opt -passes=rewrite-statepoints-for-gc,instcombine -S < %s | FileCheck %s4 5target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128-p1:64:64"6target triple = "x86_64-apple-macosx10.11.0"7 8declare void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1), ptr addrspace(1), i32, i32 immarg)9declare void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1), ptr addrspace(1), i32, i32 immarg)10 11define void @test_memcpy_gc_leaf_function(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {12; CHECK-LABEL: define {{[^@]+}}@test_memcpy_gc_leaf_function13; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {14; CHECK-NEXT:  entry:15; CHECK-NEXT:    [[SRC_DERIVED:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]]16; CHECK-NEXT:    [[DEST_DERIVED:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]]17; CHECK-NEXT:    call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 1) #[[ATTR2:[0-9]+]]18; CHECK-NEXT:    call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 2) #[[ATTR2]]19; CHECK-NEXT:    call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 4) #[[ATTR2]]20; CHECK-NEXT:    call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 8) #[[ATTR2]]21; CHECK-NEXT:    call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 16) #[[ATTR2]]22; CHECK-NEXT:    ret void23;24entry:25  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset26  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset27 28  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 1) "gc-leaf-function"29  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 2) "gc-leaf-function"30  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 4) "gc-leaf-function"31  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 8) "gc-leaf-function"32  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 16) "gc-leaf-function"33  ret void34}35 36define void @test_memcpy_element_atomic_1(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {37; CHECK-LABEL: define {{[^@]+}}@test_memcpy_element_atomic_138; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {39; CHECK-NEXT:  entry:40; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memcpy_element_unordered_atomic_safepoint_1, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]41; CHECK-NEXT:    ret void42;43entry:44  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset45  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset46  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 1)47  ret void48}49 50define void @test_memcpy_element_atomic_2(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {51; CHECK-LABEL: define {{[^@]+}}@test_memcpy_element_atomic_252; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {53; CHECK-NEXT:  entry:54; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memcpy_element_unordered_atomic_safepoint_2, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]55; CHECK-NEXT:    ret void56;57entry:58  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset59  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset60  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 2)61  ret void62}63 64define void @test_memcpy_element_atomic_4(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {65; CHECK-LABEL: define {{[^@]+}}@test_memcpy_element_atomic_466; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {67; CHECK-NEXT:  entry:68; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memcpy_element_unordered_atomic_safepoint_4, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]69; CHECK-NEXT:    ret void70;71entry:72  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset73  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset74  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 4)75  ret void76}77 78define void @test_memcpy_element_atomic_8(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {79; CHECK-LABEL: define {{[^@]+}}@test_memcpy_element_atomic_880; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {81; CHECK-NEXT:  entry:82; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memcpy_element_unordered_atomic_safepoint_8, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]83; CHECK-NEXT:    ret void84;85entry:86  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset87  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset88  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 8)89  ret void90}91 92define void @test_memcpy_element_atomic_16(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {93; CHECK-LABEL: define {{[^@]+}}@test_memcpy_element_atomic_1694; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {95; CHECK-NEXT:  entry:96; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memcpy_element_unordered_atomic_safepoint_16, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]97; CHECK-NEXT:    ret void98;99entry:100  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset101  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset102  call void @llvm.memcpy.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 16)103  ret void104}105 106define void @test_memmove_gc_leaf_function(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {107; CHECK-LABEL: define {{[^@]+}}@test_memmove_gc_leaf_function108; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {109; CHECK-NEXT:  entry:110; CHECK-NEXT:    [[SRC_DERIVED:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]]111; CHECK-NEXT:    [[DEST_DERIVED:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]]112; CHECK-NEXT:    call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 1) #[[ATTR2]]113; CHECK-NEXT:    call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 2) #[[ATTR2]]114; CHECK-NEXT:    call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 4) #[[ATTR2]]115; CHECK-NEXT:    call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 8) #[[ATTR2]]116; CHECK-NEXT:    call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 [[SRC_DERIVED]], ptr addrspace(1) align 16 [[DEST_DERIVED]], i32 [[LEN]], i32 16) #[[ATTR2]]117; CHECK-NEXT:    ret void118;119entry:120  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset121  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset122 123  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 1) "gc-leaf-function"124  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 2) "gc-leaf-function"125  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 4) "gc-leaf-function"126  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 8) "gc-leaf-function"127  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 16) "gc-leaf-function"128  ret void129}130 131define void @test_memmove_element_atomic_1(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {132; CHECK-LABEL: define {{[^@]+}}@test_memmove_element_atomic_1133; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {134; CHECK-NEXT:  entry:135; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memmove_element_unordered_atomic_safepoint_1, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]136; CHECK-NEXT:    ret void137;138entry:139  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset140  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset141  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 1)142  ret void143}144 145define void @test_memmove_element_atomic_2(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {146; CHECK-LABEL: define {{[^@]+}}@test_memmove_element_atomic_2147; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {148; CHECK-NEXT:  entry:149; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memmove_element_unordered_atomic_safepoint_2, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]150; CHECK-NEXT:    ret void151;152entry:153  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset154  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset155  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 2)156  ret void157}158 159define void @test_memmove_element_atomic_4(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {160; CHECK-LABEL: define {{[^@]+}}@test_memmove_element_atomic_4161; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {162; CHECK-NEXT:  entry:163; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memmove_element_unordered_atomic_safepoint_4, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]164; CHECK-NEXT:    ret void165;166entry:167  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset168  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset169  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 4)170  ret void171}172 173define void @test_memmove_element_atomic_8(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {174; CHECK-LABEL: define {{[^@]+}}@test_memmove_element_atomic_8175; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {176; CHECK-NEXT:  entry:177; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memmove_element_unordered_atomic_safepoint_8, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]178; CHECK-NEXT:    ret void179;180entry:181  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset182  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset183  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 8)184  ret void185}186 187define void @test_memmove_element_atomic_16(ptr addrspace(1) %src, i64 %src_offset, ptr addrspace(1) %dest, i64 %dest_offset, i32 %len) gc "statepoint-example" {188; CHECK-LABEL: define {{[^@]+}}@test_memmove_element_atomic_16189; CHECK-SAME: (ptr addrspace(1) [[SRC:%.*]], i64 [[SRC_OFFSET:%.*]], ptr addrspace(1) [[DEST:%.*]], i64 [[DEST_OFFSET:%.*]], i32 [[LEN:%.*]]) gc "statepoint-example" {190; CHECK-NEXT:  entry:191; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr nonnull elementtype(void (ptr addrspace(1), i64, ptr addrspace(1), i64, i32)) @__llvm_memmove_element_unordered_atomic_safepoint_16, i32 5, i32 0, ptr addrspace(1) [[SRC]], i64 [[SRC_OFFSET]], ptr addrspace(1) [[DEST]], i64 [[DEST_OFFSET]], i32 [[LEN]], i32 0, i32 0) [ "gc-live"() ]192; CHECK-NEXT:    ret void193;194entry:195  %src_derived = getelementptr inbounds i8, ptr addrspace(1) %src, i64 %src_offset196  %dest_derived = getelementptr inbounds i8, ptr addrspace(1) %dest, i64 %dest_offset197  call void @llvm.memmove.element.unordered.atomic.p1.p1.i32(ptr addrspace(1) align 16 %src_derived, ptr addrspace(1) align 16 %dest_derived, i32 %len, i32 16)198  ret void199}200