Skip to content

arm: only f32 and f64 are valid HFA bases - #163556

Open
folkertdev wants to merge 1 commit into
rust-lang:mainfrom
folkertdev:arm-hfa-base
Open

folkertdev wants to merge 1 commit into
rust-lang:mainfrom
folkertdev:arm-hfa-base

Conversation

@folkertdev

@folkertdev folkertdev commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

based on the spec:

https://github.com/ARM-software/abi-aa/blob/a5e86d3fec7342719f3bd1f939ec1b8ac6438c4f/aapcs32/aapcs32.rst#procedure-calling

A Homogeneous Aggregate with a Base Type of a single- or double-precision floating-point type with one to four Elements.

So f16 and f128 don't qualify. Neither does f16b, but it is not currently marked as reliable on arm. This change makes rust consistent with clang, but inconsistent with GCC.

r? davidtwco

@folkertdev folkertdev added O-Arm Target: 32-bit Arm processors (armv6, armv7, thumb...), including 64-bit Arm in AArch32 state A-ABI Area: Concerning the application binary interface (ABI) labels Sep 30, 2026
@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Sep 30, 2026
@rust-log-analyzer

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rustbot

rustbot commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator

This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job test-aarch64-gnu-llvm-22-1 failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)

---- [codegen] tests/codegen-llvm/complex-abi.rs#ARM stdout ----
------FileCheck stdout------------------------------

------FileCheck stderr------------------------------
/checkout/tests/codegen-llvm/complex-abi.rs:123:10: error: ARM: expected string not found in input
 // ARM: define{{.*}} [2 x half] @cplx_f16([2 x half] {{.*}})
         ^
/checkout/obj/build/aarch64-unknown-linux-gnu/test/codegen-llvm/complex-abi.ARM/complex-abi.ll:1:1: note: scanning from here
; ModuleID = 'complex_abi.8dfb70534ff3b38e-cgu.0'
^
/checkout/obj/build/aarch64-unknown-linux-gnu/test/codegen-llvm/complex-abi.ARM/complex-abi.ll:47:1: note: possible intended match here
define [2 x double] @cplx_f64([2 x double] %0) unnamed_addr #0 {
^

Input file: /checkout/obj/build/aarch64-unknown-linux-gnu/test/codegen-llvm/complex-abi.ARM/complex-abi.ll
Check file: /checkout/tests/codegen-llvm/complex-abi.rs

-dump-input=help explains the following input dump.

Input was:
<<<<<<
             1: ; ModuleID = 'complex_abi.8dfb70534ff3b38e-cgu.0' 
check:123'0     X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
             2: source_filename = "complex_abi.8dfb70534ff3b38e-cgu.0" 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             3: target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             4: target triple = "arm-unknown-linux-gnueabihf" 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             5:  
