Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sporadic test failure in LinearAlgebra/matmul.jl #44635

Closed
timholy opened this issue Mar 16, 2022 · 11 comments · Fixed by #44724
Closed

Sporadic test failure in LinearAlgebra/matmul.jl #44635

timholy opened this issue Mar 16, 2022 · 11 comments · Fixed by #44724
Labels
bug Indicates an unexpected problem or unintended behavior rr trace included test This change adds or pertains to unit tests

Comments

@timholy
Copy link
Member

timholy commented Mar 16, 2022

We sporadically (<5%) get a test failure (example: https://buildkite.com/julialang/julia-master/builds/10097#eee6dda2-d1bf-4118-aa04-5056c642eb4f) for which the first stacktrace is

�[91m�[1mError During Test�[22m�[39m at �[39m�[1m/cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/LinearAlgebra/test/matmul.jl:232�[22m
  Got exception outside of a @test

  ArgumentError: colons must be converted by to_indices(...)

  Stacktrace:

    [1] to_index(#unused#::Colon)

      @ Base ./indices.jl:299

    [2] to_index(A::Matrix{ComplexF32}, i::Function)

      @ Base ./indices.jl:277

    [3] to_indices

      @ ./indices.jl:333 [inlined]

    [4] to_indices

      @ ./indices.jl:324 [inlined]

    [5] view(::Matrix{ComplexF32}, ::Function, ::UnitRange{Int64})

      @ Base ./subarray.jl:176

    [6] macro expansion

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/LinearAlgebra/test/matmul.jl:237 [inlined]

    [7] macro expansion

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/Test/src/Test.jl:1433 [inlined]

    [8] macro expansion

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/LinearAlgebra/test/matmul.jl:232 [inlined]

    [9] top-level scope

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/Test/src/Test.jl:1433 [inlined]

   [10] top-level scope

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/LinearAlgebra/test/matmul.jl:0

   [11] include

      @ ./Base.jl:429 [inlined]

   [12] macro expansion

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/test/testdefs.jl:24 [inlined]

   [13] macro expansion

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/Test/src/Test.jl:1357 [inlined]

   [14] macro expansion

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/test/testdefs.jl:23 [inlined]

   [15] macro expansion

      @ ./timing.jl:440 [inlined]

   [16] runtests(name::String, path::String, isolate::Bool; seed::UInt128)

      @ Main /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/test/testdefs.jl:21

   [17] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, UInt128, Tuple{Symbol}, NamedTuple{(:seed,), Tuple{UInt128}}})

      @ Base ./essentials.jl:731

   [18] (::Distributed.var"#106#108"{Distributed.CallMsg{:call_fetch}})()

      @ Distributed /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/Distributed/src/process_messages.jl:285

   [19] run_work_thunk(thunk::Distributed.var"#106#108"{Distributed.CallMsg{:call_fetch}}, print_error::Bool)

      @ Distributed /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/Distributed/src/process_messages.jl:70

   [20] macro expansion

      @ /cache/build/default-amdci4-0/julialang/julia-master/julia-0c9c484d19/share/julia/stdlib/v1.9/Distributed/src/process_messages.jl:285 [inlined]

   [21] (::Distributed.var"#105#107"{Distributed.CallMsg{:call_fetch}, Distributed.MsgHeader, Sockets.TCPSocket})()

      @ Distributed ./task.jl:476

I was going to guess is that it depends on what other tests might have run on the same node, but in this case it appears to be the first test run on that node. I am therefore at a bit of a loss.

@N5N3
Copy link
Member

N5N3 commented Mar 16, 2022

@ViralBShah ViralBShah added the test This change adds or pertains to unit tests label Mar 16, 2022
@DilumAluthge DilumAluthge added the bug Indicates an unexpected problem or unintended behavior label Mar 17, 2022
@Keno
Copy link
Member

Keno commented Mar 17, 2022

Looks like we have an rr trace there, so should be quite debuggable.

@Keno
Copy link
Member

Keno commented Mar 17, 2022

Just to clarify, what I'm seeing in the backtrace is:

[2] to_index(A::SubArray{Int64, 3, Array{Int64, 3}, Tuple{StepRange{Int64, Int64}, Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}}, false}, i::Function) @ Base ./indices.jl:277
[3] to_indices @ ./indices.jl:333 [inlined]
[4] to_indices @ ./indices.jl:324 [inlined]

Do we think that the 4->3 call is wrong because it should have dispatched to the one in mutlidimensional.jl instead?

@Keno
Copy link
Member

Keno commented Mar 17, 2022

Just on a regular master build, that's the optimized IR for that call, which all seems correct, so I guess we just need to look at the rr trace and see what's different about it.

%-1  = invoke to_indices(::SubArray{…},::Tuple{…})::…
324 1 ── %1  = Base.getfield(A, :indices)::Tuple{StepRange{Int64, Int64}, Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}}   │╻╷       axes
    │    %2  = Core.getfield(%1, 1)::StepRange{Int64, Int64}                                                                              ││       
    └─── %3  = invoke Base.length(%2::StepRange{Int64, Int64})::Int64                                                                     ││╻        _indices_sub
    2 ── %4  = Base.slt_int(%3, 0)::Bool                                                                                                  │││┃│╷╷╷╷   axes
    │    %5  = Core.ifelse::Core.Const(Core.ifelse)                                                                                       ││││╻        oneto
    │    %6  = (%5)(%4, 0, %3)::Int64                                                                                                     │││││┃│││     OneTo
    │    %7  = %new(Base.OneTo{Int64}, %6)::Base.OneTo{Int64}                                                                             ││││││┃        OneTo
    └───       goto #3                                                                                                                    │││││││  
    3 ──       goto #4                                                                                                                    ││││││   
    4 ──       goto #5                                                                                                                    │││││    
    5 ──       goto #6                                                                                                                    ││││     
    6 ──       goto #7                                                                                                                    │││      
    7 ──       goto #8                                                                                                                    ││       
    8 ── %14 = (isa)(I, Tuple{Colon, Vector{Int64}, SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}})::Bool             │        
    └───       goto #10 if not %14                                                                                                        │        
    9 ── %16 = π (I, Tuple{Colon, Vector{Int64}, SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}})                      │        
    │    %17 = %new(Base.Slice{Base.OneTo{Int64}}, %7)::Base.Slice{Base.OneTo{Int64}}                                                     ││╻╷╷      uncolon
    │    %18 = Core.getfield(%16, 2)::Vector{Int64}                                                                                       ││╻        tail
    │    %19 = Core.getfield(%16, 3)::SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}                                   │││      
    │    %20 = Core.tuple(%17, %18, %19)::Tuple{Base.Slice{Base.OneTo{Int64}}, Vector{Int64}, SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}}
    └───       goto #12                                                                                                                   │        
    10 ─       nothing::Nothing                                                                                                           │        
    11 ─ %23 = Base.getfield(I, 1, true)::Function                                                                                        ││╻        getindex
    │          invoke Base.to_index(A::SubArray{Int64, 3, Array{Int64, 3}, Tuple{StepRange{Int64, Int64}, Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}}, false}, %23::Function)::Union{}
    └───       unreachable                                                                                                                ││       
    12 ─       return %20      

