问题标签 [constantfolding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
128 浏览

python-2.7 - 编译 python 源代码而不进行常量折叠优化

我有一个python片段如下

将其编译为 AST 给出:

请注意,在生成的 AST6 * 8没有优化为 48。

但是,如果我编译这个生成的 AST 并反汇编,6 * 8则替换为48.

我的问题

如何在没有常量折叠优化的情况下将代码编译为字节码?我需要这样做来开发一个混淆器。

0 投票
2 回答
467 浏览

go - golang 编译器是否使用常量折叠?

只是想知道“go”编译器是否使用任何类型的优化,例如常量折叠。

https://en.wikipedia.org/wiki/Constant_folding

通过谷歌搜索,但找不到我正在寻找的答案。

0 投票
1 回答
403 浏览

c++ - C++ 常量折叠素数循环

看过前面的问题12后,我想知道是否可以强制编译器对以下打印素数的代码执行常量折叠。

我通过以下方式构建它:

结果有几个:

我想强制编译器查看类似于

或者

但是阅读程序集表明没有发生任何事情。

我什至用过__builtin_expect,但没有用。

有没有办法强制编译器优化器读取for循环并利用输出数据已知的优势?

我想在不使用模板元编程的情况下做到这一点。

PS。 我的真正目的只是测试编译器,而不是计算素数的有效方法。我只是想向我的朋友炫耀 C++ 编译器有多么强大。


如果分离is_prime是关注的问题,我将所有内容都放在 main 中并且没有观察到差异:


甚至还有一个示例仍然不能为编译器提供任何借口:

部件:

0 投票
1 回答
78 浏览

c++ - 编译器对屏蔽类没有常量折叠

对于嵌入式项目,我使用辅助类作为标志和掩码。由于未知原因,掩码类的代码未按预期正确折叠。

掩码的最小实现如下所示:

该类的使用如以下示例所示:

代码使用 GCC 4.8.3 编译,带有选项-Os. 我希望,编译器会将此代码解析为单个值,但它实际上会创建一个函数来根据这些值计算掩码。

我的代码中是否有特殊原因阻止了正确的 const 折叠?

0 投票
2 回答
214 浏览

c - Preprocessor constant folding

I have a fundamental question regarding the C preprocessor constant evaluation and I would like some help in understanding if the preprocessor helps in optimizing the code in a situation like this. I understand that the preprocessor merely "replaces text" in the code. By that rule, even constant expressions get replaced in the code. For instance, the below code:

The value of a comes to 7. This is because the preprocessed code looks something like this:

I can see that MY_NUM did not evaluate to 6 before the compilation kicks in. Of course the compiler then optimizes the code by evaluating the value of a at compile time.

I am not sure if preprocessor constant folding happens or not or if it is even possible. Or is there any way (flag in gcc) to enable it. The regular -O optimizations do not enable this. Is there anyway we could change the behavior of the preprocessor here?

I am using gcc 4.8.4 for my code.

0 投票
1 回答
456 浏览

c++ - 有没有办法在 C++17 中折叠初始化列表

有没有办法做初始化列表折叠而不是使用参数包?我的问题是我有一个重载的构造函数,我想根据我是否使用来调用不同的构造函数{}。这似乎与初始化列表一起工作得很好,当我使用它时,它设法隐藏我的另一个参数构造函数{},而不是当我只用 构造它时(),但如果我使用不隐藏我的另一个参数构造函数的参数包,它会失败.

另外,我看到人们在他们的折叠表达式中附加了 void,当我提到 cppreference 时我无法理解,它似乎对我的程序也没有任何影响。

编辑:根据要求,举例说明问题:

注意注释掉的部分,我希望能够做这样的事情,以便在编译时计算出已知大小参数列表的填写过程,而不是我使用 for 循环。应该为第一个 cout 打印一些垃圾值,为第二个 cout 打印 2(至少在 MSVC2017 中是这样,不知道这种隐藏机制是否符合标准)。请注意,如果将define 设置为true,则可以使用参数包ctor,但即使使用{}语法,它也无法隐藏一个参数ctor。

Edit2:为了最大的方便,进一步更新了代码,只需将定义更改为 true 以查看参数包无法使用{}语法隐藏 1 和 2 参数构造函数,而初始化列表 ctor 设法隐藏。

链接:使用初始化列表: http ://coliru.stacked-crooked.com/a/7b876e1dfbb18d73 输出:

使用参数包: http ://coliru.stacked-crooked.com/a/11042b2fc45b5259 输出:

0 投票
1 回答
514 浏览

python - 常量折叠的具体规则是什么?

我刚刚意识到 CPython 似乎对待表示相同值的常量表达式,在常量折叠方面有所不同。例如:

对于第二个示例,应用了常量折叠,而对于第一个示例,尽管两者都表示相同的值,但它不是。它似乎与指数的值或结果的大小无关,因为以下表达式也被折叠:

为什么前两个表达式的处理方式不同,更一般地说,CPython 对常量折叠遵循的具体规则是什么?


测试:

0 投票
2 回答
182 浏览

c# - 以恒定可折叠的方式反序列化 JSON Map C#

我需要将 <string,string> 映射的字符串表示形式传递到我的 U-SQL 程序中,并将其反序列化为 C# Dictionary<string,string>,以便我可以将其转换为 U-SQL SqlMap。我需要以一种恒定可折叠的方式来完成它。我最近的尝试:

因“E_CSC_USER_EXPRESSIONNOTCONSTANTFOLDABLE:表达式不能被常量折叠”而失败。

我已经找到了许多将字符串反序列化为映射的方法,但到目前为止还没有一种方法是恒定可折叠的。我找不到常量可折叠 c# 表达式的列表,这在这里也很有帮助。

0 投票
3 回答
216 浏览

java - Java 语言规范 Java SE 11 版 (JLS SE 11) 中对常量折叠的描述在哪里?

据我所知,Java 通过在编译时进行常量折叠来处理常量变量§4.12.4。我已经尽力了,但我无法从 JLS 中找到它的描述。谁能告诉我在哪里可以找到Java 11的常量折叠过程的官方描述?

0 投票
2 回答
319 浏览

c++ - 禁用 LLVM 10 C++ API 的常量折叠

我正在使用 LLVM C++ API 为 C 语言的子集编写编译器前端。我注意到生成的 IR 始终应用了恒定折叠优化。但我想禁用它并获得一个忠实的、未优化的 IR。有没有办法做到这一点?

以下是我使用模块生成 IR 的代码。

似乎我使用的 LLVM 版本是 LLVM 10。

例如,当我在以下 C 函数上运行编译器时

它被编译为

常量的二元运算由编译器自己评估,即常量折叠;它没有被翻译成适当的 IR 代码。