Skip to content

ARM64 function JIT causes impossible assertion #10635

Closed
@danog

Description

@danog

Description

Ref vimeo/psalm#9350

Enabling JIT on an ARM64 machine with opcache.jit=1205 triggers an impossible assertion (count($result_type_parts) === $combinations where $result_type_parts is an array with 1 element and $combinations is 1).

Using opcache.jit=1254 fixes the issue.
Running var_dump($result_type_parts, $combinations); before the assertion also fixes the issue.

To reproduce, enable opcache, enable assertions, create an empty composer project, install vimeo/psalm:5.7.1 and scan the following file (vendor/bin/psalm --no-cache a.php):

<?php

$v = __DIR__ . '';

Expected result: No AssertionError, like when running on x86_64

Actual result:

[daniil@pi4 t]$ vendor/bin/psalm --no-cache a.php
Warning: "findUnusedCode" will be defaulted to "true" in Psalm 6. You should explicitly enable or disable this setting.
Warning: "findUnusedCode" will be defaulted to "true" in Psalm 6. You should explicitly enable or disable this setting.
Target PHP version: 8.2 (inferred from current PHP version).
Scanning files...
Analyzing files...

Uncaught AssertionError: assert(count($result_type_parts) === $combinations) in /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php:181
Stack trace:
#0 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php(181): assert()
#1 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(138): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\ConcatAnalyzer::analyze()
#2 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(265): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#3 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#4 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php(242): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#5 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(536): Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer::analyze()
#6 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(178): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyzeAssignment()
#7 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#8 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(560): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#9 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(195): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#10 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(179): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#11 /home/daniil/repos/psalm/src/Psalm/Internal/Codebase/Analyzer.php(1581): Psalm\Internal\Analyzer\FileAnalyzer->analyze()
#12 /home/daniil/repos/psalm/src/Psalm/Internal/Codebase/Analyzer.php(522): Psalm\Internal\Codebase\Analyzer->analysisWorker()
#13 /home/daniil/repos/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis()
#14 /home/daniil/repos/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(1183): Psalm\Internal\Codebase\Analyzer->analyzeFiles()
#15 /home/daniil/repos/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->checkPaths()
#16 /home/daniil/repos/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run()
#17 {main}
(Psalm dev-master@589fee7b224f4ccb7c878aa3781c38c3a7dbea0a crashed due to an uncaught Throwable)

Note that psalm will always overwrite the opcache.jit config value to 1205, to modify it edit vendor/vimeo/psalm/src/Psalm/Internal/Fork/PsalmRestarter.php:97

PHP Version

PHP 8.2.2

Operating System

Manjaro arm64

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions