From b475b9bd19d99dcfc92c9468b46fcfb8a19b0ffe Mon Sep 17 00:00:00 2001 From: Trevor Elliott Date: Mon, 5 Dec 2022 12:13:28 -0800 Subject: [PATCH] Terminate blocks with a single branch in riscv64 (#5374) Ensure that we're terminating blocks with a single branch instruction, when testing I128 values against zero. --- cranelift/codegen/src/isa/riscv64/inst.isle | 14 ++++++++++++++ .../filetests/filetests/isa/riscv64/condbr.clif | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cranelift/codegen/src/isa/riscv64/inst.isle b/cranelift/codegen/src/isa/riscv64/inst.isle index 62df94a605..439775bec8 100644 --- a/cranelift/codegen/src/isa/riscv64/inst.isle +++ b/cranelift/codegen/src/isa/riscv64/inst.isle @@ -1921,6 +1921,13 @@ (lower_branch (brz v @ (value_type ty) _ _) targets) (lower_brz_or_nz (IntCC.Equal) (normalize_cmp_value ty v) targets ty)) +;; Special case for SI128 to reify the comparison value and branch on it. +(rule 2 + (lower_branch (brz v @ (value_type $I128) _ _) targets) + (let ((zero ValueRegs (value_regs (zero_reg) (zero_reg))) + (cmp Reg (gen_icmp (IntCC.Equal) v zero $I128))) + (lower_brz_or_nz (IntCC.NotEqual) cmp targets $I64))) + (rule 1 (lower_branch (brz (icmp cc a @ (value_type ty) b) _ _) targets) (lower_br_icmp (intcc_inverse cc) a b targets ty)) @@ -1934,6 +1941,13 @@ (lower_branch (brnz v @ (value_type ty) _ _) targets) (lower_brz_or_nz (IntCC.NotEqual) (normalize_cmp_value ty v) targets ty)) +;; Special case for SI128 to reify the comparison value and branch on it. +(rule 2 + (lower_branch (brnz v @ (value_type $I128) _ _) targets) + (let ((zero ValueRegs (value_regs (zero_reg) (zero_reg))) + (cmp Reg (gen_icmp (IntCC.NotEqual) v zero $I128))) + (lower_brz_or_nz (IntCC.NotEqual) cmp targets $I64))) + (rule 1 (lower_branch (brnz (icmp cc a @ (value_type ty) b) _ _) targets) (lower_br_icmp cc a b targets ty)) diff --git a/cranelift/filetests/filetests/isa/riscv64/condbr.clif b/cranelift/filetests/filetests/isa/riscv64/condbr.clif index 587175faaa..984140a020 100644 --- a/cranelift/filetests/filetests/isa/riscv64/condbr.clif +++ b/cranelift/filetests/filetests/isa/riscv64/condbr.clif @@ -170,8 +170,8 @@ block1: } ; block0: -; bne a1,zero,taken(label2),not_taken(0) -; beq a0,zero,taken(label1),not_taken(label2) +; eq a0,[a0,a1],[zerozero]##ty=i128 +; bne a0,zero,taken(label1),not_taken(label2) ; block1: ; j label3 ; block2: @@ -190,7 +190,7 @@ block1: } ; block0: -; bne a1,zero,taken(label1),not_taken(0) +; ne a0,[a0,a1],[zerozero]##ty=i128 ; bne a0,zero,taken(label1),not_taken(label2) ; block1: ; j label3