|  | ; 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) |