@Keno
Copy link
Member

Keno commented Mar 17, 2022

Hmm, I would have expected the test failure to trigger the breakpoint here: https://github.com/JuliaLang/julia/blame/master/stdlib/Test/src/Test.jl#L655, but I don't see it in the trace.

@Keno
Copy link
Member

Keno commented Mar 17, 2022

Ah, that's because it was inside a @testset, but outside an @test. I'll add a similar call for that case. I'll see if I can find the failing test anyway, but it might be a bit annoying so we may just want to wait for the next failure after I make that change.

@Keno
Copy link
Member

Keno commented Mar 17, 2022

I'll add a similar call for that case.

#44652

I'm a bit short on time, so unless somebody else wants to go digging, I say let's get that merged and wait for another rr trace that includes that change, so it'll be easier to find.

@Keno
Copy link
Member

Keno commented Mar 24, 2022

We have this captured in https://buildkite.com/julialang/julia-master/builds/10284#c8607f85-b173-49f9-a0fe-c1d1586d6ccf julia-1 at

(rr) when
Current event: 2322578
(rr) when-ticks
Current tick: 244897166483

@Keno
Copy link
Member

Keno commented Mar 24, 2022

So the last generic call before the error compiles something. The arguments are:

(rr) p jl_(F)
Base.view
         $14 = void
