| Index: tests_lit/llvm2ice_tests/bool-folding.ll
|
| diff --git a/tests_lit/llvm2ice_tests/bool-folding.ll b/tests_lit/llvm2ice_tests/bool-folding.ll
|
| index 13ee8c44611aa2adbcb1c694b139fc1fba586b59..584c797798888d9d46ca670bba885959f2e8480a 100644
|
| --- a/tests_lit/llvm2ice_tests/bool-folding.ll
|
| +++ b/tests_lit/llvm2ice_tests/bool-folding.ll
|
| @@ -4,6 +4,11 @@
|
|
|
| ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 | FileCheck %s
|
|
|
| +; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \
|
| +; RUN: --target arm32 -i %s --args -O2 --skip-unimplemented \
|
| +; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \
|
| +; RUN: --check-prefix=ARM32
|
| +
|
| declare void @use_value(i32)
|
|
|
| ; Basic cmp/branch folding.
|
| @@ -20,6 +25,9 @@ branch2:
|
| ; CHECK-LABEL: fold_cmp_br
|
| ; CHECK: cmp
|
| ; CHECK: jge
|
| +; ARM32-LABEL: fold_cmp_br
|
| +; ARM32: cmp
|
| +; ARM32: beq
|
|
|
|
|
| ; Cmp/branch folding with intervening instructions.
|
| @@ -39,6 +47,13 @@ branch2:
|
| ; CHECK: call
|
| ; CHECK: cmp
|
| ; CHECK: jge
|
| +; ARM32-LABEL: fold_cmp_br_intervening_insts
|
| +; ARM32: push {{[{].*[}]}}
|
| +; ARM32: movlt [[TMP:r[0-9]+]], #1
|
| +; ARM32: mov [[P:r[4-7]]], [[TMP]]
|
| +; ARM32: bl
|
| +; ARM32: cmp [[P]], #0
|
| +; ARM32: beq
|
|
|
|
|
| ; Cmp/branch non-folding because of live-out.
|
| @@ -59,6 +74,11 @@ branch2:
|
| ; CHECK: set
|
| ; CHECK: cmp
|
| ; CHECK: je
|
| +; ARM32-LABEL: no_fold_cmp_br_liveout
|
| +; ARM32: cmp
|
| +; ARM32: movlt [[REG:r[0-9]+]]
|
| +; ARM32: cmp [[REG]], #0
|
| +; ARM32: beq
|
|
|
|
|
| ; Cmp/branch non-folding because of extra non-whitelisted uses.
|
| @@ -79,6 +99,14 @@ branch2:
|
| ; CHECK: movzx
|
| ; CHECK: cmp
|
| ; CHECK: je
|
| +; ARM32-LABEL: no_fold_cmp_br_non_whitelist
|
| +; ARM32: mov [[R:r[0-9]+]], #0
|
| +; ARM32: cmp r0, r1
|
| +; ARM32: movlt [[R]], #1
|
| +; ARM32: mov [[R2:r[0-9]+]], [[R]]
|
| +; ARM32: and [[R3:r[0-9]+]], [[R2]], #1
|
| +; ARM32: cmp [[R]]
|
| +; ARM32: beq
|
|
|
|
|
| ; Basic cmp/select folding.
|
| @@ -92,6 +120,11 @@ entry:
|
| ; CHECK-LABEL: fold_cmp_select
|
| ; CHECK: cmp
|
| ; CHECK: cmovl
|
| +; ARM32-LABEL: fold_cmp_select
|
| +; ARM32: mov [[R:r[0-9]+]], #0
|
| +; ARM32: cmp r0, r1
|
| +; ARM32: movlt [[R]], #1
|
| +; ARM32: cmp [[R]], #0
|
|
|
|
|
| ; 64-bit cmp/select folding.
|
| @@ -108,6 +141,17 @@ entry:
|
| ; CHECK: cmp
|
| ; CHECK: cmovl
|
| ; CHECK: cmovl
|
| +; ARM32-LABEL: fold_cmp_select_64
|
| +; ARM32: mov [[R:r[0-9]+]], #0
|
| +; ARM32: cmp r0, r2
|
| +; ARM32: movlt [[R]], #1
|
| +; ARM32: cmp [[R]], #0
|
| +; ARM32: movne
|
| +; ARM32: movne
|
| +; ARM32-DAG: mov r0
|
| +; ARM32-DAG: mov r1
|
| +; ARM32: bx lr
|
| +
|
|
|
| define i64 @fold_cmp_select_64_undef(i64 %arg1) {
|
| entry:
|
| @@ -120,6 +164,16 @@ entry:
|
| ; CHECK: cmp
|
| ; CHECK: cmovl
|
| ; CHECK: cmovl
|
| +; ARM32-LABEL: fold_cmp_select_64_undef
|
| +; ARM32: cmp {{r[0-9]+}}, r0
|
| +; ARM32: movlt [[R:r[0-9]+]], #1
|
| +; ARM32: cmp [[R]]
|
| +; ARM32: movne
|
| +; ARM32: movne
|
| +; ARM32-DAG: mov r0
|
| +; ARM32-DAG: mov r1
|
| +; ARM32: bx lr
|
| +
|
|
|
| ; Cmp/select folding with intervening instructions.
|
| define i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) {
|
| @@ -135,6 +189,17 @@ entry:
|
| ; CHECK: call
|
| ; CHECK: cmp
|
| ; CHECK: cmovl
|
| +; ARM32-LABEL: fold_cmp_select_intervening_insts
|
| +; ARM32: mov [[RES0:r[4-7]+]], r0
|
| +; ARM32: mov [[RES1:r[4-7]+]], r1
|
| +; ARM32: mov [[R:r[0-9]+]], #0
|
| +; ARM32: cmp r{{[0-9]+}}, r{{[0-9]+}}
|
| +; ARM32: movlt [[R]], #1
|
| +; ARM32: mov [[R2:r[4-7]]], [[R]]
|
| +; ARM32: bl use_value
|
| +; ARM32: cmp [[R2]], #0
|
| +; ARM32: movne [[RES1]], [[RES0]]
|
| +; ARM32: mov r0, [[RES1]]
|
|
|
|
|
| ; Cmp/multi-select folding.
|
| @@ -158,6 +223,21 @@ entry:
|
| ; CHECK: cmovge
|
| ; CHECK: add
|
| ; CHECK: add
|
| +; ARM32-LABEL: fold_cmp_select_multi
|
| +; ARM32-DAG: mov [[T0:r[0-9]+]], #0
|
| +; ARM32-DAG: cmp r0, r1
|
| +; ARM32: movlt [[T0]], #1
|
| +; ARM32-DAG: mov [[T1:r[0-9]+]], r1
|
| +; ARM32-DAG: cmp [[T0]], #0
|
| +; ARM32: [[T1]], r0
|
| +; ARM32-DAG: mov [[T2:r[0-9]+]], r0
|
| +; ARM32-DAG: cmp [[T0]], #0
|
| +; ARM32: [[T2]], r1
|
| +; ARM32: cmp [[T0]], #0
|
| +; ARM32: movne
|
| +; ARM32: add
|
| +; ARM32: add
|
| +; ARM32: bx lr
|
|
|
|
|
| ; Cmp/multi-select non-folding because of live-out.
|
| @@ -184,7 +264,22 @@ next:
|
| ; CHECK: cmove
|
| ; CHECK: add
|
| ; CHECK: add
|
| -
|
| +; ARM32-LABEL: no_fold_cmp_select_multi_liveout
|
| +; ARM32-LABEL: fold_cmp_select_multi
|
| +; ARM32-DAG: mov [[T0:r[0-9]+]], #0
|
| +; ARM32-DAG: cmp r0, r1
|
| +; ARM32: movlt [[T0]], #1
|
| +; ARM32-DAG: mov [[T1:r[0-9]+]], r1
|
| +; ARM32-DAG: cmp [[T0]], #0
|
| +; ARM32: [[T1]], r0
|
| +; ARM32-DAG: mov [[T2:r[0-9]+]], r0
|
| +; ARM32-DAG: cmp [[T0]], #0
|
| +; ARM32: [[T2]], r1
|
| +; ARM32: cmp [[T0]], #0
|
| +; ARM32: movne
|
| +; ARM32: add
|
| +; ARM32: add
|
| +; ARM32: bx lr
|
|
|
| ; Cmp/multi-select non-folding because of extra non-whitelisted uses.
|
| define i32 @no_fold_cmp_select_multi_non_whitelist(i32 %arg1, i32 %arg2) {
|
| @@ -212,3 +307,20 @@ entry:
|
| ; CHECK: add
|
| ; CHECK: add
|
| ; CHECK: add
|
| +; ARM32-LABEL: no_fold_cmp_select_multi_non_whitelist
|
| +; ARM32-DAG: mov [[T0:r[0-9]+]], #0
|
| +; ARM32-DAG: cmp r0, r1
|
| +; ARM32: movlt [[T0]], #1
|
| +; ARM32-DAG: mov [[T1:r[0-9]+]], r1
|
| +; ARM32-DAG: cmp [[T0]], #0
|
| +; ARM32: [[T1]], r0
|
| +; ARM32-DAG: mov [[T2:r[0-9]+]], r0
|
| +; ARM32-DAG: cmp [[T0]], #0
|
| +; ARM32: [[T2]], r1
|
| +; ARM32: cmp [[T0]], #0
|
| +; ARM32: movne
|
| +; ARM32: and {{.*}}, [[T0]], #1
|
| +; ARM32: add
|
| +; ARM32: add
|
| +; ARM32: add
|
| +; ARM32: bx lr
|
|
|