llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
29.25k stars 12.07k forks source link

regression with passing f16 as parameters in arm-linux #46798

Closed andrewrk closed 4 years ago

andrewrk commented 4 years ago
Bugzilla Link 47454
Resolution FIXED
Resolved on Sep 22, 2020 02:50
Version 11.0
OS All
Blocks llvm/llvm-project#46070
Attachments compiler_rt_armv8.ll.gz, c_armv8.ll.gz, testarmf16.ll.gz
CC @DMG862,@efriedma-quic,@zmodem,@pratlucas
Fixed by commit(s) 53d238a961d1

Extended Description

This is not a duplicate of #​47001 - this bug report is against the latest release/11.x branch which is currently 7d4d7a7bf1e8d99b80da66afde7df81b05f77538.

Zig code:

const std = @​import("std");

pub fn main() void { const result = std.fmt.parseFloat(f16, "1e+700") catch unreachable; expectEqual(result, std.math.inf(f16)); }

fn expectEqual(a: f16, b: f16) void { if (a != b) std.process.exit(1); }

pub fn panic(msg: []const u8, stack_trace: ?*std.builtin.StackTrace) noreturn { std.process.exit(1); }

With LLVM 10:

$ ./zig build-exe testarmf16.zig -target arm-linux-none $ qemu-arm ./testarmf16 $ echo $? 0

With LLVM 11:

$ ./zig build-exe testarmf16.zig -target arm-linux-none $ qemu-arm ./testarmf16 $ echo $? 1

To reproduce without Zig, use the attached files (yes those cpu features flags are annoying and I would love if clang had a less verbose way to pass this information):

$ ~/local/llvm10-release/bin/clang-10 -o test testarmf16.ll -nostartfiles -nodefaultlibs -target armv8-unknown-linux-unknown compiler_rt_armv8.ll c_armv8.ll -fuse-ld=$HOME/local/llvm10-release/bin/ld.lld -static -Xclang -target-feature -Xclang -32bit -Xclang -target-feature -Xclang -8msecext -Xclang -target-feature -Xclang -a76 -Xclang -target-feature -Xclang +aclass -Xclang -target-feature -Xclang -acquire-release -Xclang -target-feature -Xclang -aes -Xclang -target-feature -Xclang -avoid-movs-shop -Xclang -target-feature -Xclang -avoid-partial-cpsr -Xclang -target-feature -Xclang -bf16 -Xclang -target-feature -Xclang -cde -Xclang -target-feature -Xclang -cdecp0 -Xclang -target-feature -Xclang -cdecp1 -Xclang -target-feature -Xclang -cdecp2 -Xclang -target-feature -Xclang -cdecp3 -Xclang -target-feature -Xclang -cdecp4 -Xclang -target-feature -Xclang -cdecp5 -Xclang -target-feature -Xclang -cdecp6 -Xclang -target-feature -Xclang -cdecp7 -Xclang -target-feature -Xclang -cheap-predicable-cpsr -Xclang -target-feature -Xclang -crc -Xclang -target-feature -Xclang -crypto -Xclang -target-feature -Xclang +d32 -Xclang -target-feature -Xclang +db -Xclang -target-feature -Xclang -dfb -Xclang -target-feature -Xclang -disable-postra-scheduler -Xclang -target-feature -Xclang -dont-widen-vmovs -Xclang -target-feature -Xclang -dotprod -Xclang -target-feature -Xclang +dsp -Xclang -target-feature -Xclang -execute-only -Xclang -target-feature -Xclang -expand-fp-mlx -Xclang -target-feature -Xclang -exynos -Xclang -target-feature -Xclang -fp16 -Xclang -target-feature -Xclang -fp16fml -Xclang -target-feature -Xclang +fp64 -Xclang -target-feature -Xclang -fp-armv8 -Xclang -target-feature -Xclang -fp-armv8d16 -Xclang -target-feature -Xclang -fp-armv8d16sp -Xclang -target-feature -Xclang -fp-armv8sp -Xclang -target-feature -Xclang -fpao -Xclang -target-feature -Xclang +fpregs -Xclang -target-feature -Xclang -fpregs16 -Xclang -target-feature -Xclang +fpregs64 -Xclang -target-feature -Xclang -fullfp16 -Xclang -target-feature -Xclang -fuse-aes -Xclang -target-feature -Xclang -fuse-literals -Xclang -target-feature -Xclang +v4t -Xclang -target-feature -Xclang +v5t -Xclang -target-feature -Xclang +v5te -Xclang -target-feature -Xclang +v6 -Xclang -target-feature -Xclang +v6k -Xclang -target-feature -Xclang +v6m -Xclang -target-feature -Xclang +v6t2 -Xclang -target-feature -Xclang +v7 -Xclang -target-feature -Xclang +v7clrex -Xclang -target-feature -Xclang -v8.1a -Xclang -target-feature -Xclang -v8.1m.main -Xclang -target-feature -Xclang -v8.2a -Xclang -target-feature -Xclang -v8.3a -Xclang -target-feature -Xclang -v8.4a -Xclang -target-feature -Xclang -v8.5a -Xclang -target-feature -Xclang -v8.6a -Xclang -target-feature -Xclang -v8 -Xclang -target-feature -Xclang +v8m -Xclang -target-feature -Xclang -v8m.main -Xclang -target-feature -Xclang -hwdiv -Xclang -target-feature -Xclang -hwdiv-arm -Xclang -target-feature -Xclang -i8mm -Xclang -target-feature -Xclang -iwmmxt -Xclang -target-feature -Xclang -iwmmxt2 -Xclang -target-feature -Xclang -lob -Xclang -target-feature -Xclang -long-calls -Xclang -target-feature -Xclang -loop-align -Xclang -target-feature -Xclang -m3 -Xclang -target-feature -Xclang -mclass -Xclang -target-feature -Xclang -mp -Xclang -target-feature -Xclang -muxed-units -Xclang -target-feature -Xclang -mve -Xclang -target-feature -Xclang -mve.fp -Xclang -target-feature -Xclang -mve1beat -Xclang -target-feature -Xclang -mve2beat -Xclang -target-feature -Xclang -mve4beat -Xclang -target-feature -Xclang -nacl-trap -Xclang -target-feature -Xclang +neon -Xclang -target-feature -Xclang -neon-fpmovs -Xclang -target-feature -Xclang -neonfp -Xclang -target-feature -Xclang -no-branch-predictor -Xclang -target-feature -Xclang -no-movt -Xclang -target-feature -Xclang -no-neg-immediates -Xclang -target-feature -Xclang -noarm -Xclang -target-feature -Xclang -nonpipelined-vfp -Xclang -target-feature -Xclang +perfmon -Xclang -target-feature -Xclang -prefer-ishst -Xclang -target-feature -Xclang -prefer-vmovsr -Xclang -target-feature -Xclang -prof-unpr -Xclang -target-feature -Xclang -r4 -Xclang -target-feature -Xclang -ras -Xclang -target-feature -Xclang -rclass -Xclang -target-feature -Xclang -read-tp-hard -Xclang -target-feature -Xclang -reserve-r9 -Xclang -target-feature -Xclang -ret-addr-stack -Xclang -target-feature -Xclang -sb -Xclang -target-feature -Xclang -sha2 -Xclang -target-feature -Xclang -slow-fp-brcc -Xclang -target-feature -Xclang -slow-load-D-subreg -Xclang -target-feature -Xclang -slow-odd-reg -Xclang -target-feature -Xclang -slow-vdup32 -Xclang -target-feature -Xclang -slow-vgetlni32 -Xclang -target-feature -Xclang -slowfpvfmx -Xclang -target-feature -Xclang -slowfpvmlx -Xclang -target-feature -Xclang -soft-float -Xclang -target-feature -Xclang -splat-vfp-neon -Xclang -target-feature -Xclang -strict-align -Xclang -target-feature -Xclang -swift -Xclang -target-feature -Xclang +thumb2 -Xclang -target-feature -Xclang -thumb-mode -Xclang -target-feature -Xclang -trustzone -Xclang -target-feature -Xclang -use-misched -Xclang -target-feature -Xclang -armv2 -Xclang -target-feature -Xclang -armv2a -Xclang -target-feature -Xclang -armv3 -Xclang -target-feature -Xclang -armv3m -Xclang -target-feature -Xclang -armv4 -Xclang -target-feature -Xclang -armv4t -Xclang -target-feature -Xclang -armv5t -Xclang -target-feature -Xclang -armv5te -Xclang -target-feature -Xclang -armv5tej -Xclang -target-feature -Xclang -armv6 -Xclang -target-feature -Xclang -armv6j -Xclang -target-feature -Xclang -armv6k -Xclang -target-feature -Xclang -armv6kz -Xclang -target-feature -Xclang -armv6-m -Xclang -target-feature -Xclang -armv6s-m -Xclang -target-feature -Xclang -armv6t2 -Xclang -target-feature -Xclang +armv7-a -Xclang -target-feature -Xclang -armv7e-m -Xclang -target-feature -Xclang -armv7k -Xclang -target-feature -Xclang -armv7-m -Xclang -target-feature -Xclang -armv7-r -Xclang -target-feature -Xclang -armv7s -Xclang -target-feature -Xclang -armv7ve -Xclang -target-feature -Xclang -armv8-a -Xclang -target-feature -Xclang -armv8-m.base -Xclang -target-feature -Xclang -armv8-m.main -Xclang -target-feature -Xclang -armv8-r -Xclang -target-feature -Xclang -armv8.1-a -Xclang -target-feature -Xclang -armv8.1-m.main -Xclang -target-feature -Xclang -armv8.2-a -Xclang -target-feature -Xclang -armv8.3-a -Xclang -target-feature -Xclang -armv8.4-a -Xclang -target-feature -Xclang -armv8.5-a -Xclang -target-feature -Xclang -armv8.6-a -Xclang -target-feature -Xclang +vfp2 -Xclang -target-feature -Xclang +vfp2sp -Xclang -target-feature -Xclang +vfp3 -Xclang -target-feature -Xclang +vfp3d16 -Xclang -target-feature -Xclang +vfp3d16sp -Xclang -target-feature -Xclang +vfp3sp -Xclang -target-feature -Xclang -vfp4 -Xclang -target-feature -Xclang -vfp4d16 -Xclang -target-feature -Xclang -vfp4d16sp -Xclang -target-feature -Xclang -vfp4sp -Xclang -target-feature -Xclang -virtualization -Xclang -target-feature -Xclang -vldn-align -Xclang -target-feature -Xclang -vmlx-forwarding -Xclang -target-feature -Xclang -vmlx-hazards -Xclang -target-feature -Xclang -wide-stride-vfp -Xclang -target-feature -Xclang -xscale -Xclang -target-feature -Xclang -zcz $ qemu-arm ./test $ echo $? 0

$ ~/local/llvm11-release/bin/clang-11 -o test testarmf16.ll -nostartfiles -nodefaultlibs -target armv8-unknown-linux-unknown compiler_rt_armv8.ll c_armv8.ll -fuse-ld=$HOME/local/llvm11-release/bin/ld.lld -static -Xclang -target-feature -Xclang -32bit -Xclang -target-feature -Xclang -8msecext -Xclang -target-feature -Xclang -a76 -Xclang -target-feature -Xclang +aclass -Xclang -target-feature -Xclang -acquire-release -Xclang -target-feature -Xclang -aes -Xclang -target-feature -Xclang -avoid-movs-shop -Xclang -target-feature -Xclang -avoid-partial-cpsr -Xclang -target-feature -Xclang -bf16 -Xclang -target-feature -Xclang -cde -Xclang -target-feature -Xclang -cdecp0 -Xclang -target-feature -Xclang -cdecp1 -Xclang -target-feature -Xclang -cdecp2 -Xclang -target-feature -Xclang -cdecp3 -Xclang -target-feature -Xclang -cdecp4 -Xclang -target-feature -Xclang -cdecp5 -Xclang -target-feature -Xclang -cdecp6 -Xclang -target-feature -Xclang -cdecp7 -Xclang -target-feature -Xclang -cheap-predicable-cpsr -Xclang -target-feature -Xclang -crc -Xclang -target-feature -Xclang -crypto -Xclang -target-feature -Xclang +d32 -Xclang -target-feature -Xclang +db -Xclang -target-feature -Xclang -dfb -Xclang -target-feature -Xclang -disable-postra-scheduler -Xclang -target-feature -Xclang -dont-widen-vmovs -Xclang -target-feature -Xclang -dotprod -Xclang -target-feature -Xclang +dsp -Xclang -target-feature -Xclang -execute-only -Xclang -target-feature -Xclang -expand-fp-mlx -Xclang -target-feature -Xclang -exynos -Xclang -target-feature -Xclang -fp16 -Xclang -target-feature -Xclang -fp16fml -Xclang -target-feature -Xclang +fp64 -Xclang -target-feature -Xclang -fp-armv8 -Xclang -target-feature -Xclang -fp-armv8d16 -Xclang -target-feature -Xclang -fp-armv8d16sp -Xclang -target-feature -Xclang -fp-armv8sp -Xclang -target-feature -Xclang -fpao -Xclang -target-feature -Xclang +fpregs -Xclang -target-feature -Xclang -fpregs16 -Xclang -target-feature -Xclang +fpregs64 -Xclang -target-feature -Xclang -fullfp16 -Xclang -target-feature -Xclang -fuse-aes -Xclang -target-feature -Xclang -fuse-literals -Xclang -target-feature -Xclang +v4t -Xclang -target-feature -Xclang +v5t -Xclang -target-feature -Xclang +v5te -Xclang -target-feature -Xclang +v6 -Xclang -target-feature -Xclang +v6k -Xclang -target-feature -Xclang +v6m -Xclang -target-feature -Xclang +v6t2 -Xclang -target-feature -Xclang +v7 -Xclang -target-feature -Xclang +v7clrex -Xclang -target-feature -Xclang -v8.1a -Xclang -target-feature -Xclang -v8.1m.main -Xclang -target-feature -Xclang -v8.2a -Xclang -target-feature -Xclang -v8.3a -Xclang -target-feature -Xclang -v8.4a -Xclang -target-feature -Xclang -v8.5a -Xclang -target-feature -Xclang -v8.6a -Xclang -target-feature -Xclang -v8 -Xclang -target-feature -Xclang +v8m -Xclang -target-feature -Xclang -v8m.main -Xclang -target-feature -Xclang -hwdiv -Xclang -target-feature -Xclang -hwdiv-arm -Xclang -target-feature -Xclang -i8mm -Xclang -target-feature -Xclang -iwmmxt -Xclang -target-feature -Xclang -iwmmxt2 -Xclang -target-feature -Xclang -lob -Xclang -target-feature -Xclang -long-calls -Xclang -target-feature -Xclang -loop-align -Xclang -target-feature -Xclang -m3 -Xclang -target-feature -Xclang -mclass -Xclang -target-feature -Xclang -mp -Xclang -target-feature -Xclang -muxed-units -Xclang -target-feature -Xclang -mve -Xclang -target-feature -Xclang -mve.fp -Xclang -target-feature -Xclang -mve1beat -Xclang -target-feature -Xclang -mve2beat -Xclang -target-feature -Xclang -mve4beat -Xclang -target-feature -Xclang -nacl-trap -Xclang -target-feature -Xclang +neon -Xclang -target-feature -Xclang -neon-fpmovs -Xclang -target-feature -Xclang -neonfp -Xclang -target-feature -Xclang -no-branch-predictor -Xclang -target-feature -Xclang -no-movt -Xclang -target-feature -Xclang -no-neg-immediates -Xclang -target-feature -Xclang -noarm -Xclang -target-feature -Xclang -nonpipelined-vfp -Xclang -target-feature -Xclang +perfmon -Xclang -target-feature -Xclang -prefer-ishst -Xclang -target-feature -Xclang -prefer-vmovsr -Xclang -target-feature -Xclang -prof-unpr -Xclang -target-feature -Xclang -r4 -Xclang -target-feature -Xclang -ras -Xclang -target-feature -Xclang -rclass -Xclang -target-feature -Xclang -read-tp-hard -Xclang -target-feature -Xclang -reserve-r9 -Xclang -target-feature -Xclang -ret-addr-stack -Xclang -target-feature -Xclang -sb -Xclang -target-feature -Xclang -sha2 -Xclang -target-feature -Xclang -slow-fp-brcc -Xclang -target-feature -Xclang -slow-load-D-subreg -Xclang -target-feature -Xclang -slow-odd-reg -Xclang -target-feature -Xclang -slow-vdup32 -Xclang -target-feature -Xclang -slow-vgetlni32 -Xclang -target-feature -Xclang -slowfpvfmx -Xclang -target-feature -Xclang -slowfpvmlx -Xclang -target-feature -Xclang -soft-float -Xclang -target-feature -Xclang -splat-vfp-neon -Xclang -target-feature -Xclang -strict-align -Xclang -target-feature -Xclang -swift -Xclang -target-feature -Xclang +thumb2 -Xclang -target-feature -Xclang -thumb-mode -Xclang -target-feature -Xclang -trustzone -Xclang -target-feature -Xclang -use-misched -Xclang -target-feature -Xclang -armv2 -Xclang -target-feature -Xclang -armv2a -Xclang -target-feature -Xclang -armv3 -Xclang -target-feature -Xclang -armv3m -Xclang -target-feature -Xclang -armv4 -Xclang -target-feature -Xclang -armv4t -Xclang -target-feature -Xclang -armv5t -Xclang -target-feature -Xclang -armv5te -Xclang -target-feature -Xclang -armv5tej -Xclang -target-feature -Xclang -armv6 -Xclang -target-feature -Xclang -armv6j -Xclang -target-feature -Xclang -armv6k -Xclang -target-feature -Xclang -armv6kz -Xclang -target-feature -Xclang -armv6-m -Xclang -target-feature -Xclang -armv6s-m -Xclang -target-feature -Xclang -armv6t2 -Xclang -target-feature -Xclang +armv7-a -Xclang -target-feature -Xclang -armv7e-m -Xclang -target-feature -Xclang -armv7k -Xclang -target-feature -Xclang -armv7-m -Xclang -target-feature -Xclang -armv7-r -Xclang -target-feature -Xclang -armv7s -Xclang -target-feature -Xclang -armv7ve -Xclang -target-feature -Xclang -armv8-a -Xclang -target-feature -Xclang -armv8-m.base -Xclang -target-feature -Xclang -armv8-m.main -Xclang -target-feature -Xclang -armv8-r -Xclang -target-feature -Xclang -armv8.1-a -Xclang -target-feature -Xclang -armv8.1-m.main -Xclang -target-feature -Xclang -armv8.2-a -Xclang -target-feature -Xclang -armv8.3-a -Xclang -target-feature -Xclang -armv8.4-a -Xclang -target-feature -Xclang -armv8.5-a -Xclang -target-feature -Xclang -armv8.6-a -Xclang -target-feature -Xclang +vfp2 -Xclang -target-feature -Xclang +vfp2sp -Xclang -target-feature -Xclang +vfp3 -Xclang -target-feature -Xclang +vfp3d16 -Xclang -target-feature -Xclang +vfp3d16sp -Xclang -target-feature -Xclang +vfp3sp -Xclang -target-feature -Xclang -vfp4 -Xclang -target-feature -Xclang -vfp4d16 -Xclang -target-feature -Xclang -vfp4d16sp -Xclang -target-feature -Xclang -vfp4sp -Xclang -target-feature -Xclang -virtualization -Xclang -target-feature -Xclang -vldn-align -Xclang -target-feature -Xclang -vmlx-forwarding -Xclang -target-feature -Xclang -vmlx-hazards -Xclang -target-feature -Xclang -wide-stride-vfp -Xclang -target-feature -Xclang -xscale -Xclang -target-feature -Xclang -zcz $ qemu-arm ./test $ echo $? 1