(rr) p jl_(args[0])
Base.SubArray{Int64, 3, Array{Int64, 3}, Tuple{Array{Int64, 1}, Base.Slice{Base.OneTo{Int64}}, Base.UnitRange{Int64}}, false}(parent=Array{Int64, (13, 13, 13)}[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869,
 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197], indices=(Array{Int64, (6,)}[8, 4, 6, 12, 5, 7], Base.Slice{Base.OneTo{Int64}}(indices=Base.OneTo{Int64}(stop=13)), Base.UnitRange{Int64}(start=3, stop=7)), offset1=0, stride1=0)
(rr) p jl_(args[1])
Base.Any
        $15 = void
(rr) p jl_(args[2])
Base.UnitRange{Int64}(start=2, stop=5)
(rr) p jl_(args[3])
Base.SubArray{Int64, 2, Base.UnitRange{Int64}, Tuple{Array{Int64, 2}}, false}(parent=Base.UnitRange{Int64}(start=1, stop=5), indices=(Array{Int64, (1, 4)}[2, 3, 4, 1],), offset1=0, stride1=0)

I don't really know how args[1] ended up as Any. Seems like that should be Colon.

@Keno
Copy link
Member

Keno commented Mar 24, 2022

Hmm:

(rr) p jl_(jl_typeof(args[2]))
Tuple{Base.Colon, Base.UnitRange{Int64}, Base.SubArray{Int64, 2, Base.UnitRange{Int64}, Tuple{Array{Int64, 2}}, false}}

(rr) p jl_(args[2])
(Base.Any, Base.UnitRange{Int64}(start=2, stop=5), Base.SubArray{Int64, 2, Base.UnitRange{Int64}, Tuple{Array{Int64, 2}}, false}(parent=Base.UnitRange{Int64}(start=1, stop=5), indices=(Array{Int64, (1, 4)}[2, 3, 4, 1],), offset1=0, stride1=0))

@Keno
Copy link
Member

Keno commented Mar 24, 2022

Ah, nevermind. That's just a printing bug in jl_:

julia> ccall(:jl_, Cvoid, (Any,), Colon())
Base.Any

Keno added a commit that referenced this issue Mar 24, 2022
In #44635, we observe that occasionally a call to
`view(::SubArray, ::Colon, ...)` dispatches to the
wrong function. The post-inlining IR is in relevant part:

```
│   │ %8   = (isa)(I, Tuple{Colon, UnitRange{Int64}, SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}})::Bool
└───│        goto #3 if not %8
2 ──│ %10  = π (I, Tuple{Colon, UnitRange{Int64}, SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}})
│   │ @ indices.jl:324 within `to_indices` @ multidimensional.jl:859
│   │┌ @ multidimensional.jl:864 within `uncolon`
│   ││┌ @ indices.jl:351 within `Slice` @ indices.jl:351
│   │││ %11  = %new(Base.Slice{Base.OneTo{Int64}}, %7)::Base.Slice{Base.OneTo{Int64}}
│   │└└
│   │┌ @ essentials.jl:251 within `tail`
│   ││ %12  = Core.getfield(%10, 2)::UnitRange{Int64}
│   ││ %13  = Core.getfield(%10, 3)::SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}
│   │└
│   │ @ indices.jl:324 within `to_indices`
└───│        goto #5
    │ @ indices.jl:324 within `to_indices` @ indices.jl:333
    │┌ @ tuple.jl:29 within `getindex`
3 ──││ %15  = Base.getfield(I, 1, true)::Function
│   │└
│   │        invoke Base.to_index(A::SubArray{Int64, 3, Array{Int64, 3}, Tuple{Vector{Int64}, Base.Slice{Base.OneTo{Int64}}, UnitRange{Int64}}, false}, %15::Function)::Union{}
```

