| ; RUN: llc < %s -mtriple=arm64-eabi -mattr=+mte | FileCheck %s |
| |
| ; test create_tag |
| define i32* @create_tag(i32* %ptr, i32 %m) { |
| entry: |
| ; CHECK-LABEL: create_tag: |
| %0 = bitcast i32* %ptr to i8* |
| %1 = zext i32 %m to i64 |
| %2 = tail call i8* @llvm.aarch64.irg(i8* %0, i64 %1) |
| %3 = bitcast i8* %2 to i32* |
| ret i32* %3 |
| ;CHECK: irg x0, x0, {{x[0-9]+}} |
| } |
| |
| ; *********** __arm_mte_increment_tag ************* |
| ; test increment_tag1 |
| define i32* @increment_tag1(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag1: |
| %0 = bitcast i32* %ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.addg(i8* %0, i64 7) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: addg x0, x0, #0, #7 |
| } |
| |
| %struct.S2K = type { [512 x i32] } |
| define i32* @increment_tag1stack(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag1stack: |
| %s = alloca %struct.S2K, align 4 |
| %0 = bitcast %struct.S2K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 2048, i8* nonnull %0) |
| %1 = call i8* @llvm.aarch64.addg(i8* nonnull %0, i64 7) |
| %2 = bitcast i8* %1 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 2048, i8* nonnull %0) |
| ret i32* %2 |
| ; CHECK: addg x0, sp, #0, #7 |
| } |
| |
| |
| define i32* @increment_tag2(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag2: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 4 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.addg(i8* nonnull %0, i64 7) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: addg x0, x0, #16, #7 |
| } |
| |
| define i32* @increment_tag2stack(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag2stack: |
| %s = alloca %struct.S2K, align 4 |
| %0 = bitcast %struct.S2K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 2048, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S2K, %struct.S2K* %s, i64 0, i32 0, i64 4 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.addg(i8* nonnull %1, i64 7) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 2048, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: addg x0, sp, #16, #7 |
| } |
| |
| define i32* @increment_tag3(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag3: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 252 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.addg(i8* nonnull %0, i64 7) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: addg x0, x0, #1008, #7 |
| } |
| |
| define i32* @increment_tag3stack(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag3stack: |
| %s = alloca %struct.S2K, align 4 |
| %0 = bitcast %struct.S2K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 2048, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S2K, %struct.S2K* %s, i64 0, i32 0, i64 252 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.addg(i8* nonnull %1, i64 7) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 2048, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: addg x0, sp, #1008, #7 |
| } |
| |
| |
| define i32* @increment_tag4(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag4: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 256 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.addg(i8* nonnull %0, i64 7) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: add [[T0:x[0-9]+]], x0, #1024 |
| ; CHECK-NEXT: addg x0, [[T0]], #0, #7 |
| } |
| |
| define i32* @increment_tag4stack(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag4stack: |
| %s = alloca %struct.S2K, align 4 |
| %0 = bitcast %struct.S2K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 2048, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S2K, %struct.S2K* %s, i64 0, i32 0, i64 256 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.addg(i8* nonnull %1, i64 7) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 2048, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: add [[T0:x[0-9]+]], {{.*}}, #1024 |
| ; CHECK-NEXT: addg x0, [[T0]], #0, #7 |
| } |
| |
| |
| define i32* @increment_tag5(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag5: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 5 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.addg(i8* nonnull %0, i64 7) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: add [[T0:x[0-9]+]], x0, #20 |
| ; CHECK-NEXT: addg x0, [[T0]], #0, #7 |
| } |
| |
| define i32* @increment_tag5stack(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: increment_tag5stack: |
| %s = alloca %struct.S2K, align 4 |
| %0 = bitcast %struct.S2K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 2048, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S2K, %struct.S2K* %s, i64 0, i32 0, i64 5 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.addg(i8* nonnull %1, i64 7) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 2048, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: add [[T0:x[0-9]+]], {{.*}}, #20 |
| ; CHECK-NEXT: addg x0, [[T0]], #0, #7 |
| } |
| |
| |
| ; *********** __arm_mte_exclude_tag ************* |
| ; test exclude_tag |
| define i32 @exclude_tag(i32* %ptr, i32 %m) local_unnamed_addr #0 { |
| entry: |
| ;CHECK-LABEL: exclude_tag: |
| %0 = zext i32 %m to i64 |
| %1 = bitcast i32* %ptr to i8* |
| %2 = tail call i64 @llvm.aarch64.gmi(i8* %1, i64 %0) |
| %conv = trunc i64 %2 to i32 |
| ret i32 %conv |
| ; CHECK: gmi x0, x0, {{x[0-9]+}} |
| } |
| |
| |
| ; *********** __arm_mte_get_tag ************* |
| %struct.S8K = type { [2048 x i32] } |
| define i32* @get_tag1(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: get_tag1: |
| %0 = bitcast i32* %ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.ldg(i8* %0, i8* %0) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK ldg x0, [x0] |
| } |
| |
| define i32* @get_tag1_two_parm(i32* %ret_ptr, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: get_tag1_two_parm: |
| %0 = bitcast i32* %ret_ptr to i8* |
| %1 = bitcast i32* %ptr to i8* |
| %2 = tail call i8* @llvm.aarch64.ldg(i8* %0, i8* %1) |
| %3 = bitcast i8* %2 to i32* |
| ret i32* %3 |
| ; CHECK ldg x0, [x1] |
| } |
| |
| define i32* @get_tag1stack() { |
| entry: |
| ; CHECK-LABEL: get_tag1stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %1 = call i8* @llvm.aarch64.ldg(i8* nonnull %0, i8* nonnull %0) |
| %2 = bitcast i8* %1 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret i32* %2 |
| ; CHECK: mov [[T0:x[0-9]+]], sp |
| ; CHECK: ldg [[T0]], [sp] |
| } |
| |
| define i32* @get_tag1stack_two_param(i32* %ret_ptr) { |
| entry: |
| ; CHECK-LABEL: get_tag1stack_two_param: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| %1 = bitcast i32* %ret_ptr to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %2 = call i8* @llvm.aarch64.ldg(i8* nonnull %1, i8* nonnull %0) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK-NOT: mov {{.*}}, sp |
| ; CHECK: ldg x0, [sp] |
| } |
| |
| |
| define i32* @get_tag2(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: get_tag2: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 4 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.ldg(i8* nonnull %0, i8* nonnull %0) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: add [[T0:x[0-9]+]], x0, #16 |
| ; CHECK: ldg [[T0]], [x0, #16] |
| } |
| |
| define i32* @get_tag2stack() { |
| entry: |
| ; CHECK-LABEL: get_tag2stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 4 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.ldg(i8* nonnull %1, i8* nonnull %1) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: mov [[T0:x[0-9]+]], sp |
| ; CHECK: add x0, [[T0]], #16 |
| ; CHECK: ldg x0, [sp, #16] |
| } |
| |
| |
| define i32* @get_tag3(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: get_tag3: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 1020 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.ldg(i8* nonnull %0, i8* nonnull %0) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: add [[T0:x[0-8]+]], x0, #4080 |
| ; CHECK: ldg [[T0]], [x0, #4080] |
| } |
| |
| define i32* @get_tag3stack() { |
| entry: |
| ; CHECK-LABEL: get_tag3stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 1020 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.ldg(i8* nonnull %1, i8* nonnull %1) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: mov [[T0:x[0-9]+]], sp |
| ; CHECK: add x0, [[T0]], #4080 |
| ; CHECK: ldg x0, [sp, #4080] |
| } |
| |
| |
| define i32* @get_tag4(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: get_tag4: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 1024 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.ldg(i8* nonnull %0, i8* nonnull %0) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: add x0, x0, #1, lsl #12 |
| ; CHECK-NEXT: ldg x0, [x0] |
| } |
| |
| define i32* @get_tag4stack() { |
| entry: |
| ; CHECK-LABEL: get_tag4stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 1024 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.ldg(i8* nonnull %1, i8* nonnull %1) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: mov [[T0:x[0-9]+]], sp |
| ; CHECK-NEXT: add x[[T1:[0-9]+]], [[T0]], #1, lsl #12 |
| ; CHECK-NEXT: ldg x[[T1]], [x[[T1]]] |
| } |
| |
| define i32* @get_tag5(i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: get_tag5: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 5 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = tail call i8* @llvm.aarch64.ldg(i8* nonnull %0, i8* nonnull %0) |
| %2 = bitcast i8* %1 to i32* |
| ret i32* %2 |
| ; CHECK: add x0, x0, #20 |
| ; CHECK-NEXT: ldg x0, [x0] |
| } |
| |
| define i32* @get_tag5stack() { |
| entry: |
| ; CHECK-LABEL: get_tag5stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 5 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = call i8* @llvm.aarch64.ldg(i8* nonnull %1, i8* nonnull %1) |
| %3 = bitcast i8* %2 to i32* |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret i32* %3 |
| ; CHECK: mov [[T0:x[0-9]+]], sp |
| ; CHECK: add x[[T1:[0-9]+]], [[T0]], #20 |
| ; CHECK-NEXT: ldg x[[T1]], [x[[T1]]] |
| } |
| |
| |
| ; *********** __arm_mte_set_tag ************* |
| define void @set_tag1(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag1: |
| %0 = bitcast i32* %tag to i8* |
| %1 = bitcast i32* %ptr to i8* |
| tail call void @llvm.aarch64.stg(i8* %0, i8* %1) |
| ret void |
| ; CHECK: stg x0, [x1] |
| } |
| |
| define void @set_tag1stack(i32* %tag) { |
| entry: |
| ; CHECK-LABEL: set_tag1stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast i32* %tag to i8* |
| %1 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %1) |
| call void @llvm.aarch64.stg(i8* %0, i8* nonnull %1) |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret void |
| ; CHECK: stg x0, [sp] |
| } |
| |
| |
| define void @set_tag2(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag2: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 4 |
| %0 = bitcast i32* %tag to i8* |
| %1 = bitcast i32* %add.ptr to i8* |
| tail call void @llvm.aarch64.stg(i8* %0, i8* %1) |
| ret void |
| ; CHECK: stg x0, [x1, #16] |
| } |
| |
| define void @set_tag2stack(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag2stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 4 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = bitcast i32* %tag to i8* |
| call void @llvm.aarch64.stg(i8* %2, i8* nonnull %1) |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret void |
| ; CHECK: stg x0, [sp, #16] |
| } |
| |
| |
| |
| define void @set_tag3(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag3: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 1020 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = bitcast i32* %tag to i8* |
| tail call void @llvm.aarch64.stg(i8* %1, i8* %0) |
| ret void |
| ; CHECK: stg x0, [x1, #4080] |
| } |
| |
| define void @set_tag3stack(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag3stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 1020 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = bitcast i32* %tag to i8* |
| call void @llvm.aarch64.stg(i8* %2, i8* nonnull %1) |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret void |
| ; CHECK: stg x0, [sp, #4080] |
| } |
| |
| |
| |
| define void @set_tag4(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag4: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 1024 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = bitcast i32* %tag to i8* |
| tail call void @llvm.aarch64.stg(i8* %1, i8* %0) |
| ret void |
| ; CHECK: add x[[T0:[0-9]+]], x1, #1, lsl #12 |
| ; CHECK-NEXT: stg x0, [x[[T0]]] |
| } |
| |
| define void @set_tag4stack(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag4stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 1024 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = bitcast i32* %tag to i8* |
| call void @llvm.aarch64.stg(i8* %2, i8* nonnull %1) |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret void |
| ; CHECK: add x[[T0:[0-9]+]], {{.*}}, #1, lsl #12 |
| ; CHECK-NEXT: stg x0, [x[[T0]]] |
| } |
| |
| |
| define void @set_tag5(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag5: |
| %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 5 |
| %0 = bitcast i32* %add.ptr to i8* |
| %1 = bitcast i32* %tag to i8* |
| tail call void @llvm.aarch64.stg(i8* %1, i8* %0) |
| ret void |
| ; CHECK: add x[[T0:[0-9]+]], x1, #20 |
| ; CHECK-NEXT: stg x0, [x[[T0]]] |
| } |
| |
| define void @set_tag5stack(i32* %tag, i32* %ptr) { |
| entry: |
| ; CHECK-LABEL: set_tag5stack: |
| %s = alloca %struct.S8K, align 4 |
| %0 = bitcast %struct.S8K* %s to i8* |
| call void @llvm.lifetime.start.p0i8(i64 8192, i8* nonnull %0) |
| %arrayidx = getelementptr inbounds %struct.S8K, %struct.S8K* %s, i64 0, i32 0, i64 5 |
| %1 = bitcast i32* %arrayidx to i8* |
| %2 = bitcast i32* %tag to i8* |
| call void @llvm.aarch64.stg(i8* %2, i8* nonnull %1) |
| call void @llvm.lifetime.end.p0i8(i64 8192, i8* nonnull %0) |
| ret void |
| ; CHECK: add x[[T0:[0-9]+]], {{.*}}, #20 |
| ; CHECK-NEXT: stg x0, [x[[T0]]] |
| } |
| |
| |
| ; *********** __arm_mte_ptrdiff ************* |
| define i64 @subtract_pointers(i32* %ptra, i32* %ptrb) { |
| entry: |
| ; CHECK-LABEL: subtract_pointers: |
| %0 = bitcast i32* %ptra to i8* |
| %1 = bitcast i32* %ptrb to i8* |
| %2 = tail call i64 @llvm.aarch64.subp(i8* %0, i8* %1) |
| ret i64 %2 |
| ; CHECK: subp x0, x0, x1 |
| } |
| |
| declare i8* @llvm.aarch64.irg(i8*, i64) |
| declare i8* @llvm.aarch64.addg(i8*, i64) |
| declare i64 @llvm.aarch64.gmi(i8*, i64) |
| declare i8* @llvm.aarch64.ldg(i8*, i8*) |
| declare void @llvm.aarch64.stg(i8*, i8*) |
| declare i64 @llvm.aarch64.subp(i8*, i8*) |
| |
| declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) |
| declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) |