diff --git a/cranelift/codegen/meta-python/base/instructions.py b/cranelift/codegen/meta-python/base/instructions.py index 48adc399ce..1c0ebc164f 100644 --- a/cranelift/codegen/meta-python/base/instructions.py +++ b/cranelift/codegen/meta-python/base/instructions.py @@ -164,7 +164,7 @@ jump_table_entry = Instruction( Currently, the only type supported is entries which are relative to the base of the jump table. """, - ins=(x, addr, Size, JT), outs=entry) + ins=(x, addr, Size, JT), outs=entry, can_load=True) jump_table_base = Instruction( 'jump_table_base', r""" diff --git a/cranelift/codegen/meta/src/shared/instructions.rs b/cranelift/codegen/meta/src/shared/instructions.rs index 284594f6a8..d9a45f0a3b 100644 --- a/cranelift/codegen/meta/src/shared/instructions.rs +++ b/cranelift/codegen/meta/src/shared/instructions.rs @@ -309,7 +309,8 @@ pub fn define( "#, ) .operands_in(vec![x, addr, Size, JT]) - .operands_out(vec![entry]), + .operands_out(vec![entry]) + .can_load(true), ); ig.push( diff --git a/cranelift/filetests/filetests/licm/jump-table-entry.clif b/cranelift/filetests/filetests/licm/jump-table-entry.clif new file mode 100644 index 0000000000..00a6b3fd14 --- /dev/null +++ b/cranelift/filetests/filetests/licm/jump-table-entry.clif @@ -0,0 +1,29 @@ +test licm + +target x86_64 + +function %dont_hoist_jump_table_entry_during_licm() { + jt0 = jump_table [ebb1, ebb1] + +ebb0: + fallthrough ebb1 + +ebb1: ; the loop! + v2 = iconst.i32 42 + v3 = ifcmp_imm v2, 0 + brif uge v3, ebb1 + fallthrough ebb2 + +ebb2: + v1 = iconst.i32 -14 + v8 = ifcmp_imm v1, 2 + brif uge v8, ebb1 + v5 = jump_table_base.i64 jt0 + v6 = jump_table_entry.i64 v1, v5, 4, jt0 + v7 = iadd v5, v6 + indirect_jump_table_br v7, jt0 +; check: ebb2: +; nextln: v8 = ifcmp_imm.i32 v1, 2 +; nextln: brif uge v8, ebb1 +; nextln: jump_table_entry.i64 +}