check:123'0     ~
             6: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             7: define i32 @cplx_f16(i32 %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             8: start: 
check:123'0     ~~~~~~~
             9:  %_0 = alloca [4 x i8], align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            10:  %1 = alloca [4 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            11:  %x = alloca [4 x i8], align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            12:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            13:  store i32 %0, ptr %1, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            14:  call void @llvm.memcpy.p0.p0.i32(ptr align 2 %x, ptr align 4 %1, i32 4, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            15:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            16:  %2 = load half, ptr %x, align 2, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            17:  %3 = getelementptr inbounds i8, ptr %x, i32 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            18:  %4 = load half, ptr %3, align 2, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            19:  store half %2, ptr %_0, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            20:  %5 = getelementptr inbounds i8, ptr %_0, i32 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            21:  store half %4, ptr %5, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            22:  %6 = load i32, ptr %_0, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            23:  ret i32 %6 
check:123'0     ~~~~~~~~~~~~
            24: } 
check:123'0     ~~
            25:  
check:123'0     ~
            26: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            27: define [2 x float] @cplx_f32([2 x float] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            28: start: 
check:123'0     ~~~~~~~
            29:  %_0 = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            30:  %1 = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            31:  %x = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            32:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            33:  store [2 x float] %0, ptr %1, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            34:  call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 %1, i32 8, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            35:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            36:  %2 = load float, ptr %x, align 4, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            37:  %3 = getelementptr inbounds i8, ptr %x, i32 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            38:  %4 = load float, ptr %3, align 4, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            39:  store float %2, ptr %_0, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            40:  %5 = getelementptr inbounds i8, ptr %_0, i32 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            41:  store float %4, ptr %5, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            42:  %6 = load [2 x float], ptr %_0, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            43:  ret [2 x float] %6 
check:123'0     ~~~~~~~~~~~~~~~~~~~~
            44: } 
check:123'0     ~~
            45:  
check:123'0     ~
            46: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            47: define [2 x double] @cplx_f64([2 x double] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:123'1     ?                                                                 possible intended match
            48: start: 
check:123'0     ~~~~~~~
            49:  %_0 = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            50:  %1 = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            51:  %x = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            52:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            53:  store [2 x double] %0, ptr %1, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            54:  call void @llvm.memcpy.p0.p0.i32(ptr align 8 %x, ptr align 8 %1, i32 16, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            55:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            56:  %2 = load double, ptr %x, align 8, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            57:  %3 = getelementptr inbounds i8, ptr %x, i32 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            58:  %4 = load double, ptr %3, align 8, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            59:  store double %2, ptr %_0, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            60:  %5 = getelementptr inbounds i8, ptr %_0, i32 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            61:  store double %4, ptr %5, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            62:  %6 = load [2 x double], ptr %_0, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            63:  ret [2 x double] %6 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~
            64: } 
check:123'0     ~~
            65:  
check:123'0     ~
            66: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            67: define void @cplx_f128(ptr dead_on_unwind noalias nofree noundef writable sret([32 x i8]) align 16 captures(address) dereferenceable(32) %_0, [4 x i64] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            68: start: 
check:123'0     ~~~~~~~
            69:  %1 = alloca [32 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            70:  %x = alloca [32 x i8], align 16 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            71:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            72:  store [4 x i64] %0, ptr %1, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            73:  call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 8 %1, i32 32, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            74:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            75:  %2 = load fp128, ptr %x, align 16, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            76:  %3 = getelementptr inbounds i8, ptr %x, i32 16 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            77:  %4 = load fp128, ptr %3, align 16, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            78:  store fp128 %2, ptr %_0, align 16 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            79:  %5 = getelementptr inbounds i8, ptr %_0, i32 16 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            80:  store fp128 %4, ptr %5, align 16 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            81:  ret void 
check:123'0     ~~~~~~~~~~
            82: } 
check:123'0     ~~
            83:  
check:123'0     ~
            84: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            85: define i32 @cplx_i8(i32 %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            86: start: 
check:123'0     ~~~~~~~
            87:  %_0 = alloca [4 x i8], align 1 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            88:  %1 = alloca [4 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            89:  %x = alloca [2 x i8], align 1 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            90:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            91:  store i32 %0, ptr %1, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            92:  call void @llvm.memcpy.p0.p0.i32(ptr align 1 %x, ptr align 4 %1, i32 2, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            93:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            94:  %2 = load i8, ptr %x, align 1, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            95:  %3 = getelementptr inbounds i8, ptr %x, i32 1 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            96:  %4 = load i8, ptr %3, align 1, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            97:  store i8 %2, ptr %_0, align 1 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            98:  %5 = getelementptr inbounds i8, ptr %_0, i32 1 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            99:  store i8 %4, ptr %5, align 1 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           100:  %6 = load i32, ptr %_0, align 1 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           101:  ret i32 %6 
check:123'0     ~~~~~~~~~~~~
           102: } 
check:123'0     ~~
           103:  
check:123'0     ~
           104: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           105: define i32 @cplx_i16(i32 %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           106: start: 
check:123'0     ~~~~~~~
           107:  %_0 = alloca [4 x i8], align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           108:  %1 = alloca [4 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           109:  %x = alloca [4 x i8], align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           110:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           111:  store i32 %0, ptr %1, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           112:  call void @llvm.memcpy.p0.p0.i32(ptr align 2 %x, ptr align 4 %1, i32 4, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           113:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           114:  %2 = load i16, ptr %x, align 2, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           115:  %3 = getelementptr inbounds i8, ptr %x, i32 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           116:  %4 = load i16, ptr %3, align 2, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           117:  store i16 %2, ptr %_0, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           118:  %5 = getelementptr inbounds i8, ptr %_0, i32 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           119:  store i16 %4, ptr %5, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           120:  %6 = load i32, ptr %_0, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           121:  ret i32 %6 
check:123'0     ~~~~~~~~~~~~
           122: } 
check:123'0     ~~
           123:  
check:123'0     ~
           124: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           125: define void @cplx_i32(ptr dead_on_unwind noalias nofree noundef writable sret([8 x i8]) align 4 captures(address) dereferenceable(8) %_0, [2 x i32] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           126: start: 
check:123'0     ~~~~~~~
           127:  %1 = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           128:  %x = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           129:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           130:  store [2 x i32] %0, ptr %1, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           131:  call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 %1, i32 8, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           132:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           133:  %2 = load i32, ptr %x, align 4, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           134:  %3 = getelementptr inbounds i8, ptr %x, i32 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           135:  %4 = load i32, ptr %3, align 4, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           136:  store i32 %2, ptr %_0, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           137:  %5 = getelementptr inbounds i8, ptr %_0, i32 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           138:  store i32 %4, ptr %5, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           139:  ret void 
check:123'0     ~~~~~~~~~~
           140: } 
check:123'0     ~~
           141:  
check:123'0     ~
           142: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           143: define void @cplx_i64(ptr dead_on_unwind noalias nofree noundef writable sret([16 x i8]) align 8 captures(address) dereferenceable(16) %_0, [2 x i64] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           144: start: 
check:123'0     ~~~~~~~
           145:  %1 = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           146:  %x = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           147:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             .
             .
             .
>>>>>>

------------------------------------------

error in revision `ARM`: verification with 'FileCheck' failed
status: exit status: 1
command: "/usr/lib/llvm-22/bin/FileCheck" "--input-file" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/codegen-llvm/complex-abi.ARM/complex-abi.ll" "/checkout/tests/codegen-llvm/complex-abi.rs" "--check-prefix=CHECK" "--check-prefix" "ARM" "--allow-unused-prefixes" "--dump-input-context" "100"
stdout: none
--- stderr -------------------------------
/checkout/tests/codegen-llvm/complex-abi.rs:123:10: error: ARM: expected string not found in input
 // ARM: define{{.*}} [2 x half] @cplx_f16([2 x half] {{.*}})
         ^
/checkout/obj/build/aarch64-unknown-linux-gnu/test/codegen-llvm/complex-abi.ARM/complex-abi.ll:1:1: note: scanning from here
; ModuleID = 'complex_abi.8dfb70534ff3b38e-cgu.0'
^
/checkout/obj/build/aarch64-unknown-linux-gnu/test/codegen-llvm/complex-abi.ARM/complex-abi.ll:47:1: note: possible intended match here
define [2 x double] @cplx_f64([2 x double] %0) unnamed_addr #0 {
^

Input file: /checkout/obj/build/aarch64-unknown-linux-gnu/test/codegen-llvm/complex-abi.ARM/complex-abi.ll
Check file: /checkout/tests/codegen-llvm/complex-abi.rs

-dump-input=help explains the following input dump.

Input was:
<<<<<<
             1: ; ModuleID = 'complex_abi.8dfb70534ff3b38e-cgu.0' 
check:123'0     X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
             2: source_filename = "complex_abi.8dfb70534ff3b38e-cgu.0" 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             3: target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             4: target triple = "arm-unknown-linux-gnueabihf" 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             5:  
check:123'0     ~
             6: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             7: define i32 @cplx_f16(i32 %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             8: start: 
check:123'0     ~~~~~~~
             9:  %_0 = alloca [4 x i8], align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            10:  %1 = alloca [4 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            11:  %x = alloca [4 x i8], align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            12:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            13:  store i32 %0, ptr %1, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            14:  call void @llvm.memcpy.p0.p0.i32(ptr align 2 %x, ptr align 4 %1, i32 4, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            15:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            16:  %2 = load half, ptr %x, align 2, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            17:  %3 = getelementptr inbounds i8, ptr %x, i32 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            18:  %4 = load half, ptr %3, align 2, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            19:  store half %2, ptr %_0, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            20:  %5 = getelementptr inbounds i8, ptr %_0, i32 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            21:  store half %4, ptr %5, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            22:  %6 = load i32, ptr %_0, align 2 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            23:  ret i32 %6 
check:123'0     ~~~~~~~~~~~~
            24: } 
check:123'0     ~~
            25:  
check:123'0     ~
            26: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            27: define [2 x float] @cplx_f32([2 x float] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            28: start: 
check:123'0     ~~~~~~~
            29:  %_0 = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            30:  %1 = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            31:  %x = alloca [8 x i8], align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            32:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            33:  store [2 x float] %0, ptr %1, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            34:  call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 %1, i32 8, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            35:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            36:  %2 = load float, ptr %x, align 4, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            37:  %3 = getelementptr inbounds i8, ptr %x, i32 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            38:  %4 = load float, ptr %3, align 4, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            39:  store float %2, ptr %_0, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            40:  %5 = getelementptr inbounds i8, ptr %_0, i32 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            41:  store float %4, ptr %5, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            42:  %6 = load [2 x float], ptr %_0, align 4 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            43:  ret [2 x float] %6 
check:123'0     ~~~~~~~~~~~~~~~~~~~~
            44: } 
check:123'0     ~~
            45:  
check:123'0     ~
            46: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            47: define [2 x double] @cplx_f64([2 x double] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:123'1     ?                                                                 possible intended match
            48: start: 
check:123'0     ~~~~~~~
            49:  %_0 = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            50:  %1 = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            51:  %x = alloca [16 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            52:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            53:  store [2 x double] %0, ptr %1, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            54:  call void @llvm.memcpy.p0.p0.i32(ptr align 8 %x, ptr align 8 %1, i32 16, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            55:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            56:  %2 = load double, ptr %x, align 8, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            57:  %3 = getelementptr inbounds i8, ptr %x, i32 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            58:  %4 = load double, ptr %3, align 8, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            59:  store double %2, ptr %_0, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            60:  %5 = getelementptr inbounds i8, ptr %_0, i32 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            61:  store double %4, ptr %5, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            62:  %6 = load [2 x double], ptr %_0, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            63:  ret [2 x double] %6 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~
            64: } 
check:123'0     ~~
            65:  
check:123'0     ~
            66: ; Function Attrs: nounwind uwtable 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            67: define void @cplx_f128(ptr dead_on_unwind noalias nofree noundef writable sret([32 x i8]) align 16 captures(address) dereferenceable(32) %_0, [4 x i64] %0) unnamed_addr #0 { 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            68: start: 
check:123'0     ~~~~~~~
            69:  %1 = alloca [32 x i8], align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            70:  %x = alloca [32 x i8], align 16 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            71:  call void @llvm.lifetime.start.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            72:  store [4 x i64] %0, ptr %1, align 8 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            73:  call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 8 %1, i32 32, i1 false) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            74:  call void @llvm.lifetime.end.p0(ptr %1) 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            75:  %2 = load fp128, ptr %x, align 16, !noundef !3 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            76:  %3 = getelementptr inbounds i8, ptr %x, i32 16 
check:123'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            77:  %4 = load fp128, ptr %3, align 16, !noundef !3 

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-ABI Area: Concerning the application binary interface (ABI) O-Arm Target: 32-bit Arm processors (armv6, armv7, thumb...), including 64-bit Arm in AArch32 state S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants