@@ -9743,6 +9743,109 @@ mod hir_opt_tests {
97439743 ");
97449744 }
97459745
9746+ #[test]
9747+ fn test_send_with_non_nil_block_arg() {
9748+ eval(r#"
9749+ def foo = 42
9750+
9751+ def test
9752+ block = :to_s
9753+ foo(&block)
9754+ end
9755+ test; test
9756+ "#);
9757+ assert_snapshot!(hir_string("test"), @"
9758+ fn test@<compiled>:5:
9759+ bb1():
9760+ EntryPoint interpreter
9761+ v1:BasicObject = LoadSelf
9762+ v2:NilClass = Const Value(nil)
9763+ Jump bb3(v1, v2)
9764+ bb2():
9765+ EntryPoint JIT(0)
9766+ v5:BasicObject = LoadArg :self@0
9767+ v6:NilClass = Const Value(nil)
9768+ Jump bb3(v5, v6)
9769+ bb3(v8:BasicObject, v9:NilClass):
9770+ v13:StaticSymbol[:to_s] = Const Value(VALUE(0x1000))
9771+ v19:BasicObject = Send v8, &block, :foo, v13 # SendFallbackReason: Complex argument passing
9772+ CheckInterrupts
9773+ Return v19
9774+ ");
9775+ }
9776+
9777+ #[test]
9778+ fn test_send_with_statically_nil_block_arg() {
9779+ eval(r#"
9780+ def foo = 42
9781+
9782+ def test
9783+ block = nil
9784+ foo(&block)
9785+ end
9786+ test; test
9787+ "#);
9788+ assert_snapshot!(hir_string("test"), @"
9789+ fn test@<compiled>:5:
9790+ bb1():
9791+ EntryPoint interpreter
9792+ v1:BasicObject = LoadSelf
9793+ v2:NilClass = Const Value(nil)
9794+ Jump bb3(v1, v2)
9795+ bb2():
9796+ EntryPoint JIT(0)
9797+ v5:BasicObject = LoadArg :self@0
9798+ v6:NilClass = Const Value(nil)
9799+ Jump bb3(v5, v6)
9800+ bb3(v8:BasicObject, v9:NilClass):
9801+ v13:NilClass = Const Value(nil)
9802+ v19:BasicObject = Send v8, &block, :foo, v13 # SendFallbackReason: Complex argument passing
9803+ CheckInterrupts
9804+ Return v19
9805+ ");
9806+ }
9807+
9808+ #[test]
9809+ fn test_send_with_monomorphically_nil_block_arg() {
9810+ eval(r#"
9811+ def foo = 42
9812+
9813+ def test(&block)
9814+ foo(&block)
9815+ end
9816+ test; test
9817+ "#);
9818+ assert_snapshot!(hir_string("test"), @"
9819+ fn test@<compiled>:5:
9820+ bb1():
9821+ EntryPoint interpreter
9822+ v1:BasicObject = LoadSelf
9823+ v2:CPtr = LoadSP
9824+ v3:BasicObject = LoadField v2, :block@0x1000
9825+ Jump bb3(v1, v3)
9826+ bb2():
9827+ EntryPoint JIT(0)
9828+ v6:BasicObject = LoadArg :self@0
9829+ v7:BasicObject = LoadArg :block@1
9830+ Jump bb3(v6, v7)
9831+ bb3(v9:BasicObject, v10:BasicObject):
9832+ v17:CPtr = GetEP 0
9833+ v18:CBool = IsBlockParamModified v17
9834+ IfTrue v18, bb4()
9835+ v23:CInt64 = LoadField v17, :_env_data_index_specval@0x1001
9836+ v24:CInt64[0] = GuardBitEquals v23, CInt64(0)
9837+ v25:NilClass = Const Value(nil)
9838+ Jump bb6(v25, v10)
9839+ bb4():
9840+ v21:BasicObject = LoadField v17, :block@0x1002
9841+ Jump bb6(v21, v21)
9842+ bb6(v15:BasicObject, v16:BasicObject):
9843+ v28:BasicObject = Send v9, &block, :foo, v15 # SendFallbackReason: Complex argument passing
9844+ CheckInterrupts
9845+ Return v28
9846+ ");
9847+ }
9848+
97469849 #[test]
97479850 fn test_inline_attr_reader_constant() {
97489851 eval("
0 commit comments