go cmd/compile/internal/ssa:折叠扩大操作时类型宽度不正确

5q4ezhmt  于 6个月前  发布在  Go
关注(0)|答案(2)|浏览(50)

Go版本

提示

在你的项目/工作区中 go env 的输出:

GOARCH=ppc64le

你做了什么?

进一步探索下层规则改进时发现了使用值类型的大小来确定是否应用规则的问题。
例如,在 PPC64.rules 中的规则:

(MOVWZreg y:(AND (MOVDconst [c]) _)) && uint64(c) <= 0xFFFFFFFF => y

然后在 PPC64latelower.rules 中:
(AND <t> x:(MOVDconst [m]) n) && t.Size() == 4 && isPPC64WordRotateMask(m) => (RLWINM [encodePPC64RotateMask(0,m,32)] n)
如果 m0xF000000F 或类似 Package 掩码的值,那么该值的上 32 位并不总是为 0。我认为这只影响使用 RLWINM 和 RLWNM 的规则。我相信它们是 PPC64 上唯一具有这种行为的 GPR 操作码。

你看到了什么发生?

在结果预期比分配的类型更宽的情况下触发了 latelower 规则。

你期望看到什么?

在 lower 中的类型的应该是反映出拓宽后的类型。

xzv2uavs

xzv2uavs1#

相似问题

(如果这个有帮助或者没有帮助,请给表情投票;欢迎在 this discussion 中提供更详细的反馈。)

brtdzjyr

brtdzjyr2#

我怀疑这今天不会造成问题。32位常量进行符号扩展,因此任何 Package 掩码都会生成一个负的int32常量,这阻止了上面的AND规则对这样的常量运行。

相关问题