// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +bf16 -emit-llvm -o - %s | FileCheck %s // CHECK-LABEL: @_Z3foo10svboolx4_t( // CHECK-NEXT: entry: // CHECK-NEXT: [[ARG:%.*]] = alloca { , , , }, align 2 // CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca { , , , }, align 2 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { , , , } poison, [[ARG_COERCE0:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { , , , } [[TMP0]], [[ARG_COERCE1:%.*]], 1 // CHECK-NEXT: [[TMP2:%.*]] = insertvalue { , , , } [[TMP1]], [[ARG_COERCE2:%.*]], 2 // CHECK-NEXT: [[TMP3:%.*]] = insertvalue { , , , } [[TMP2]], [[ARG_COERCE3:%.*]], 3 // CHECK-NEXT: store { , , , } [[TMP3]], ptr [[ARG]], align 2 // CHECK-NEXT: [[ARG1:%.*]] = load { , , , }, ptr [[ARG]], align 2 // CHECK-NEXT: store { , , , } [[ARG1]], ptr [[ARG_ADDR]], align 2 // CHECK-NEXT: [[TMP4:%.*]] = load { , , , }, ptr [[ARG_ADDR]], align 2 // CHECK-NEXT: ret { , , , } [[TMP4]] // __clang_svboolx4_t foo(__clang_svboolx4_t arg) { return arg; } __clang_svboolx4_t bar(); // CHECK-LABEL: @_Z4foo2v( // CHECK-NEXT: entry: // CHECK-NEXT: [[CALL:%.*]] = call { , , , } @_Z3barv() // CHECK-NEXT: ret { , , , } [[CALL]] // __clang_svboolx4_t foo2() { return bar(); } __clang_svboolx4_t bar2(__clang_svboolx4_t); // CHECK-LABEL: @_Z4foo310svboolx4_t( // CHECK-NEXT: entry: // CHECK-NEXT: [[ARG:%.*]] = alloca { , , , }, align 2 // CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca { , , , }, align 2 // CHECK-NEXT: [[COERCE:%.*]] = alloca { , , , }, align 2 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { , , , } poison, [[ARG_COERCE0:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { , , , } [[TMP0]], [[ARG_COERCE1:%.*]], 1 // CHECK-NEXT: [[TMP2:%.*]] = insertvalue { , , , } [[TMP1]], [[ARG_COERCE2:%.*]], 2 // CHECK-NEXT: [[TMP3:%.*]] = insertvalue { , , , } [[TMP2]], [[ARG_COERCE3:%.*]], 3 // CHECK-NEXT: store { , , , } [[TMP3]], ptr [[ARG]], align 2 // CHECK-NEXT: [[ARG1:%.*]] = load { , , , }, ptr [[ARG]], align 2 // CHECK-NEXT: store { , , , } [[ARG1]], ptr [[ARG_ADDR]], align 2 // CHECK-NEXT: [[TMP4:%.*]] = load { , , , }, ptr [[ARG_ADDR]], align 2 // CHECK-NEXT: store { , , , } [[TMP4]], ptr [[COERCE]], align 2 // CHECK-NEXT: [[COERCE_TUPLE:%.*]] = load { , , , }, ptr [[COERCE]], align 2 // CHECK-NEXT: [[COERCE_EXTRACT0:%.*]] = extractvalue { , , , } [[COERCE_TUPLE]], 0 // CHECK-NEXT: [[COERCE_EXTRACT1:%.*]] = extractvalue { , , , } [[COERCE_TUPLE]], 1 // CHECK-NEXT: [[COERCE_EXTRACT2:%.*]] = extractvalue { , , , } [[COERCE_TUPLE]], 2 // CHECK-NEXT: [[COERCE_EXTRACT3:%.*]] = extractvalue { , , , } [[COERCE_TUPLE]], 3 // CHECK-NEXT: [[CALL:%.*]] = call { , , , } @_Z4bar210svboolx4_t( [[COERCE_EXTRACT0]], [[COERCE_EXTRACT1]], [[COERCE_EXTRACT2]], [[COERCE_EXTRACT3]]) // CHECK-NEXT: ret { , , , } [[CALL]] // __clang_svboolx4_t foo3(__clang_svboolx4_t arg) { return bar2(arg); }