From 7d1b5ce58412a1a071462f32d08c982450b7ca2f Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 10 Jun 2025 15:34:06 +0200 Subject: [PATCH 1/2] C++: Add basic Aarch64 Neon test --- .../library-tests/ir/ir/PrintAST.expected | 71 ++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 83 +++++++++++++++++++ cpp/ql/test/library-tests/ir/ir/arm.cpp | 23 +++++ .../test/library-tests/ir/ir/raw_ir.expected | 77 +++++++++++++++++ 4 files changed, 254 insertions(+) create mode 100644 cpp/ql/test/library-tests/ir/ir/arm.cpp diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 0b825a0a855b..76e1175f98c8 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -58,6 +58,77 @@ #-----| Type = [LongType] unsigned long #-----| getParameter(1): [Parameter] (unnamed parameter 1) #-----| Type = [ScopedEnum] align_val_t +arm.cpp: +# 6| [TopLevelFunction] uint8x8_t vadd_u8(uint8x8_t, uint8x8_t) +# 6| : +# 6| getParameter(0): [Parameter] __a +# 6| Type = [CTypedefType] uint8x8_t +# 6| getParameter(1): [Parameter] __b +# 6| Type = [CTypedefType] uint8x8_t +# 7| getEntryPoint(): [BlockStmt] { ... } +# 8| getStmt(0): [ReturnStmt] return ... +# 8| getExpr(): [AddExpr] ... + ... +# 8| Type = [GNUVectorType] __attribute((neon_vector_type(8))) unsigned char +# 8| ValueCategory = prvalue +# 8| getLeftOperand(): [VariableAccess] __a +# 8| Type = [CTypedefType] uint8x8_t +# 8| ValueCategory = prvalue(load) +# 8| getRightOperand(): [VariableAccess] __b +# 8| Type = [CTypedefType] uint8x8_t +# 8| ValueCategory = prvalue(load) +# 13| [TopLevelFunction] uint16x8_t __builtin_aarch64_uaddlv8qi_uuu(uint8x8_t, uint8x8_t) +# 13| : +# 13| getParameter(0): [Parameter] (unnamed parameter 0) +# 13| Type = [CTypedefType] uint8x8_t +# 13| getParameter(1): [Parameter] (unnamed parameter 1) +# 13| Type = [CTypedefType] uint8x8_t +# 15| [TopLevelFunction] uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) +# 15| : +# 15| getParameter(0): [Parameter] __a +# 15| Type = [CTypedefType] uint8x8_t +# 15| getParameter(1): [Parameter] __b +# 15| Type = [CTypedefType] uint8x8_t +# 16| getEntryPoint(): [BlockStmt] { ... } +# 17| getStmt(0): [ReturnStmt] return ... +# 17| getExpr(): [FunctionCall] call to __builtin_aarch64_uaddlv8qi_uuu +# 17| Type = [CTypedefType] uint16x8_t +# 17| ValueCategory = prvalue +# 17| getArgument(0): [VariableAccess] __a +# 17| Type = [CTypedefType] uint8x8_t +# 17| ValueCategory = prvalue(load) +# 17| getArgument(1): [VariableAccess] __b +# 17| Type = [CTypedefType] uint8x8_t +# 17| ValueCategory = prvalue(load) +# 20| [TopLevelFunction] uint16x8_t arm_add(uint8x8_t, uint8x8_t) +# 20| : +# 20| getParameter(0): [Parameter] a +# 20| Type = [CTypedefType] uint8x8_t +# 20| getParameter(1): [Parameter] b +# 20| Type = [CTypedefType] uint8x8_t +# 20| getEntryPoint(): [BlockStmt] { ... } +# 21| getStmt(0): [DeclStmt] declaration +# 21| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 21| Type = [CTypedefType] uint8x8_t +# 21| getVariable().getInitializer(): [Initializer] initializer for c +# 21| getExpr(): [FunctionCall] call to vadd_u8 +# 21| Type = [CTypedefType] uint8x8_t +# 21| ValueCategory = prvalue +# 21| getArgument(0): [VariableAccess] a +# 21| Type = [CTypedefType] uint8x8_t +# 21| ValueCategory = prvalue(load) +# 21| getArgument(1): [VariableAccess] b +# 21| Type = [CTypedefType] uint8x8_t +# 21| ValueCategory = prvalue(load) +# 22| getStmt(1): [ReturnStmt] return ... +# 22| getExpr(): [FunctionCall] call to vaddl_u8 +# 22| Type = [CTypedefType] uint16x8_t +# 22| ValueCategory = prvalue +# 22| getArgument(0): [VariableAccess] a +# 22| Type = [CTypedefType] uint8x8_t +# 22| ValueCategory = prvalue(load) +# 22| getArgument(1): [VariableAccess] c +# 22| Type = [CTypedefType] uint8x8_t +# 22| ValueCategory = prvalue(load) bad_asts.cpp: # 5| [CopyAssignmentOperator] Bad::S& Bad::S::operator=(Bad::S const&) # 5| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 20d593e2379a..f8fb188e4034 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1,3 +1,86 @@ +arm.cpp: +# 6| uint8x8_t vadd_u8(uint8x8_t, uint8x8_t) +# 6| Block 0 +# 6| v6_1(void) = EnterFunction : +# 6| m6_2(unknown) = AliasedDefinition : +# 6| m6_3(unknown) = InitializeNonLocal : +# 6| m6_4(unknown) = Chi : total:m6_2, partial:m6_3 +# 6| r6_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 6| m6_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r6_5 +# 6| r6_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 6| m6_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r6_7 +# 8| r8_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : +# 8| r8_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 8| r8_3(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r8_2, m6_6 +# 8| r8_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 8| r8_5(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r8_4, m6_8 +# 8| r8_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r8_3, r8_5 +# 8| m8_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r8_1, r8_6 +# 6| r6_9(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : +# 6| v6_10(void) = ReturnValue : &:r6_9, m8_7 +# 6| v6_11(void) = AliasedUse : m6_3 +# 6| v6_12(void) = ExitFunction : + +# 15| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) +# 15| Block 0 +# 15| v15_1(void) = EnterFunction : +# 15| m15_2(unknown) = AliasedDefinition : +# 15| m15_3(unknown) = InitializeNonLocal : +# 15| m15_4(unknown) = Chi : total:m15_2, partial:m15_3 +# 15| r15_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 15| m15_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r15_5 +# 15| r15_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 15| m15_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r15_7 +# 17| r17_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 17| r17_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] : +# 17| r17_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 17| r17_4(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r17_3, m15_6 +# 17| r17_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 17| r17_6(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r17_5, m15_8 +# 17| r17_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r17_2, 0:r17_4, 1:r17_6 +# 17| m17_8(unknown) = ^CallSideEffect : ~m15_4 +# 17| m17_9(unknown) = Chi : total:m15_4, partial:m17_8 +# 17| m17_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r17_1, r17_7 +# 15| r15_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 15| v15_10(void) = ReturnValue : &:r15_9, m17_10 +# 15| v15_11(void) = AliasedUse : ~m17_9 +# 15| v15_12(void) = ExitFunction : + +# 20| uint16x8_t arm_add(uint8x8_t, uint8x8_t) +# 20| Block 0 +# 20| v20_1(void) = EnterFunction : +# 20| m20_2(unknown) = AliasedDefinition : +# 20| m20_3(unknown) = InitializeNonLocal : +# 20| m20_4(unknown) = Chi : total:m20_2, partial:m20_3 +# 20| r20_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 20| m20_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r20_5 +# 20| r20_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 20| m20_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r20_7 +# 21| r21_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 21| r21_2(glval) = FunctionAddress[vadd_u8] : +# 21| r21_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 21| r21_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r21_3, m20_6 +# 21| r21_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 21| r21_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r21_5, m20_8 +# 21| r21_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r21_2, 0:r21_4, 1:r21_6 +# 21| m21_8(unknown) = ^CallSideEffect : ~m20_4 +# 21| m21_9(unknown) = Chi : total:m20_4, partial:m21_8 +# 21| m21_10(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r21_1, r21_7 +# 22| r22_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 22| r22_2(glval) = FunctionAddress[vaddl_u8] : +# 22| r22_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 22| r22_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r22_3, m20_6 +# 22| r22_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 22| r22_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r22_5, m21_10 +# 22| r22_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r22_2, 0:r22_4, 1:r22_6 +# 22| m22_8(unknown) = ^CallSideEffect : ~m21_9 +# 22| m22_9(unknown) = Chi : total:m21_9, partial:m22_8 +# 22| m22_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r22_1, r22_7 +# 20| r20_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 20| v20_10(void) = ReturnValue : &:r20_9, m22_10 +# 20| v20_11(void) = AliasedUse : ~m22_9 +# 20| v20_12(void) = ExitFunction : + bad_asts.cpp: # 9| int Bad::S::MemberFunction(int) # 9| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/arm.cpp b/cpp/ql/test/library-tests/ir/ir/arm.cpp new file mode 100644 index 000000000000..c10558b24fad --- /dev/null +++ b/cpp/ql/test/library-tests/ir/ir/arm.cpp @@ -0,0 +1,23 @@ +// semmle-extractor-options: --edg --target --edg linux_arm64 + +typedef __Uint8x8_t uint8x8_t; +typedef __Uint16x8_t uint16x8_t; + +uint8x8_t vadd_u8 (uint8x8_t __a, uint8x8_t __b) +{ + return __a + __b; +} + +// Workaround: the frontend only exposes this when the arm_neon.h +// header is encountered. +uint16x8_t __builtin_aarch64_uaddlv8qi_uuu(uint8x8_t, uint8x8_t); + +uint16x8_t vaddl_u8 (uint8x8_t __a, uint8x8_t __b) +{ + return __builtin_aarch64_uaddlv8qi_uuu (__a, __b); +} + +uint16x8_t arm_add(uint8x8_t a, uint8x8_t b) { + uint8x8_t c = vadd_u8(a, b); + return vaddl_u8(a, c); +} diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 11d74a2a26bd..33f680e20fe1 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1,3 +1,80 @@ +arm.cpp: +# 6| uint8x8_t vadd_u8(uint8x8_t, uint8x8_t) +# 6| Block 0 +# 6| v6_1(void) = EnterFunction : +# 6| mu6_2(unknown) = AliasedDefinition : +# 6| mu6_3(unknown) = InitializeNonLocal : +# 6| r6_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 6| mu6_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r6_4 +# 6| r6_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 6| mu6_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r6_6 +# 8| r8_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : +# 8| r8_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 8| r8_3(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r8_2, ~m? +# 8| r8_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 8| r8_5(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r8_4, ~m? +# 8| r8_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r8_3, r8_5 +# 8| mu8_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r8_1, r8_6 +# 6| r6_8(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : +# 6| v6_9(void) = ReturnValue : &:r6_8, ~m? +# 6| v6_10(void) = AliasedUse : ~m? +# 6| v6_11(void) = ExitFunction : + +# 15| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) +# 15| Block 0 +# 15| v15_1(void) = EnterFunction : +# 15| mu15_2(unknown) = AliasedDefinition : +# 15| mu15_3(unknown) = InitializeNonLocal : +# 15| r15_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 15| mu15_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r15_4 +# 15| r15_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 15| mu15_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r15_6 +# 17| r17_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 17| r17_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] : +# 17| r17_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : +# 17| r17_4(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r17_3, ~m? +# 17| r17_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : +# 17| r17_6(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r17_5, ~m? +# 17| r17_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r17_2, 0:r17_4, 1:r17_6 +# 17| mu17_8(unknown) = ^CallSideEffect : ~m? +# 17| mu17_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r17_1, r17_7 +# 15| r15_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 15| v15_9(void) = ReturnValue : &:r15_8, ~m? +# 15| v15_10(void) = AliasedUse : ~m? +# 15| v15_11(void) = ExitFunction : + +# 20| uint16x8_t arm_add(uint8x8_t, uint8x8_t) +# 20| Block 0 +# 20| v20_1(void) = EnterFunction : +# 20| mu20_2(unknown) = AliasedDefinition : +# 20| mu20_3(unknown) = InitializeNonLocal : +# 20| r20_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 20| mu20_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r20_4 +# 20| r20_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 20| mu20_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r20_6 +# 21| r21_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 21| r21_2(glval) = FunctionAddress[vadd_u8] : +# 21| r21_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 21| r21_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r21_3, ~m? +# 21| r21_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 21| r21_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r21_5, ~m? +# 21| r21_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r21_2, 0:r21_4, 1:r21_6 +# 21| mu21_8(unknown) = ^CallSideEffect : ~m? +# 21| mu21_9(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r21_1, r21_7 +# 22| r22_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 22| r22_2(glval) = FunctionAddress[vaddl_u8] : +# 22| r22_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 22| r22_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r22_3, ~m? +# 22| r22_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 22| r22_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r22_5, ~m? +# 22| r22_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r22_2, 0:r22_4, 1:r22_6 +# 22| mu22_8(unknown) = ^CallSideEffect : ~m? +# 22| mu22_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r22_1, r22_7 +# 20| r20_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 20| v20_9(void) = ReturnValue : &:r20_8, ~m? +# 20| v20_10(void) = AliasedUse : ~m? +# 20| v20_11(void) = ExitFunction : + bad_asts.cpp: # 9| int Bad::S::MemberFunction(int) # 9| Block 0 From a4be27659bc708f210d76cb1280f659433122b7f Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 10 Jun 2025 15:55:18 +0200 Subject: [PATCH 2/2] C++: Minor test case reformatting --- .../library-tests/ir/ir/PrintAST.expected | 132 ++++++++-------- .../library-tests/ir/ir/aliased_ir.expected | 142 +++++++++--------- cpp/ql/test/library-tests/ir/ir/arm.cpp | 14 +- .../test/library-tests/ir/ir/raw_ir.expected | 130 ++++++++-------- 4 files changed, 208 insertions(+), 210 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 76e1175f98c8..b9ffaf71656b 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -61,74 +61,74 @@ arm.cpp: # 6| [TopLevelFunction] uint8x8_t vadd_u8(uint8x8_t, uint8x8_t) # 6| : -# 6| getParameter(0): [Parameter] __a +# 6| getParameter(0): [Parameter] a # 6| Type = [CTypedefType] uint8x8_t -# 6| getParameter(1): [Parameter] __b +# 6| getParameter(1): [Parameter] b # 6| Type = [CTypedefType] uint8x8_t -# 7| getEntryPoint(): [BlockStmt] { ... } -# 8| getStmt(0): [ReturnStmt] return ... -# 8| getExpr(): [AddExpr] ... + ... -# 8| Type = [GNUVectorType] __attribute((neon_vector_type(8))) unsigned char -# 8| ValueCategory = prvalue -# 8| getLeftOperand(): [VariableAccess] __a -# 8| Type = [CTypedefType] uint8x8_t -# 8| ValueCategory = prvalue(load) -# 8| getRightOperand(): [VariableAccess] __b -# 8| Type = [CTypedefType] uint8x8_t -# 8| ValueCategory = prvalue(load) -# 13| [TopLevelFunction] uint16x8_t __builtin_aarch64_uaddlv8qi_uuu(uint8x8_t, uint8x8_t) -# 13| : -# 13| getParameter(0): [Parameter] (unnamed parameter 0) -# 13| Type = [CTypedefType] uint8x8_t -# 13| getParameter(1): [Parameter] (unnamed parameter 1) -# 13| Type = [CTypedefType] uint8x8_t -# 15| [TopLevelFunction] uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) -# 15| : -# 15| getParameter(0): [Parameter] __a -# 15| Type = [CTypedefType] uint8x8_t -# 15| getParameter(1): [Parameter] __b -# 15| Type = [CTypedefType] uint8x8_t -# 16| getEntryPoint(): [BlockStmt] { ... } -# 17| getStmt(0): [ReturnStmt] return ... -# 17| getExpr(): [FunctionCall] call to __builtin_aarch64_uaddlv8qi_uuu -# 17| Type = [CTypedefType] uint16x8_t -# 17| ValueCategory = prvalue -# 17| getArgument(0): [VariableAccess] __a -# 17| Type = [CTypedefType] uint8x8_t -# 17| ValueCategory = prvalue(load) -# 17| getArgument(1): [VariableAccess] __b -# 17| Type = [CTypedefType] uint8x8_t -# 17| ValueCategory = prvalue(load) -# 20| [TopLevelFunction] uint16x8_t arm_add(uint8x8_t, uint8x8_t) -# 20| : -# 20| getParameter(0): [Parameter] a -# 20| Type = [CTypedefType] uint8x8_t -# 20| getParameter(1): [Parameter] b -# 20| Type = [CTypedefType] uint8x8_t -# 20| getEntryPoint(): [BlockStmt] { ... } -# 21| getStmt(0): [DeclStmt] declaration -# 21| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c -# 21| Type = [CTypedefType] uint8x8_t -# 21| getVariable().getInitializer(): [Initializer] initializer for c -# 21| getExpr(): [FunctionCall] call to vadd_u8 -# 21| Type = [CTypedefType] uint8x8_t -# 21| ValueCategory = prvalue -# 21| getArgument(0): [VariableAccess] a -# 21| Type = [CTypedefType] uint8x8_t -# 21| ValueCategory = prvalue(load) -# 21| getArgument(1): [VariableAccess] b -# 21| Type = [CTypedefType] uint8x8_t -# 21| ValueCategory = prvalue(load) -# 22| getStmt(1): [ReturnStmt] return ... -# 22| getExpr(): [FunctionCall] call to vaddl_u8 -# 22| Type = [CTypedefType] uint16x8_t -# 22| ValueCategory = prvalue -# 22| getArgument(0): [VariableAccess] a -# 22| Type = [CTypedefType] uint8x8_t -# 22| ValueCategory = prvalue(load) -# 22| getArgument(1): [VariableAccess] c -# 22| Type = [CTypedefType] uint8x8_t -# 22| ValueCategory = prvalue(load) +# 6| getEntryPoint(): [BlockStmt] { ... } +# 7| getStmt(0): [ReturnStmt] return ... +# 7| getExpr(): [AddExpr] ... + ... +# 7| Type = [GNUVectorType] __attribute((neon_vector_type(8))) unsigned char +# 7| ValueCategory = prvalue +# 7| getLeftOperand(): [VariableAccess] a +# 7| Type = [CTypedefType] uint8x8_t +# 7| ValueCategory = prvalue(load) +# 7| getRightOperand(): [VariableAccess] b +# 7| Type = [CTypedefType] uint8x8_t +# 7| ValueCategory = prvalue(load) +# 12| [TopLevelFunction] uint16x8_t __builtin_aarch64_uaddlv8qi_uuu(uint8x8_t, uint8x8_t) +# 12| : +# 12| getParameter(0): [Parameter] (unnamed parameter 0) +# 12| Type = [CTypedefType] uint8x8_t +# 12| getParameter(1): [Parameter] (unnamed parameter 1) +# 12| Type = [CTypedefType] uint8x8_t +# 14| [TopLevelFunction] uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) +# 14| : +# 14| getParameter(0): [Parameter] a +# 14| Type = [CTypedefType] uint8x8_t +# 14| getParameter(1): [Parameter] b +# 14| Type = [CTypedefType] uint8x8_t +# 14| getEntryPoint(): [BlockStmt] { ... } +# 15| getStmt(0): [ReturnStmt] return ... +# 15| getExpr(): [FunctionCall] call to __builtin_aarch64_uaddlv8qi_uuu +# 15| Type = [CTypedefType] uint16x8_t +# 15| ValueCategory = prvalue +# 15| getArgument(0): [VariableAccess] a +# 15| Type = [CTypedefType] uint8x8_t +# 15| ValueCategory = prvalue(load) +# 15| getArgument(1): [VariableAccess] b +# 15| Type = [CTypedefType] uint8x8_t +# 15| ValueCategory = prvalue(load) +# 18| [TopLevelFunction] uint16x8_t arm_add(uint8x8_t, uint8x8_t) +# 18| : +# 18| getParameter(0): [Parameter] a +# 18| Type = [CTypedefType] uint8x8_t +# 18| getParameter(1): [Parameter] b +# 18| Type = [CTypedefType] uint8x8_t +# 18| getEntryPoint(): [BlockStmt] { ... } +# 19| getStmt(0): [DeclStmt] declaration +# 19| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 19| Type = [CTypedefType] uint8x8_t +# 19| getVariable().getInitializer(): [Initializer] initializer for c +# 19| getExpr(): [FunctionCall] call to vadd_u8 +# 19| Type = [CTypedefType] uint8x8_t +# 19| ValueCategory = prvalue +# 19| getArgument(0): [VariableAccess] a +# 19| Type = [CTypedefType] uint8x8_t +# 19| ValueCategory = prvalue(load) +# 19| getArgument(1): [VariableAccess] b +# 19| Type = [CTypedefType] uint8x8_t +# 19| ValueCategory = prvalue(load) +# 20| getStmt(1): [ReturnStmt] return ... +# 20| getExpr(): [FunctionCall] call to vaddl_u8 +# 20| Type = [CTypedefType] uint16x8_t +# 20| ValueCategory = prvalue +# 20| getArgument(0): [VariableAccess] a +# 20| Type = [CTypedefType] uint8x8_t +# 20| ValueCategory = prvalue(load) +# 20| getArgument(1): [VariableAccess] c +# 20| Type = [CTypedefType] uint8x8_t +# 20| ValueCategory = prvalue(load) bad_asts.cpp: # 5| [CopyAssignmentOperator] Bad::S& Bad::S::operator=(Bad::S const&) # 5| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index f8fb188e4034..fbd0db5e7966 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -5,81 +5,81 @@ arm.cpp: # 6| m6_2(unknown) = AliasedDefinition : # 6| m6_3(unknown) = InitializeNonLocal : # 6| m6_4(unknown) = Chi : total:m6_2, partial:m6_3 -# 6| r6_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 6| m6_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r6_5 -# 6| r6_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 6| m6_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r6_7 -# 8| r8_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : -# 8| r8_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 8| r8_3(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r8_2, m6_6 -# 8| r8_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 8| r8_5(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r8_4, m6_8 -# 8| r8_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r8_3, r8_5 -# 8| m8_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r8_1, r8_6 +# 6| r6_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 6| m6_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r6_5 +# 6| r6_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 6| m6_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r6_7 +# 7| r7_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : +# 7| r7_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 7| r7_3(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r7_2, m6_6 +# 7| r7_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 7| r7_5(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r7_4, m6_8 +# 7| r7_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r7_3, r7_5 +# 7| m7_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r7_1, r7_6 # 6| r6_9(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : -# 6| v6_10(void) = ReturnValue : &:r6_9, m8_7 +# 6| v6_10(void) = ReturnValue : &:r6_9, m7_7 # 6| v6_11(void) = AliasedUse : m6_3 # 6| v6_12(void) = ExitFunction : -# 15| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) -# 15| Block 0 -# 15| v15_1(void) = EnterFunction : -# 15| m15_2(unknown) = AliasedDefinition : -# 15| m15_3(unknown) = InitializeNonLocal : -# 15| m15_4(unknown) = Chi : total:m15_2, partial:m15_3 -# 15| r15_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 15| m15_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r15_5 -# 15| r15_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 15| m15_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r15_7 -# 17| r17_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 17| r17_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] : -# 17| r17_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 17| r17_4(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r17_3, m15_6 -# 17| r17_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 17| r17_6(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r17_5, m15_8 -# 17| r17_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r17_2, 0:r17_4, 1:r17_6 -# 17| m17_8(unknown) = ^CallSideEffect : ~m15_4 -# 17| m17_9(unknown) = Chi : total:m15_4, partial:m17_8 -# 17| m17_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r17_1, r17_7 -# 15| r15_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 15| v15_10(void) = ReturnValue : &:r15_9, m17_10 -# 15| v15_11(void) = AliasedUse : ~m17_9 -# 15| v15_12(void) = ExitFunction : - -# 20| uint16x8_t arm_add(uint8x8_t, uint8x8_t) -# 20| Block 0 -# 20| v20_1(void) = EnterFunction : -# 20| m20_2(unknown) = AliasedDefinition : -# 20| m20_3(unknown) = InitializeNonLocal : -# 20| m20_4(unknown) = Chi : total:m20_2, partial:m20_3 -# 20| r20_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : -# 20| m20_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r20_5 -# 20| r20_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : -# 20| m20_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r20_7 -# 21| r21_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : -# 21| r21_2(glval) = FunctionAddress[vadd_u8] : -# 21| r21_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : -# 21| r21_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r21_3, m20_6 -# 21| r21_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : -# 21| r21_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r21_5, m20_8 -# 21| r21_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r21_2, 0:r21_4, 1:r21_6 -# 21| m21_8(unknown) = ^CallSideEffect : ~m20_4 -# 21| m21_9(unknown) = Chi : total:m20_4, partial:m21_8 -# 21| m21_10(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r21_1, r21_7 -# 22| r22_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 22| r22_2(glval) = FunctionAddress[vaddl_u8] : -# 22| r22_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : -# 22| r22_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r22_3, m20_6 -# 22| r22_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : -# 22| r22_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r22_5, m21_10 -# 22| r22_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r22_2, 0:r22_4, 1:r22_6 -# 22| m22_8(unknown) = ^CallSideEffect : ~m21_9 -# 22| m22_9(unknown) = Chi : total:m21_9, partial:m22_8 -# 22| m22_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r22_1, r22_7 -# 20| r20_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 20| v20_10(void) = ReturnValue : &:r20_9, m22_10 -# 20| v20_11(void) = AliasedUse : ~m22_9 -# 20| v20_12(void) = ExitFunction : +# 14| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) +# 14| Block 0 +# 14| v14_1(void) = EnterFunction : +# 14| m14_2(unknown) = AliasedDefinition : +# 14| m14_3(unknown) = InitializeNonLocal : +# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3 +# 14| r14_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 14| m14_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r14_5 +# 14| r14_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 14| m14_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r14_7 +# 15| r15_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 15| r15_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] : +# 15| r15_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 15| r15_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r15_3, m14_6 +# 15| r15_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 15| r15_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r15_5, m14_8 +# 15| r15_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r15_2, 0:r15_4, 1:r15_6 +# 15| m15_8(unknown) = ^CallSideEffect : ~m14_4 +# 15| m15_9(unknown) = Chi : total:m14_4, partial:m15_8 +# 15| m15_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r15_1, r15_7 +# 14| r14_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 14| v14_10(void) = ReturnValue : &:r14_9, m15_10 +# 14| v14_11(void) = AliasedUse : ~m15_9 +# 14| v14_12(void) = ExitFunction : + +# 18| uint16x8_t arm_add(uint8x8_t, uint8x8_t) +# 18| Block 0 +# 18| v18_1(void) = EnterFunction : +# 18| m18_2(unknown) = AliasedDefinition : +# 18| m18_3(unknown) = InitializeNonLocal : +# 18| m18_4(unknown) = Chi : total:m18_2, partial:m18_3 +# 18| r18_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 18| m18_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r18_5 +# 18| r18_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 18| m18_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r18_7 +# 19| r19_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 19| r19_2(glval) = FunctionAddress[vadd_u8] : +# 19| r19_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 19| r19_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r19_3, m18_6 +# 19| r19_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 19| r19_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r19_5, m18_8 +# 19| r19_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r19_2, 0:r19_4, 1:r19_6 +# 19| m19_8(unknown) = ^CallSideEffect : ~m18_4 +# 19| m19_9(unknown) = Chi : total:m18_4, partial:m19_8 +# 19| m19_10(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r19_1, r19_7 +# 20| r20_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 20| r20_2(glval) = FunctionAddress[vaddl_u8] : +# 20| r20_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 20| r20_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r20_3, m18_6 +# 20| r20_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 20| r20_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r20_5, m19_10 +# 20| r20_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r20_2, 0:r20_4, 1:r20_6 +# 20| m20_8(unknown) = ^CallSideEffect : ~m19_9 +# 20| m20_9(unknown) = Chi : total:m19_9, partial:m20_8 +# 20| m20_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r20_1, r20_7 +# 18| r18_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 18| v18_10(void) = ReturnValue : &:r18_9, m20_10 +# 18| v18_11(void) = AliasedUse : ~m20_9 +# 18| v18_12(void) = ExitFunction : bad_asts.cpp: # 9| int Bad::S::MemberFunction(int) diff --git a/cpp/ql/test/library-tests/ir/ir/arm.cpp b/cpp/ql/test/library-tests/ir/ir/arm.cpp index c10558b24fad..36e20715bc57 100644 --- a/cpp/ql/test/library-tests/ir/ir/arm.cpp +++ b/cpp/ql/test/library-tests/ir/ir/arm.cpp @@ -3,21 +3,19 @@ typedef __Uint8x8_t uint8x8_t; typedef __Uint16x8_t uint16x8_t; -uint8x8_t vadd_u8 (uint8x8_t __a, uint8x8_t __b) -{ - return __a + __b; +uint8x8_t vadd_u8(uint8x8_t a, uint8x8_t b) { + return a + b; } // Workaround: the frontend only exposes this when the arm_neon.h // header is encountered. uint16x8_t __builtin_aarch64_uaddlv8qi_uuu(uint8x8_t, uint8x8_t); -uint16x8_t vaddl_u8 (uint8x8_t __a, uint8x8_t __b) -{ - return __builtin_aarch64_uaddlv8qi_uuu (__a, __b); +uint16x8_t vaddl_u8(uint8x8_t a, uint8x8_t b) { + return __builtin_aarch64_uaddlv8qi_uuu (a, b); } uint16x8_t arm_add(uint8x8_t a, uint8x8_t b) { - uint8x8_t c = vadd_u8(a, b); - return vaddl_u8(a, c); + uint8x8_t c = vadd_u8(a, b); + return vaddl_u8(a, c); } diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 33f680e20fe1..978d05d4b165 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -4,76 +4,76 @@ arm.cpp: # 6| v6_1(void) = EnterFunction : # 6| mu6_2(unknown) = AliasedDefinition : # 6| mu6_3(unknown) = InitializeNonLocal : -# 6| r6_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 6| mu6_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r6_4 -# 6| r6_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 6| mu6_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r6_6 -# 8| r8_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : -# 8| r8_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 8| r8_3(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r8_2, ~m? -# 8| r8_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 8| r8_5(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r8_4, ~m? -# 8| r8_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r8_3, r8_5 -# 8| mu8_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r8_1, r8_6 +# 6| r6_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 6| mu6_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r6_4 +# 6| r6_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 6| mu6_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r6_6 +# 7| r7_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : +# 7| r7_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 7| r7_3(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r7_2, ~m? +# 7| r7_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 7| r7_5(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r7_4, ~m? +# 7| r7_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r7_3, r7_5 +# 7| mu7_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r7_1, r7_6 # 6| r6_8(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] : # 6| v6_9(void) = ReturnValue : &:r6_8, ~m? # 6| v6_10(void) = AliasedUse : ~m? # 6| v6_11(void) = ExitFunction : -# 15| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) -# 15| Block 0 -# 15| v15_1(void) = EnterFunction : -# 15| mu15_2(unknown) = AliasedDefinition : -# 15| mu15_3(unknown) = InitializeNonLocal : -# 15| r15_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 15| mu15_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__a] : &:r15_4 -# 15| r15_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 15| mu15_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[__b] : &:r15_6 -# 17| r17_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 17| r17_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] : -# 17| r17_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__a] : -# 17| r17_4(__attribute((neon_vector_type(8))) unsigned char) = Load[__a] : &:r17_3, ~m? -# 17| r17_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[__b] : -# 17| r17_6(__attribute((neon_vector_type(8))) unsigned char) = Load[__b] : &:r17_5, ~m? -# 17| r17_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r17_2, 0:r17_4, 1:r17_6 -# 17| mu17_8(unknown) = ^CallSideEffect : ~m? -# 17| mu17_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r17_1, r17_7 -# 15| r15_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 15| v15_9(void) = ReturnValue : &:r15_8, ~m? -# 15| v15_10(void) = AliasedUse : ~m? -# 15| v15_11(void) = ExitFunction : - -# 20| uint16x8_t arm_add(uint8x8_t, uint8x8_t) -# 20| Block 0 -# 20| v20_1(void) = EnterFunction : -# 20| mu20_2(unknown) = AliasedDefinition : -# 20| mu20_3(unknown) = InitializeNonLocal : -# 20| r20_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : -# 20| mu20_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r20_4 -# 20| r20_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : -# 20| mu20_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r20_6 -# 21| r21_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : -# 21| r21_2(glval) = FunctionAddress[vadd_u8] : -# 21| r21_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : -# 21| r21_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r21_3, ~m? -# 21| r21_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : -# 21| r21_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r21_5, ~m? -# 21| r21_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r21_2, 0:r21_4, 1:r21_6 -# 21| mu21_8(unknown) = ^CallSideEffect : ~m? -# 21| mu21_9(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r21_1, r21_7 -# 22| r22_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 22| r22_2(glval) = FunctionAddress[vaddl_u8] : -# 22| r22_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : -# 22| r22_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r22_3, ~m? -# 22| r22_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : -# 22| r22_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r22_5, ~m? -# 22| r22_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r22_2, 0:r22_4, 1:r22_6 -# 22| mu22_8(unknown) = ^CallSideEffect : ~m? -# 22| mu22_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r22_1, r22_7 -# 20| r20_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : -# 20| v20_9(void) = ReturnValue : &:r20_8, ~m? -# 20| v20_10(void) = AliasedUse : ~m? -# 20| v20_11(void) = ExitFunction : +# 14| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t) +# 14| Block 0 +# 14| v14_1(void) = EnterFunction : +# 14| mu14_2(unknown) = AliasedDefinition : +# 14| mu14_3(unknown) = InitializeNonLocal : +# 14| r14_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 14| mu14_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r14_4 +# 14| r14_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 14| mu14_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r14_6 +# 15| r15_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 15| r15_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] : +# 15| r15_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 15| r15_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r15_3, ~m? +# 15| r15_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 15| r15_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r15_5, ~m? +# 15| r15_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r15_2, 0:r15_4, 1:r15_6 +# 15| mu15_8(unknown) = ^CallSideEffect : ~m? +# 15| mu15_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r15_1, r15_7 +# 14| r14_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 14| v14_9(void) = ReturnValue : &:r14_8, ~m? +# 14| v14_10(void) = AliasedUse : ~m? +# 14| v14_11(void) = ExitFunction : + +# 18| uint16x8_t arm_add(uint8x8_t, uint8x8_t) +# 18| Block 0 +# 18| v18_1(void) = EnterFunction : +# 18| mu18_2(unknown) = AliasedDefinition : +# 18| mu18_3(unknown) = InitializeNonLocal : +# 18| r18_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 18| mu18_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r18_4 +# 18| r18_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 18| mu18_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r18_6 +# 19| r19_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 19| r19_2(glval) = FunctionAddress[vadd_u8] : +# 19| r19_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 19| r19_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r19_3, ~m? +# 19| r19_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] : +# 19| r19_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r19_5, ~m? +# 19| r19_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r19_2, 0:r19_4, 1:r19_6 +# 19| mu19_8(unknown) = ^CallSideEffect : ~m? +# 19| mu19_9(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r19_1, r19_7 +# 20| r20_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 20| r20_2(glval) = FunctionAddress[vaddl_u8] : +# 20| r20_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] : +# 20| r20_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r20_3, ~m? +# 20| r20_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] : +# 20| r20_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r20_5, ~m? +# 20| r20_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r20_2, 0:r20_4, 1:r20_6 +# 20| mu20_8(unknown) = ^CallSideEffect : ~m? +# 20| mu20_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r20_1, r20_7 +# 18| r18_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] : +# 18| v18_9(void) = ReturnValue : &:r18_8, ~m? +# 18| v18_10(void) = AliasedUse : ~m? +# 18| v18_11(void) = ExitFunction : bad_asts.cpp: # 9| int Bad::S::MemberFunction(int)