Skip to content

Commit 5ba6c0b

Browse files
committed
ZJIT: Reuse single GetEP per getblockparam/getblockparamproxy handler
1 parent 3522eaa commit 5ba6c0b

3 files changed

Lines changed: 188 additions & 235 deletions

File tree

zjit/src/hir.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7585,15 +7585,13 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
75857585
fun.push_insn(block, Insn::Jump(BranchEdge { target: unmodified_block, args: vec![] }));
75867586

75877587
// Modified block: load the block local via EP.
7588-
let ep = fun.push_insn(modified_block, Insn::GetEP { level });
75897588
let modified_val = fun.get_local_from_ep(modified_block, ep, ep_offset, level, types::BasicObject);
75907589
let mut modified_args = vec![modified_val];
75917590
if level == 0 { modified_args.push(modified_val); }
75927591
fun.push_insn(modified_block, Insn::Jump(BranchEdge { target: join_block, args: modified_args }));
75937592

75947593
// Unmodified block: inspect the current block handler to
75957594
// decide whether this path returns `nil` or `BlockParamProxy`.
7596-
let ep = fun.push_insn(unmodified_block, Insn::GetEP { level });
75977595
let block_handler = fun.push_insn(unmodified_block, Insn::LoadField { recv: ep, id: ID!(_env_data_index_specval), offset: SIZEOF_VALUE_I32 * VM_ENV_DATA_INDEX_SPECVAL, return_type: types::CInt64 });
75987596
let original_local = if level == 0 { Some(state.getlocal(ep_offset)) } else { None };
75997597

@@ -7655,7 +7653,6 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
76557653
}));
76567654

76577655
// Modified block: read Proc from EP.
7658-
let ep = fun.push_insn(modified_block, Insn::GetEP { level });
76597656
let modified_val = fun.get_local_from_ep(modified_block, ep, ep_offset, level, types::BasicObject);
76607657
fun.push_insn(modified_block, Insn::Jump(BranchEdge { target: join_block, args: vec![modified_val] }));
76617658

zjit/src/hir/opt_tests.rs