zmodem commented 4 years ago

Cherry-picked to 11.x as b513e1963f3a7edc897c6c4e675934d0c58f1802.

Many thanks!

RKSimon commented 4 years ago

Keep this open until merged into 11.0

pratlucas commented 4 years ago

Fixed by commit 53d238a961d1:

$ clang -o test testarmf16.ll -nostartfiles -nodefaultlibs \
-target armv7a-unknown-linux-unknown compiler_rt_armv8.ll c_armv8.ll \ -fuse-ld=/usr/bin/ld.lld -static -Xclang -target-feature -Xclang -32bit -Xclang \ -target-feature -Xclang -8msecext -Xclang -target-feature -Xclang -a76 -Xclang \ -target-feature -Xclang +aclass -Xclang -target-feature -Xclang \ -acquire-release -Xclang -target-feature -Xclang -aes -Xclang -target-feature \ -Xclang -avoid-movs-shop -Xclang -target-feature -Xclang -avoid-partial-cpsr \ -Xclang -target-feature -Xclang -bf16 -Xclang -target-feature -Xclang -cde \ -Xclang -target-feature -Xclang -cdecp0 -Xclang -target-feature -Xclang -cdecp1 \ -Xclang -target-feature -Xclang -cdecp2 -Xclang -target-feature -Xclang -cdecp3 \ -Xclang -target-feature -Xclang -cdecp4 -Xclang -target-feature -Xclang -cdecp5 \ -Xclang -target-feature -Xclang -cdecp6 -Xclang -target-feature -Xclang -cdecp7 \ -Xclang -target-feature -Xclang -cheap-predicable-cpsr -Xclang -target-feature \ -Xclang -crc -Xclang -target-feature -Xclang -crypto -Xclang -target-feature \ -Xclang +d32 -Xclang -target-feature -Xclang +db -Xclang -target-feature \ -Xclang -dfb -Xclang -target-feature -Xclang -disable-postra-scheduler -Xclang \ -target-feature -Xclang -dont-widen-vmovs -Xclang -target-feature -Xclang \ -dotprod -Xclang -target-feature -Xclang +dsp -Xclang -target-feature -Xclang \ -execute-only -Xclang -target-feature -Xclang -expand-fp-mlx -Xclang \ -target-feature -Xclang -exynos -Xclang -target-feature -Xclang -fp16 -Xclang \ -target-feature -Xclang -fp16fml -Xclang -target-feature -Xclang +fp64 -Xclang \ -target-feature -Xclang -fp-armv8 -Xclang -target-feature -Xclang -fp-armv8d16 \ -Xclang -target-feature -Xclang -fp-armv8d16sp -Xclang -target-feature -Xclang \ -fp-armv8sp -Xclang -target-feature -Xclang -fpao -Xclang -target-feature \ -Xclang +fpregs -Xclang -target-feature -Xclang -fpregs16 -Xclang \ -target-feature -Xclang +fpregs64 -Xclang -target-feature -Xclang -fullfp16 \ -Xclang -target-feature -Xclang -fuse-aes -Xclang -target-feature -Xclang \ -fuse-literals -Xclang -target-feature -Xclang +v4t -Xclang -target-feature \ -Xclang +v5t -Xclang -target-feature -Xclang +v5te -Xclang -target-feature \ -Xclang +v6 -Xclang -target-feature -Xclang +v6k -Xclang -target-feature \ -Xclang +v6m -Xclang -target-feature -Xclang +v6t2 -Xclang -target-feature \ -Xclang +v7 -Xclang -target-feature -Xclang +v7clrex -Xclang -target-feature \ -Xclang -v8.1a -Xclang -target-feature -Xclang -v8.1m.main -Xclang \ -target-feature -Xclang -v8.2a -Xclang -target-feature -Xclang -v8.3a -Xclang \ -target-feature -Xclang -v8.4a -Xclang -target-feature -Xclang -v8.5a -Xclang \ -target-feature -Xclang -v8.6a -Xclang -target-feature -Xclang -v8 -Xclang \ -target-feature -Xclang +v8m -Xclang -target-feature -Xclang -v8m.main -Xclang \ -target-feature -Xclang -hwdiv -Xclang -target-feature -Xclang -hwdiv-arm \ -Xclang -target-feature -Xclang -i8mm -Xclang -target-feature -Xclang -iwmmxt \ -Xclang -target-feature -Xclang -iwmmxt2 -Xclang -target-feature -Xclang -lob \ -Xclang -target-feature -Xclang -long-calls -Xclang -target-feature -Xclang \ -loop-align -Xclang -target-feature -Xclang -m3 -Xclang -target-feature -Xclang \ -mclass -Xclang -target-feature -Xclang -mp -Xclang -target-feature -Xclang \ -muxed-units -Xclang -target-feature -Xclang -mve -Xclang -target-feature \ -Xclang -mve.fp -Xclang -target-feature -Xclang -mve1beat -Xclang \ -target-feature -Xclang -mve2beat -Xclang -target-feature -Xclang -mve4beat \ -Xclang -target-feature -Xclang -nacl-trap -Xclang -target-feature -Xclang \ +neon -Xclang -target-feature -Xclang -neon-fpmovs -Xclang -target-feature \ -Xclang -neonfp -Xclang -target-feature -Xclang -no-branch-predictor -Xclang \ -target-feature -Xclang -no-movt -Xclang -target-feature -Xclang \ -no-neg-immediates -Xclang -target-feature -Xclang -noarm -Xclang \ -target-feature -Xclang -nonpipelined-vfp -Xclang -target-feature -Xclang \ +perfmon -Xclang -target-feature -Xclang -prefer-ishst -Xclang -target-feature \ -Xclang -prefer-vmovsr -Xclang -target-feature -Xclang -prof-unpr -Xclang \ -target-feature -Xclang -r4 -Xclang -target-feature -Xclang -ras -Xclang \ -target-feature -Xclang -rclass -Xclang -target-feature -Xclang -read-tp-hard \ -Xclang -target-feature -Xclang -reserve-r9 -Xclang -target-feature -Xclang \ -ret-addr-stack -Xclang -target-feature -Xclang -sb -Xclang -target-feature \ -Xclang -sha2 -Xclang -target-feature -Xclang -slow-fp-brcc -Xclang \ -target-feature -Xclang -slow-load-D-subreg -Xclang -target-feature -Xclang \ -slow-odd-reg -Xclang -target-feature -Xclang -slow-vdup32 -Xclang \ -target-feature -Xclang -slow-vgetlni32 -Xclang -target-feature -Xclang \ -slowfpvfmx -Xclang -target-feature -Xclang -slowfpvmlx -Xclang -target-feature \ -Xclang -soft-float -Xclang -target-feature -Xclang -splat-vfp-neon -Xclang \ -target-feature -Xclang -strict-align -Xclang -target-feature -Xclang -swift \ -Xclang -target-feature -Xclang +thumb2 -Xclang -target-feature -Xclang \ -thumb-mode -Xclang -target-feature -Xclang -trustzone -Xclang -target-feature \ -Xclang -use-misched -Xclang -target-feature -Xclang -armv2 -Xclang \ -target-feature -Xclang -armv2a -Xclang -target-feature -Xclang -armv3 -Xclang \ -target-feature -Xclang -armv3m -Xclang -target-feature -Xclang -armv4 -Xclang \ -target-feature -Xclang -armv4t -Xclang -target-feature -Xclang -armv5t -Xclang \ -target-feature -Xclang -armv5te -Xclang -target-feature -Xclang -armv5tej \ -Xclang -target-feature -Xclang -armv6 -Xclang -target-feature -Xclang -armv6j \ -Xclang -target-feature -Xclang -armv6k -Xclang -target-feature -Xclang \ -armv6kz -Xclang -target-feature -Xclang -armv6-m -Xclang -target-feature \ -Xclang -armv6s-m -Xclang -target-feature -Xclang -armv6t2 -Xclang \ -target-feature -Xclang +armv7-a -Xclang -target-feature -Xclang -armv7e-m \ -Xclang -target-feature -Xclang -armv7k -Xclang -target-feature -Xclang \ -armv7-m -Xclang -target-feature -Xclang -armv7-r -Xclang -target-feature \ -Xclang -armv7s -Xclang -target-feature -Xclang -armv7ve -Xclang \ -target-feature -Xclang -armv8-a -Xclang -target-feature -Xclang -armv8-m.base \ -Xclang -target-feature -Xclang -armv8-m.main -Xclang -target-feature -Xclang \ -armv8-r -Xclang -target-feature -Xclang -armv8.1-a -Xclang -target-feature \ -Xclang -armv8.1-m.main -Xclang -target-feature -Xclang -armv8.2-a -Xclang \ -target-feature -Xclang -armv8.3-a -Xclang -target-feature -Xclang -armv8.4-a \ -Xclang -target-feature -Xclang -armv8.5-a -Xclang -target-feature -Xclang \ -armv8.6-a -Xclang -target-feature -Xclang +vfp2 -Xclang -target-feature \ -Xclang +vfp2sp -Xclang -target-feature -Xclang +vfp3 -Xclang -target-feature \ -Xclang +vfp3d16 -Xclang -target-feature -Xclang +vfp3d16sp -Xclang \ -target-feature -Xclang +vfp3sp -Xclang -target-feature -Xclang -vfp4 -Xclang \ -target-feature -Xclang -vfp4d16 -Xclang -target-feature -Xclang -vfp4d16sp \ -Xclang -target-feature -Xclang -vfp4sp -Xclang -target-feature -Xclang \ -virtualization -Xclang -target-feature -Xclang -vldn-align -Xclang \ -target-feature -Xclang -vmlx-forwarding -Xclang -target-feature -Xclang \ -vmlx-hazards -Xclang -target-feature -Xclang -wide-stride-vfp -Xclang \ -target-feature -Xclang -xscale -Xclang -target-feature -Xclang -zcz $ qemu-arm ./test $ echo $? 0

