| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=aarch64 -mattr=+gcs -verify-machineinstrs -o - %s | FileCheck %s |
| |
| ; We call each intrinsic twice, once with the result being unused and once with |
| ; it being used, to check that dead code elimination is being done correctly. |
| ; chkfeat does not have side effects so can be eliminated, but the others do and |
| ; can't be eliminated. |
| |
| define i64 @test_chkfeat(i64 %arg) { |
| ; CHECK-LABEL: test_chkfeat: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: mov x16, x0 |
| ; CHECK-NEXT: chkfeat x16 |
| ; CHECK-NEXT: mov x0, x16 |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = call i64 @llvm.aarch64.chkfeat(i64 %arg) |
| %1 = call i64 @llvm.aarch64.chkfeat(i64 %arg) |
| ret i64 %1 |
| } |
| |
| define i64 @test_gcspopm(i64 %arg) { |
| ; CHECK-LABEL: test_gcspopm: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: mov x8, x0 |
| ; CHECK-NEXT: gcspopm x8 |
| ; CHECK-NEXT: gcspopm x0 |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = call i64 @llvm.aarch64.gcspopm(i64 %arg) |
| %1 = call i64 @llvm.aarch64.gcspopm(i64 %arg) |
| ret i64 %1 |
| } |
| |
| define ptr @test_gcsss(ptr %p) { |
| ; CHECK-LABEL: test_gcsss: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: mov x9, xzr |
| ; CHECK-NEXT: gcsss1 x0 |
| ; CHECK-NEXT: mov x8, xzr |
| ; CHECK-NEXT: gcsss2 x9 |
| ; CHECK-NEXT: gcsss1 x0 |
| ; CHECK-NEXT: gcsss2 x8 |
| ; CHECK-NEXT: mov x0, x8 |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = call ptr @llvm.aarch64.gcsss(ptr %p) |
| %1 = call ptr @llvm.aarch64.gcsss(ptr %p) |
| ret ptr %1 |
| } |
| |
| declare i64 @llvm.aarch64.chkfeat(i64) |
| declare i64 @llvm.aarch64.gcspopm(i64) |
| declare ptr @llvm.aarch64.gcsss(ptr) |