已开启
MySQL 5.7.32 进行 CFGO 优化时,Sysbench 压测 在 CFGO + plan cache 场景下报错 2014 #91
liangwenjiao创建于 8月12日
8月12日 添加了label:sig/Compiler
openeuler-ci-bot
8月12日 评论:
8月12日 评论:
Welcome To openEuler Community
Hey @always_flipped_1 , thanks for your contribution to the community.
Bot Usage Manual
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.
Contact Guide
If you have any questions, please contact the SIG: Compiler ,
and any of the maintainers: @SegFault, @alexanderbill, @cf-zhao, @chenzheng1030, @eastb233, @kuenking111_admin, @li-yancheng, @wangqiang95, @wd-gitcode ,
and any of the committers: @huang-xiaoquan, @huzife, @lin-4682, @xiongzhou4 .


8月12日 修改标题为 “MySQL 5.7.32 sysbench压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 prepared statement 在 CFGO + plan cache 场景下报错 2014”
8月12日 修改标题为 “MySQL 5.7.32 sysbench压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 prepared statement 在 CFGO + plan cache 场景下报错 2014”
8月12日 修改标题为 “MySQL 5.7.32 Sysbench压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 sysbench压测 在 CFGO + plan cache 场景下报错 2014”
8月12日 修改标题为 “MySQL 5.7.32 Sysbench压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 sysbench压测 在 CFGO + plan cache 场景下报错 2014”
8月12日 修改标题为 “MySQL 5.7.32 进行CFGO优化时,Sysbench压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 Sysbench压测 在 CFGO + plan cache 场景下报错 2014”
8月12日 修改标题为 “MySQL 5.7.32 进行CFGO优化时,Sysbench压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 Sysbench压测 在 CFGO + plan cache 场景下报错 2014”
8月12日 修改标题为 “MySQL 5.7.32 进行 CFGO 优化时,Sysbench 压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 进行CFGO优化时,Sysbench压测 在 CFGO + plan cache 场景下报错 2014”
8月12日 修改标题为 “MySQL 5.7.32 进行 CFGO 优化时,Sysbench 压测 在 CFGO + plan cache 场景下报错 2014”,原标题为“MySQL 5.7.32 进行CFGO优化时,Sysbench压测 在 CFGO + plan cache 场景下报错 2014”
rfwang07
8月19日 评论:
8月19日 评论:
- 已从CFGO中移除-fselective-scheduling https://gitcode.com/openeuler/gcc/pull/386
- 问题根因为-fselective-scheduling在sched1 pass中将一条指令搬到了"建立其 REG_EQUAL 前提的那个分支"之前,却没有作废该注记(REG_DEAD 同样没有随之修正),最终导致指令被优化,调用丢失。该问题是上游版本缺陷,待提交上游修复


问题概述
使用 openEuler GCC 12.3.1 2025.06 的 CFGO 编译 MySQL 5.7.32 时,prepared statement 工作负载出现:
问题表现为 prepared statement 结果集处理异常。初步现象与 plan cache 相关,但CFGO前使能plan cache优化功能运行正常,进一步验证发现:
sql/sql_executor.cc使用-fcfgo-profile-generate即可复现;--skip-plan-cache仍然复现;-O0/-O1均正常,CFGO-O2/-O3失败。环境
操作系统和架构
编译器
CFGO 相关源码提交:
其中 2025.06 对应的
gcc/opts.cc::enable_cfgo_optimizations()包含:MySQL
复现条件
仅编译
sql/sql_executor.cc时追加:在原始故障级别下:
或:
均可复现。
其他编译选项与正常 MySQL 构建保持一致。
结果对比
使用已修正 MySQL 源码 UB 的
sql/sql_executor.cc进行测试:-O3-O3-fprofile-generate -O3-O0-O1-O2-O3-O2 -fno-selective-scheduling-O3 -fno-selective-scheduling-fno-selective-scheduling是目前验证出的最精确全局规避项。关键二分结果
O2 新增优化
关闭所有 O2 相对 O1 新增优化:
但单独关闭以下优化均不能修复:
Scheduler
Scheduler heuristic 单独关闭均不能修复:
以上选项单独禁用均仍为:
CFGO 特有默认选项
CFGO option bundle 中以下选项的单项验证结果:
因此当前最明确的触发项是:
函数级定位
对 sched1 进行函数级禁用:
do_selectend_sendsub_selectJOIN::exec()函数级规避:
这表明问题集中在
JOIN::exec()的 sched1/selective scheduling 处理路径。GCC 源码调用链
CFGO 选项处理:
无条件启用:
调度入口:
代码路径:
Selective scheduler 实现:
生成代码证据
在失败对象
JOIN::exec()的 CFGO 间接调用探针路径中,发现虚调用实际目标与已知候选目标的比较发生了错误的寄存器等价传播。RTL 变化:
失败汇编中出现:
另一条路径中也观察到:
这会使目标比较失去原本的判别意义。
禁用
cprop_hardreg后,字面上的自比较可能消失,但候选寄存器仍由实际目标复制得到,例如:以下规避仍然失败:
因此
cprop_hardreg更像是将前序错误状态显式折叠出来的后续 pass,而不是唯一根因。当前更准确的判断是:目前尚未进一步缩小到
gcc/sel-sched.cc内的单个算法语句。Plan cache 验证结果
以下场景均可以复现:
因此当前结论是:
sql_executor.cc在 CFGO O2/O3 下生成了错误机器代码。最终规避验证
编译参数:
完整四阶段、单线程、每阶段 5 秒测试结果:
oltp_read_onlyoltp_read_onlyoltp_read_writeoltp_write_only期望结果
使用:
编译 MySQL 5.7.32 的
sql/sql_executor.cc后,prepared statement、结果集读取和mysql_stmt_store_result()应与普通 GCC 或标准 PGO 构建一致,不应出现:当前临时解决方案
在 CFGO 编译参数末尾添加:
或者仅对受影响函数禁用:
建议的编译器修复
对于 openEuler GCC 12.3.1 2025.06,建议从:
删除:
这样可以避免 CFGO 隐式开启存在兼容性风险的 selective scheduler,同时保留用户显式指定:
的能力。
另外,建议后续基于失败的
JOIN::exec()代码序列构造一个独立 AArch64 GCC testcase,继续检查:gcc/sel-sched.cc对 CFGO 间接调用探针的指令移动;REG_EQUAL/REG_EQUIVnote 的维护;