pratlucas commented 4 years ago

Patch for review: https://reviews.llvm.org/D87844.

pratlucas commented 4 years ago

Quick update: I have a very small patch that fixes the issue. I'm currently working on a couple of tests for it and should publish it on Phab soon.

pratlucas commented 4 years ago

Hi Hans,

From what I was able to check while debugging, it seems the issue is related to the lack of Calling Convention information for one of the parameters in the call to expectEqual. I'm investigating the reason for the missing information and I believe I'm close to having a fix. I understand the release we're past the release date, though.

zmodem commented 4 years ago

Sadly it doesn't seem like there's any progress here. I don't think we can hold the release for this.

andrewrk commented 4 years ago

I will give that a try - thanks for the suggestion.

zmodem commented 4 years ago

Given the commit message about half-precision floats not really being supported by llvm before, I wonder how this worked for Zig in previous releases.

Andrew, if a fix for this doesn't materialize soon, would it be possible for Zig to work around this by promoting arguments and return values to 32-bit float?

zmodem commented 4 years ago

Thanks for the repro!

Bisection points to the same commit as Bug 47001:


commit a255931c40558edf87994c2a8ed9b274c3fbda30
Author: Lucas Prates lucas.prates@arm.com
Date: Tue Jun 9 09:45:47 2020 +0100

[ARM] Supporting lowering of half-precision FP arguments and returns in AArch32's backend

Summary:
Half-precision floating point arguments and returns are currently
promoted to either float or int32 in clang's CodeGen and there's
no existing support for the lowering of `half` arguments and returns
from IR in AArch32's backend.

Such frontend coercions, implemented as coercion through memory
in clang, can cause a series of issues in argument lowering, as causing
arguments to be stored on the wrong bits on big-endian architectures
and incurring in missing overflow detections in the return of certain
functions.

This patch introduces the handling of half-precision arguments and returns in
the backend using the actual "half" type on the IR. Using the "half"
type the backend is able to properly enforce the AAPCS' directions for
those arguments, making sure they are stored on the proper bits of the
registers and performing the necessary floating point convertions.

Reviewers: rjmccall, olista01, asl, efriedma, ostannard, SjoerdMeijer

Reviewed By: ostannard

Subscribers: stuij, hiraditya, dmgreen, llvm-commits, chill, dnsampaio, danielkiss, kristof.beyls, cfe-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D75169

But as you point out, the fix for that (3d943bcd223e on trunk / ba3413982cbd7a5b5aeaf2ea34e0a91d5561202d on the 11.x branch) doesn't fix this new test case.

Lucas, can you take a look? Since we're now past the release date it would be great to get this fixed as soon as possible.

andrewrk commented 4 years ago

Oops, armv8 is a typo. It should be -target armv7a. Still repros the same though.

andrewrk commented 4 years ago

assigned to @pratlucas