1c3146671SArchibald Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "(\.v?save|push|pop)" 2c3146671SArchibald Elliott 3c3146671SArchibald Elliott; No FP16/BF16 4c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT 5c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT 6c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT 7c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT 8c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-HARD 9c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-HARD 10c3146671SArchibald Elliott 11c3146671SArchibald Elliott; FP16/BF16 12c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT 13c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT 14c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT 15c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT 16c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-HARD 17c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-HARD 18c3146671SArchibald Elliott 19c3146671SArchibald Elliott; PR60510 showed a bug where the return from `*_inner` was getting "lost" by an 20c3146671SArchibald Elliott; optimisation, and a garbage value was being left in `s0`. 21c3146671SArchibald Elliott 22c3146671SArchibald Elliottdeclare dso_local float @other(float) nounwind 23c3146671SArchibald Elliottdeclare dso_local void @fp16_sink(half) nounwind 24c3146671SArchibald Elliottdeclare dso_local void @bf16_sink(bfloat) nounwind 25c3146671SArchibald Elliott 26*eeb4fe09SArchibald Elliottdeclare dso_local half @fp16_inner() nounwind 27c3146671SArchibald Elliottdeclare dso_local bfloat @bf_inner() nounwind 28c3146671SArchibald Elliott 29c3146671SArchibald Elliottdefine half @fp16_out_call_oneuse(float %arg) nounwind { 30c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: fp16_out_call_oneuse: 31c3146671SArchibald Elliott; NO-FP16-SOFT: @ %bb.0: 32c3146671SArchibald Elliott; NO-FP16-SOFT: mov r4, r0 33c3146671SArchibald Elliott; NO-FP16-SOFT: bl fp16_inner 34c3146671SArchibald Elliott; NO-FP16-SOFT: mov r5, r0 35c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r4 36c3146671SArchibald Elliott; NO-FP16-SOFT: bl other 37c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r5 38c3146671SArchibald Elliott; 39c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: fp16_out_call_oneuse: 40c3146671SArchibald Elliott; NO-FP16-HARD: @ %bb.0: 41c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s16, s0 42c3146671SArchibald Elliott; NO-FP16-HARD: bl fp16_inner 43c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s18, s0 44c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s16 45c3146671SArchibald Elliott; NO-FP16-HARD: bl other 46c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s18 47c3146671SArchibald Elliott; 48c3146671SArchibald Elliott; FP16-SOFT-LABEL: fp16_out_call_oneuse: 49c3146671SArchibald Elliott; FP16-SOFT: @ %bb.0: 50c3146671SArchibald Elliott; FP16-SOFT: mov r4, r0 51c3146671SArchibald Elliott; FP16-SOFT: bl fp16_inner 52c3146671SArchibald Elliott; FP16-SOFT: mov r5, r0 53c3146671SArchibald Elliott; FP16-SOFT: mov r0, r4 54c3146671SArchibald Elliott; FP16-SOFT: bl other 55c3146671SArchibald Elliott; FP16-SOFT: vmov.f16 s0, r5 56c3146671SArchibald Elliott; FP16-SOFT: vmov r0, s0 57c3146671SArchibald Elliott; 58c3146671SArchibald Elliott; FP16-HARD-LABEL: fp16_out_call_oneuse: 59c3146671SArchibald Elliott; FP16-HARD: @ %bb.0: 60c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s16, s0 61c3146671SArchibald Elliott; FP16-HARD: bl fp16_inner 62b189218dSArchibald Elliott; FP16-HARD: vmov.f32 s18, s0 63c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s0, s16 64c3146671SArchibald Elliott; FP16-HARD: bl other 65b189218dSArchibald Elliott; FP16-HARD: vmov.f32 s0, s18 66c3146671SArchibald Elliott %call = call half @fp16_inner() 67c3146671SArchibald Elliott %call1 = call float @other(float %arg) 68c3146671SArchibald Elliott ret half %call 69c3146671SArchibald Elliott} 70c3146671SArchibald Elliott 71c3146671SArchibald Elliottdefine half @fp16_out_call_multiuse(float %arg) nounwind { 72c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: fp16_out_call_multiuse: 73c3146671SArchibald Elliott; NO-FP16-SOFT: @ %bb.0: 74c3146671SArchibald Elliott; NO-FP16-SOFT: mov r4, r0 75c3146671SArchibald Elliott; NO-FP16-SOFT: bl fp16_inner 76c3146671SArchibald Elliott; NO-FP16-SOFT: mov r5, r0 77c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r4 78c3146671SArchibald Elliott; NO-FP16-SOFT: bl other 79c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r5 80c3146671SArchibald Elliott; NO-FP16-SOFT: bl fp16_sink 81c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r5 82c3146671SArchibald Elliott; 83c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: fp16_out_call_multiuse: 84c3146671SArchibald Elliott; NO-FP16-HARD: @ %bb.0: 85c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s16, s0 86c3146671SArchibald Elliott; NO-FP16-HARD: bl fp16_inner 87c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s18, s0 88c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s16 89c3146671SArchibald Elliott; NO-FP16-HARD: bl other 90c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s18 91c3146671SArchibald Elliott; NO-FP16-HARD: bl fp16_sink 92c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s18 93c3146671SArchibald Elliott; 94c3146671SArchibald Elliott; FP16-SOFT-LABEL: fp16_out_call_multiuse: 95c3146671SArchibald Elliott; FP16-SOFT: @ %bb.0: 96c3146671SArchibald Elliott; FP16-SOFT: mov r4, r0 97c3146671SArchibald Elliott; FP16-SOFT: bl fp16_inner 98c3146671SArchibald Elliott; FP16-SOFT: mov r5, r0 99c3146671SArchibald Elliott; FP16-SOFT: mov r0, r4 100c3146671SArchibald Elliott; FP16-SOFT: bl other 101c3146671SArchibald Elliott; FP16-SOFT: vmov.f16 s16, r5 102c3146671SArchibald Elliott; FP16-SOFT: vmov.f16 r0, s16 103c3146671SArchibald Elliott; FP16-SOFT: bl fp16_sink 104c3146671SArchibald Elliott; FP16-SOFT: vmov r0, s16 105c3146671SArchibald Elliott; 106c3146671SArchibald Elliott; FP16-HARD-LABEL: fp16_out_call_multiuse: 107c3146671SArchibald Elliott; FP16-HARD: @ %bb.0: 108c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s16, s0 109c3146671SArchibald Elliott; FP16-HARD: bl fp16_inner 110b189218dSArchibald Elliott; FP16-HARD: vmov.f32 s18, s0 111c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s0, s16 112c3146671SArchibald Elliott; FP16-HARD: bl other 113b189218dSArchibald Elliott; FP16-HARD: vmov.f16 r0, s18 114c3146671SArchibald Elliott; FP16-HARD: vmov s0, r0 115c3146671SArchibald Elliott; FP16-HARD: bl fp16_sink 116b189218dSArchibald Elliott; FP16-HARD: vmov.f32 s0, s18 117c3146671SArchibald Elliott %call = call half @fp16_inner() 118c3146671SArchibald Elliott %call1 = call float @other(float %arg) 119c3146671SArchibald Elliott call void @fp16_sink(half %call) 120c3146671SArchibald Elliott ret half %call 121c3146671SArchibald Elliott} 122c3146671SArchibald Elliott 123c3146671SArchibald Elliottdefine bfloat @bf_out_call_oneuse(float %arg) nounwind { 124c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: bf_out_call_oneuse: 125c3146671SArchibald Elliott; NO-FP16-SOFT: @ %bb.0: 126c3146671SArchibald Elliott; NO-FP16-SOFT: mov r4, r0 127c3146671SArchibald Elliott; NO-FP16-SOFT: bl bf_inner 128c3146671SArchibald Elliott; NO-FP16-SOFT: mov r5, r0 129c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r4 130c3146671SArchibald Elliott; NO-FP16-SOFT: bl other 131c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r5 132c3146671SArchibald Elliott; 133c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: bf_out_call_oneuse: 134c3146671SArchibald Elliott; NO-FP16-HARD: @ %bb.0: 135c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s16, s0 136c3146671SArchibald Elliott; NO-FP16-HARD: bl bf_inner 137c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s18, s0 138c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s16 139c3146671SArchibald Elliott; NO-FP16-HARD: bl other 140c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s18 141c3146671SArchibald Elliott; 142c3146671SArchibald Elliott; FP16-SOFT-LABEL: bf_out_call_oneuse: 143c3146671SArchibald Elliott; FP16-SOFT: @ %bb.0: 144c3146671SArchibald Elliott; FP16-SOFT: mov r4, r0 145c3146671SArchibald Elliott; FP16-SOFT: bl bf_inner 146c3146671SArchibald Elliott; FP16-SOFT: mov r5, r0 147c3146671SArchibald Elliott; FP16-SOFT: mov r0, r4 148c3146671SArchibald Elliott; FP16-SOFT: bl other 149c3146671SArchibald Elliott; FP16-SOFT: mov r0, r5 150c3146671SArchibald Elliott; 151c3146671SArchibald Elliott; FP16-HARD-LABEL: bf_out_call_oneuse: 152c3146671SArchibald Elliott; FP16-HARD: @ %bb.0: 153c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s16, s0 154c3146671SArchibald Elliott; FP16-HARD: bl bf_inner 155c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s18, s0 156c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s0, s16 157c3146671SArchibald Elliott; FP16-HARD: bl other 158c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s0, s18 159c3146671SArchibald Elliott %call = call bfloat @bf_inner() 160c3146671SArchibald Elliott %call1 = call float @other(float %arg) 161c3146671SArchibald Elliott ret bfloat %call 162c3146671SArchibald Elliott} 163c3146671SArchibald Elliott 164c3146671SArchibald Elliottdefine bfloat @bf_out_call_multiuse(float %arg) nounwind { 165c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: bf_out_call_multiuse: 166c3146671SArchibald Elliott; NO-FP16-SOFT: @ %bb.0: 167c3146671SArchibald Elliott; NO-FP16-SOFT: mov r4, r0 168c3146671SArchibald Elliott; NO-FP16-SOFT: bl bf_inner 169c3146671SArchibald Elliott; NO-FP16-SOFT: mov r5, r0 170c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r4 171c3146671SArchibald Elliott; NO-FP16-SOFT: bl other 172c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r5 173c3146671SArchibald Elliott; NO-FP16-SOFT: bl bf16_sink 174c3146671SArchibald Elliott; NO-FP16-SOFT: mov r0, r5 175c3146671SArchibald Elliott; 176c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: bf_out_call_multiuse: 177c3146671SArchibald Elliott; NO-FP16-HARD: @ %bb.0: 178c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s16, s0 179c3146671SArchibald Elliott; NO-FP16-HARD: bl bf_inner 180c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s18, s0 181c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s16 182c3146671SArchibald Elliott; NO-FP16-HARD: bl other 183c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s18 184c3146671SArchibald Elliott; NO-FP16-HARD: bl bf16_sink 185c3146671SArchibald Elliott; NO-FP16-HARD: vmov.f32 s0, s18 186c3146671SArchibald Elliott; 187c3146671SArchibald Elliott; FP16-SOFT-LABEL: bf_out_call_multiuse: 188c3146671SArchibald Elliott; FP16-SOFT: @ %bb.0: 189c3146671SArchibald Elliott; FP16-SOFT: mov r4, r0 190c3146671SArchibald Elliott; FP16-SOFT: bl bf_inner 191c3146671SArchibald Elliott; FP16-SOFT: mov r5, r0 192c3146671SArchibald Elliott; FP16-SOFT: mov r0, r4 193c3146671SArchibald Elliott; FP16-SOFT: bl other 194c3146671SArchibald Elliott; FP16-SOFT: mov r0, r5 195c3146671SArchibald Elliott; FP16-SOFT: bl bf16_sink 196c3146671SArchibald Elliott; FP16-SOFT: mov r0, r5 197c3146671SArchibald Elliott; 198c3146671SArchibald Elliott; FP16-HARD-LABEL: bf_out_call_multiuse: 199c3146671SArchibald Elliott; FP16-HARD: @ %bb.0: 200c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s16, s0 201c3146671SArchibald Elliott; FP16-HARD: bl bf_inner 202c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s18, s0 203c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s0, s16 204c3146671SArchibald Elliott; FP16-HARD: bl other 205c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s0, s18 206c3146671SArchibald Elliott; FP16-HARD: bl bf16_sink 207c3146671SArchibald Elliott; FP16-HARD: vmov.f32 s0, s18 208c3146671SArchibald Elliott %call = call bfloat @bf_inner() 209c3146671SArchibald Elliott %call1 = call float @other(float %arg) 210c3146671SArchibald Elliott call void @bf16_sink(bfloat %call) 211c3146671SArchibald Elliott ret bfloat %call 212c3146671SArchibald Elliott} 213