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 |