Lines changed: 74 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -4738,15 +4738,13 @@ mod hir_opt_tests {
47384738
v17:CPtr = GetEP 0
47394739
v18:CBool = IsBlockParamModified v17
47404740
IfTrue v18, bb4()
4741-
v24:CPtr = GetEP 0
4742-
v25:CInt64 = LoadField v24, :_env_data_index_specval@0x1001
4743-
v26:CInt64 = GuardAnyBitSet v25, CUInt64(1)
4744-
v27:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
4745-
Jump bb6(v27, v10)
4741+
v23:CInt64 = LoadField v17, :_env_data_index_specval@0x1001
4742+
v24:CInt64 = GuardAnyBitSet v23, CUInt64(1)
4743+
v25:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
4744+
Jump bb6(v25, v10)
47464745
bb4():
4747-
v21:CPtr = GetEP 0
4748-
v22:BasicObject = LoadField v21, :block@0x1010
4749-
Jump bb6(v22, v22)
4746+
v21:BasicObject = LoadField v17, :block@0x1010
4747+
Jump bb6(v21, v21)
47504748
bb6(v15:BasicObject, v16:BasicObject):
47514749
SideExit NoProfileSend recompile
47524750
");
@@ -4780,26 +4778,23 @@ mod hir_opt_tests {
47804778
v18:CPtr = GetEP 0
47814779
v19:CBool = IsBlockParamModified v18
47824780
IfTrue v19, bb4()
4783-
v25:BasicObject = GetBlockParam :block, l0, EP@4
4784-
Jump bb6(v25)
4781+
v24:BasicObject = GetBlockParam :block, l0, EP@4
4782+
Jump bb6(v24)
47854783
bb4():
4786-
v22:CPtr = GetEP 0
4787-
v23:BasicObject = LoadField v22, :block@0x1001
4788-
Jump bb6(v23)
4784+
v22:BasicObject = LoadField v18, :block@0x1001
4785+
Jump bb6(v22)
47894786
bb6(v17:BasicObject):
4790-
v33:CPtr = GetEP 0
4791-
v34:CBool = IsBlockParamModified v33
4792-
IfTrue v34, bb7()
4793-
v40:CPtr = GetEP 0
4794-
v41:CInt64 = LoadField v40, :_env_data_index_specval@0x1002
4795-
v42:CInt64 = GuardAnyBitSet v41, CUInt64(1)
4796-
v43:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
4797-
Jump bb9(v43, v17)
4787+
v32:CPtr = GetEP 0
4788+
v33:CBool = IsBlockParamModified v32
4789+
IfTrue v33, bb7()
4790+
v38:CInt64 = LoadField v32, :_env_data_index_specval@0x1002
4791+
v39:CInt64 = GuardAnyBitSet v38, CUInt64(1)
4792+
v40:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
4793+
Jump bb9(v40, v17)
47984794
bb7():
4799-
v37:CPtr = GetEP 0
4800-
v38:BasicObject = LoadField v37, :block@0x1001
4801-
Jump bb9(v38, v38)
4802-
bb9(v31:BasicObject, v32:BasicObject):
4795+
v36:BasicObject = LoadField v32, :block@0x1001
4796+
Jump bb9(v36, v36)
4797+
bb9(v30:BasicObject, v31:BasicObject):
48034798
SideExit NoProfileSend recompile
48044799
");
48054800
}
@@ -4830,26 +4825,23 @@ mod hir_opt_tests {
48304825
v14:CPtr = GetEP 1
48314826
v15:CBool = IsBlockParamModified v14
48324827
IfTrue v15, bb4()
4833-
v21:BasicObject = GetBlockParam :block, l1, EP@3
4834-
Jump bb6(v21)
4828+
v20:BasicObject = GetBlockParam :block, l1, EP@3
4829+
Jump bb6(v20)
48354830
bb4():
4836-
v18:CPtr = GetEP 1
4837-
v19:BasicObject = LoadField v18, :block@0x1000
4838-
Jump bb6(v19)
4831+
v18:BasicObject = LoadField v14, :block@0x1000
4832+
Jump bb6(v18)
48394833
bb6(v13:BasicObject):
4840-
v28:CPtr = GetEP 1
4841-
v29:CBool = IsBlockParamModified v28
4842-
IfTrue v29, bb7()
4843-
v35:CPtr = GetEP 1
4844-
v36:CInt64 = LoadField v35, :_env_data_index_specval@0x1001
4845-
v37:CInt64 = GuardAnyBitSet v36, CUInt64(1)
4846-
v38:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
4847-
Jump bb9(v38)
4834+
v27:CPtr = GetEP 1
4835+
v28:CBool = IsBlockParamModified v27
4836+
IfTrue v28, bb7()
4837+
v33:CInt64 = LoadField v27, :_env_data_index_specval@0x1001
4838+
v34:CInt64 = GuardAnyBitSet v33, CUInt64(1)
4839+
v35:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
4840+
Jump bb9(v35)
48484841
bb7():
4849-
v32:CPtr = GetEP 1
4850-
v33:BasicObject = LoadField v32, :block@0x1000
4851-
Jump bb9(v33)
4852-
bb9(v27:BasicObject):
4842+
v31:BasicObject = LoadField v27, :block@0x1000
4843+
Jump bb9(v31)
4844+
bb9(v26:BasicObject):
48534845
SideExit NoProfileSend recompile
48544846
");
48554847
}
@@ -4876,12 +4868,11 @@ mod hir_opt_tests {
48764868
v15:CPtr = GetEP 0
48774869
v16:CBool = IsBlockParamModified v15
48784870
IfTrue v16, bb4()
4879-
v22:BasicObject = GetBlockParam :block, l0, EP@3
4880-
Jump bb6(v22)
4871+
v21:BasicObject = GetBlockParam :block, l0, EP@3
4872+
Jump bb6(v21)
48814873
bb4():
4882-
v19:CPtr = GetEP 0
4883-
v20:BasicObject = LoadField v19, :block@0x1001
4884-
Jump bb6(v20)
4874+
v19:BasicObject = LoadField v15, :block@0x1001
4875+
Jump bb6(v19)
48854876
bb6(v14:BasicObject):
48864877
CheckInterrupts
48874878
Return v14
@@ -4911,12 +4902,11 @@ mod hir_opt_tests {
49114902
v11:CPtr = GetEP 1
49124903
v12:CBool = IsBlockParamModified v11
49134904
IfTrue v12, bb4()
4914-
v18:BasicObject = GetBlockParam :block, l1, EP@3
4915-
Jump bb6(v18)
4905+
v17:BasicObject = GetBlockParam :block, l1, EP@3
4906+
Jump bb6(v17)
49164907
bb4():
4917-
v15:CPtr = GetEP 1
4918-
v16:BasicObject = LoadField v15, :block@0x1000
4919-
Jump bb6(v16)
4908+
v15:BasicObject = LoadField v11, :block@0x1000
4909+
Jump bb6(v15)
49204910
bb6(v10:BasicObject):
49214911
CheckInterrupts
49224912
Return v10
@@ -8021,19 +8011,17 @@ mod hir_opt_tests {
80218011
v18:CPtr = GetEP 0
80228012
v19:CBool = IsBlockParamModified v18
80238013
IfTrue v19, bb4()
8024-
v25:CPtr = GetEP 0
8025-
v26:CInt64 = LoadField v25, :_env_data_index_specval@0x1001
8026-
v27:CInt64 = GuardAnyBitSet v26, CUInt64(1)
8027-
v28:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
8028-
Jump bb6(v28, v10)
8014+
v24:CInt64 = LoadField v18, :_env_data_index_specval@0x1001
8015+
v25:CInt64 = GuardAnyBitSet v24, CUInt64(1)
8016+
v26:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
8017+
Jump bb6(v26, v10)
80298018
bb4():
8030-
v22:CPtr = GetEP 0
8031-
v23:BasicObject = LoadField v22, :block@0x1010
8032-
Jump bb6(v23, v23)
8019+
v22:BasicObject = LoadField v18, :block@0x1010
8020+
Jump bb6(v22, v22)
80338021
bb6(v16:BasicObject, v17:BasicObject):
8034-
v31:BasicObject = Send v14, &block, :map, v16 # SendFallbackReason: Complex argument passing
8022+
v29:BasicObject = Send v14, &block, :map, v16 # SendFallbackReason: Complex argument passing
80358023
CheckInterrupts
8036-
Return v31
8024+
Return v29
80378025
");
80388026
}
80398027

@@ -8061,19 +8049,17 @@ mod hir_opt_tests {
80618049
v18:CPtr = GetEP 0
80628050
v19:CBool = IsBlockParamModified v18
80638051
IfTrue v19, bb4()
8064-
v25:CPtr = GetEP 0
8065-
v26:CInt64 = LoadField v25, :_env_data_index_specval@0x1001
8066-
v27:CInt64[0] = GuardBitEquals v26, CInt64(0)
8067-
v28:NilClass = Const Value(nil)
8068-
Jump bb6(v28, v10)
8052+
v24:CInt64 = LoadField v18, :_env_data_index_specval@0x1001
8053+
v25:CInt64[0] = GuardBitEquals v24, CInt64(0)
8054+
v26:NilClass = Const Value(nil)
8055+
Jump bb6(v26, v10)
80698056
bb4():
8070-
v22:CPtr = GetEP 0
8071-
v23:BasicObject = LoadField v22, :block@0x1002
8072-
Jump bb6(v23, v23)
8057+
v22:BasicObject = LoadField v18, :block@0x1002
8058+
Jump bb6(v22, v22)
80738059
bb6(v16:BasicObject, v17:BasicObject):
8074-
v31:BasicObject = Send v14, &block, :map, v16 # SendFallbackReason: Complex argument passing
8060+
v29:BasicObject = Send v14, &block, :map, v16 # SendFallbackReason: Complex argument passing
80758061
CheckInterrupts
8076-
Return v31
8062+
Return v29
80778063
");
80788064
}
80798065

@@ -8102,19 +8088,17 @@ mod hir_opt_tests {
81028088
v13:CPtr = GetEP 1
81038089
v14:CBool = IsBlockParamModified v13
81048090
IfTrue v14, bb4()
8105-
v20:CPtr = GetEP 1
8106-
v21:CInt64 = LoadField v20, :_env_data_index_specval@0x1000
8107-
v22:CInt64 = GuardAnyBitSet v21, CUInt64(1)
8108-
v23:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
8109-
Jump bb6(v23)
8091+
v19:CInt64 = LoadField v13, :_env_data_index_specval@0x1000
8092+
v20:CInt64 = GuardAnyBitSet v19, CUInt64(1)
8093+
v21:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
8094+
Jump bb6(v21)
81108095
bb4():
8111-
v17:CPtr = GetEP 1
8112-
v18:BasicObject = LoadField v17, :block@0x1010
8113-
Jump bb6(v18)
8096+
v17:BasicObject = LoadField v13, :block@0x1010
8097+
Jump bb6(v17)
81148098
bb6(v12:BasicObject):
8115-
v26:BasicObject = Send v10, &block, :map, v12 # SendFallbackReason: Complex argument passing
8099+
v24:BasicObject = Send v10, &block, :map, v12 # SendFallbackReason: Complex argument passing
81168100
CheckInterrupts
8117-
Return v26
8101+
Return v24
81188102
");
81198103
}
81208104

@@ -11591,19 +11575,17 @@ mod hir_opt_tests {
1159111575
v18:CPtr = GetEP 0
1159211576
v19:CBool = IsBlockParamModified v18
1159311577
IfTrue v19, bb4()
11594-
v25:CPtr = GetEP 0
11595-
v26:CInt64 = LoadField v25, :_env_data_index_specval@0x1001
11596-
v27:CInt64 = GuardAnyBitSet v26, CUInt64(1)
11597-
v28:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
11598-
Jump bb6(v28, v10)
11578+
v24:CInt64 = LoadField v18, :_env_data_index_specval@0x1001
11579+
v25:CInt64 = GuardAnyBitSet v24, CUInt64(1)
11580+
v26:ObjectSubclass[BlockParamProxy] = Const Value(VALUE(0x1008))
11581+
Jump bb6(v26, v10)
1159911582
bb4():
11600-
v22:CPtr = GetEP 0
11601-
v23:BasicObject = LoadField v22, :block@0x1010
11602-
Jump bb6(v23, v23)
11583+
v22:BasicObject = LoadField v18, :block@0x1010
11584+
Jump bb6(v22, v22)
1160311585
bb6(v16:BasicObject, v17:BasicObject):
11604-
v31:BasicObject = Send v14, &block, :map, v16 # SendFallbackReason: Complex argument passing
11586+
v29:BasicObject = Send v14, &block, :map, v16 # SendFallbackReason: Complex argument passing
1160511587
CheckInterrupts
11606-
Return v31
11588+
Return v29
1160711589
");
1160811590
}
1160911591

0 commit comments

Comments
 (0)