Here we expect the `isa` at `%8` to always be [1]. However,
we seemingly observe the result that the branch is not taken
and we instead end up in the fallback `to_index`, which (correctly)
complains that the colon should have been dereferenced to
an index.

After some investigation of the relevant rr trace, what turns out
to happen here is that the va tuple we compute in codegen gets
garbage collected before the call to `emit_isa`, causing a use-after-free
read, which happens to make `emit_isa` think that the isa condition
is impossible, causing it to fold the branch away.

The fix is to simply add the relevant GC root. It's a bit unfortunate that this
wasn't caught by the GC verifier. It would have in principle been capable of doing
so, but it is currently disabled for C++ sources. It would be worth revisiting
this in the future to see if it can't be made to work.

Fixes #44635.

[1] The specialization heuristics decided to widen `Colon` to `Function`,
which doesn't make much sense here, but regardless, it shouldn't
crash.
Keno added a commit that referenced this issue Mar 24, 2022
In #44635, we observe that occasionally a call to
`view(::SubArray, ::Colon, ...)` dispatches to the
wrong function. The post-inlining IR is in relevant part:

```
│   │ %8   = (isa)(I, Tuple{Colon, UnitRange{Int64}, SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}})::Bool
└───│        goto #3 if not %8
2 ──│ %10  = π (I, Tuple{Colon, UnitRange{Int64}, SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}})
│   │ @ indices.jl:324 within `to_indices` @ multidimensional.jl:859
│   │┌ @ multidimensional.jl:864 within `uncolon`
│   ││┌ @ indices.jl:351 within `Slice` @ indices.jl:351
│   │││ %11  = %new(Base.Slice{Base.OneTo{Int64}}, %7)::Base.Slice{Base.OneTo{Int64}}
│   │└└
│   │┌ @ essentials.jl:251 within `tail`
│   ││ %12  = Core.getfield(%10, 2)::UnitRange{Int64}
│   ││ %13  = Core.getfield(%10, 3)::SubArray{Int64, 2, UnitRange{Int64}, Tuple{Matrix{Int64}}, false}
│   │└
│   │ @ indices.jl:324 within `to_indices`
└───│        goto #5
    │ @ indices.jl:324 within `to_indices` @ indices.jl:333
    │┌ @ tuple.jl:29 within `getindex`
3 ──││ %15  = Base.getfield(I, 1, true)::Function
│   │└
│   │        invoke Base.to_index(A::SubArray{Int64, 3, Array{Int64, 3}, Tuple{Vector{Int64}, Base.Slice{Base.OneTo{Int64}}, UnitRange{Int64}}, false}, %15::Function)::Union{}
```

Here we expect the `isa` at `%8` to always be [1]. However,
we seemingly observe the result that the branch is not taken
and we instead end up in the fallback `to_index`, which (correctly)
complains that the colon should have been dereferenced to
an index.

After some investigation of the relevant rr trace, what turns out
to happen here is that the va tuple we compute in codegen gets
garbage collected before the call to `emit_isa`, causing a use-after-free
read, which happens to make `emit_isa` think that the isa condition
is impossible, causing it to fold the branch away.

The fix is to simply add the relevant GC root. It's a bit unfortunate that this
wasn't caught by the GC verifier. It would have in principle been capable of doing
so, but it is currently disabled for C++ sources. It would be worth revisiting
this in the future to see if it can't be made to work.

Fixes #44635.

[1] The specialization heuristics decided to widen `Colon` to `Function`,
which doesn't make much sense here, but regardless, it shouldn't
crash.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Indicates an unexpected problem or unintended behavior rr trace included test This change adds or pertains to unit tests
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants