首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何判断在GHC中是否发生了公共子表达式消除?

在GHC(Glasgow Haskell Compiler)中,可以通过查看编译器的优化输出来判断是否发生了公共子表达式消除。公共子表达式消除是一种编译器优化技术,用于消除重复的表达式计算,从而提高程序的执行效率。

要判断在GHC中是否发生了公共子表达式消除,可以按照以下步骤进行:

  1. 使用GHC编译器编译目标代码。可以使用命令行工具或者集成开发环境(IDE)来执行编译操作。
  2. 在编译选项中启用优化选项。可以使用"-O"选项来开启基本的优化,或者使用"-O2"选项来开启更高级的优化。
  3. 查看编译器的优化输出。在编译完成后,GHC会生成一份优化后的代码。可以查看生成的优化后的代码,寻找是否存在重复的表达式计算。
  4. 搜索重复的表达式计算。在优化后的代码中,可以搜索相似的表达式,看是否有重复的计算过程。如果存在相同的表达式计算,那么很可能发生了公共子表达式消除。

需要注意的是,公共子表达式消除是一种编译器优化技术,具体是否发生取决于编译器的实现和优化级别。不同的编译器可能采用不同的优化策略,因此结果可能会有所不同。

关于GHC的更多信息和优化选项,可以参考腾讯云的产品介绍页面:GHC产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入理解jvm - 编译优化(下)

前言 本文接上文的内容继续讲述:深入理解jvm - 编译优化(上) 概述 补充后端优化的另一项内容提前编译器的处理 介绍jvm的几项重点优化措施 「方法内联(重要)」 「逃逸分析(先进)」 「公共子表达式消除...优点 解决即时编译器程序占用运算资源。...这里挑选了书中的几项内容进行介绍: 「方法内联(重要)」 「逃逸分析(先进)」 「公共子表达式消除(经典)」 「数组边界检查消除(语言经典)」 方法内联 含义:即把被内联的方法搬到内联块的内部。...❞ Java的具体实现:引入类型继承关系分析和实现,确定在目前已加载的类,某个接口是否有多于一种的实现、某个类是否存在子类、某个子类是否覆盖了父类的某个虚方法等信息”。...公共子表达式 什么是公共子表达式?如果一个表达式E之前已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就称为公共子表达式

67810

《深入理解java虚拟机》学习笔记之编译优化技术

如果把b.value看做是一个表达式,那也可以把这项优化看成是公共子表达式消除 (Common Subexpression Elimination),优化后的代码如下所示。...接下来,我们将继续查看如下的几项最有代表性的优化技术是如何运作的,它们分别是: 语言无关的经典优化技术之一:公共子表达式消除。 语言相关的经典优化技术之一:数组范围检查消除。...公共子表达式消除 公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,它的含义是:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式...如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除,如果这种优化的范围涵盖了多个基本块,那就称为全局公共子表达式消除。...如果要完全准确地判断一个对象是否会逃逸,需要进行数据流敏感的一系列复杂分析,从而确定程序各个分支执行时对此对象的影响。

44020

浅谈JVM运行期的几种优化手段

上面提到的都是概念知识,虚拟机如何判断一段代码是否是“热点代码”呢?...三、运行期优化技术 HotSpot 虚拟机设计团队为了实现程序更快的执行效率,列出了很多的优化手段,比如方法内联、冗余访问消除、复写传播、无用代码消除公共子表达式消除、数组边界检查消除、逃逸分析等。...3.1、公共子表达式消除 公共子表达式消除是一个普遍应用于各种编译器的经典优化技术。 如果一个子表达式已经计算过了,且表达式变量的值不曾发生变化,那么这个子表达式就可以当做公共子表达式。...如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除;如果这种优化的范围涵盖了多个基本块,便称为全局公共子表达式消除。 举个简单的例子,假设存在以下代码。...// 将 c*b 和 b*c 用 E 表示,消除公共子表达式 int d = E * 12 + a + (a + E); 即时编译器还可能进行另一种叫做代数简化的优化,把表达式变为: // 代数简化

13710

JVM(1)---虚拟机在运行期的优化策略

说明:虚拟机执行方法的时候,会先判断该方法是否存在已经编译好的版本,如果存在,则执行编译好的本地机器码,否则,采用一边解释一边编译的方式。...编译器做了很多的编译优化策略,例如上面的无用代码消除就是其中的一种。 下面我们来讲讲大概都有哪些优化策略: 大概预览一波: 公共子表达式消除。 数组范围检查消除。 方法内联。 逃逸分析。...(1).公共子表达式消除 含义:如果一个表达式 E 已经计算过了,并且从先前的计算到现在 E 的所有变量的值都没有发生变化,那个 E 的这次出现就成为了公共子表达式。...更常见的情况是数组访问发生在循环体,并且使用循环变量来进行数组的访问,对于这样的情况,只要编译器通过数据流就可以判断循环变量的取值范围是否[0, arr.length)之内,如果是,那么整个循环中就可以节省很多次数组边界检测判断的操劳了...代价就是当arr为空时,必须转入到异常处理器恢复并抛出NullPointException异常,这个过程会从用户态转到内核态处理,结束后回到用户态,速度远比一次判断空检查慢。

46841

JVM性能优化系列-(6) 晚期编译优化

为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个过程的编译器称为即时编译器(Just In Time Compiler) java虚拟机规范没有规定即时编译器应该如何实现...,本节主要针对以下四种优化技术: 语言无关的经典优化技术之一:公共子表达式消除 语言相关的经典优化技术之一:数组范围检查消除 最重要的优化技术之一:方法内联 最前沿的优化技术之一:逃逸分析 公共子表达式消除...公共子表达式消除是一个普遍应用与各种编译器的经典优化技术,它的含义是: 如果一个表达式E已经计算过了,并且从先前的计算到现在E的所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式 对于这种表达式...,没有必要花时间再对它进行计算,只需要直接用前面计算过的表达式结果替代E就可以了 如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除(Local Common Subexpression Elimination...),如果这种优化的范围涵盖了多个基本块,那就称为全局公共子表达式消除(Global Common Subexpression Elimination)。

22410

深度学习编译器之公共子表达式消除和死代码消除实现

仍然是以OneFlow基于MLIR进行实现的CSE Pass为例子来讲解。解析代码实现的过程,我发现基于MLIR来做公共子表达式消除的时候还顺带做了死代码消除的功能。...另外,考虑公共子表达式消除的时候需要保证两个重复的操作处于同一个基本块以及两个重复操作之间没有其它具有副作用的操作才可以消除。...OneFlow的实现只是对OneFlow的UserOp的特殊属性即OpName和SymbolID进行了擦除,用一个魔法属性来代替,这是因为这两个属性不应该去影响公共子表达式消除。...总结 阅读代码实现的过程,我发现基于MLIR来做公共子表达式消除的时候还顺带做了死代码消除的功能。...另外,考虑公共子表达式消除的时候需要保证两个重复的操作处于同一个基本块以及两个重复操作之间没有其它具有副作用的操作才可以消除

51050

《Java面试题集中营》- JVM 知识

SOE排查:栈的深度一般为1000-2000深度,超过了深度或者超过了栈大小就会导致SOE,通过打印的日志定位错误代码位置,检测是否有无限递归,发生了死循环等情况,修改代码 如何判断对象可以回收或存活...第三阶段,LIR上分配寄存器,并在LIR上做窥孔优化,最后产生机器码 Server Compiler: 会执行无用代码消除、循环展开、循环表达式外提、消除公共子表达式、常量传播、基本块重排序、范围检测消除...、空值检查消除,另外还能根据解释器或Client Compiler提供的性能监控信息,进行一些不稳定的激进优化,比如守护内联、分支频率预测等 几种经典的优化技术: 公共子表达式消除 如果一个表达式...E已经计算过,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为公共子表达式 数组范围检查消除 编译期就判断数组是否合理的范围内,如果在,那就可以循环中把数组的上下界检查消除...另外还有隐式异常处理,虚拟机会注册一个Segment Fault信号的异常处理器,但如果代码经常为空,消耗时间比判空慢,但虚拟机会根据运行期收集到的信息选择使用判空还是隐式异常处理 方法内联 一可以给“公共子表达式消除

8010

深入理解Java虚拟机(程序编译与代码优化)

当解释器遇到一条回边指令时,会先查找将要执行的代码片段是否已经有编译好的版本,如果有,它将优先执行已编译的代码,否则就把回边计数器值加 1,然后判断方法调用计数器和回边计数器值之和是否超过计数器的阈值。...如果把 b.value 看做是一个表达式,那也可以把这项优化工作看成是公共子表达式消除。...接下来我们再讲讲如下几项最有代表性的优化技术是如何运作的,它们分别是: 公共子表达式消除; 数组边界检查消除; 方法内联; 逃逸分析。...公共子表达式消除 如果一个表达式 E 已经计算过了,并且从先前的计算到现在 E 中所有变量的值都没有发生变化,那么 E 的这次出现就成了公共子表达式。...如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除,如果这种优化的范围覆盖了多个基本块,那就称为全局公共子表达式消除

62210

JVM之晚期(运行期)优化

如果不存在已被编译过的版本,则将此方法的调用计数器值加1,然后判断方法调用计数器与回边计数器值之和是否超过方法计数器的阈值。...version,如果有,他将会优先执行已编译的代码,否则就把回边计数器的值加1,然后判断方法调用计数器与回边计数器之和是否超过回边计数器的阈值。...编译优化技术 虚拟机的具有代表性的优化技术: **语言无关的经典优化技术之一:公共子表达式消除。 语言相关的经典优化技术之一:数组范围检查消除。...最重要的优化技术之一:方法内联 最前沿的优化技术之一:逃逸分析** 公共子表达式消除 如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那E的这次出现就成公共子表达式...,可以用原先的表达式进行消除

43620

JVM笔记-后端编译与优化

性能分析制导优化 解释器或客户端编译器在运行的过程,会不断收集性能监控信息(方法版本选择、条件判断等),这些信息可以帮助 JIT 编译器对代码进行集中优化。 这一点静态分析时是很难做到的。...它的行为理解起来其实很简单:就是方法调用,把目标方法的代码“复制”到调用的方法之中,避免发生真实的方法调用。...4.3 公共子表达式消除 4.3.1 公共子表达式 所谓公共子表达式,就是当有一个表达式 E 以前被计算过,而且下次再遇到的时候 E 的所有变量都未改变,则这次 E 的出现就被称为「公共子表达式」。...根据作用域,公共子表达式消除可分为两种:局部公共子表达式消除和全局公共子表达式消除。...代码在编译的时候,就根据控制流分析(可参考前文的前端编译)是否会产生数组越界,那么在运行期间不是就不用判断了吗? 5. 小结 本文主要分析了即时编译器和提前编译器,主要内容梳理如下: ?

60610

图优化技术

常见的图优化技术包括常量折叠、公共子表达式消除、代数化简、算子融合等技术,接下来将分别简单介绍其原理。...公共子表达式消除 (Common Sub-Expression Elimination)一个程序, 如果几个表达式的类型、参数和输入均相同, 则将他们称做公共子表达式。...对于公共子表达式, 只需要计算其中一个表达式的值, 其他表达式的值可以通过赋值得到。这个过程就称作公共子表达式消除, 它是一种传统编译器中常用的优化手段, 经过迁移也可以应用到深度学习编译器。...对于当前正在处理的 OP, 先查找该 MAP 表, 如果能找到其他和正在处理的 OP 类型相同的 OP, 则对他们进行遍历, 如果其中某个 OP 的输入和参数与当前正在处理的 OP 相同, 则它们为公共子表达式...因此算子融合的难点在与如何为融合后的 OP 实现计算逻辑?

94751

晚期(运行期)优化

2、当程序运行环境内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。...编译优化技术 编译优化技术的代码优化变换是建立代码的某种中间表示或机器码之上,绝不是建立java源码之上的。...最有代表性的优化技术如下: 1、公共子表达式消除:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式。...2、数组边界检查消除:java语言是一门动态安全的语言,每次对数组的读写访问时都会执行数组是否越界检查。...其基本行为就是分析对象动态作用域:当一个对象方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法,称为逃逸。

44400

两分钟看懂有效的括号

大家好,我是程序员吴师兄,今天跟大家分享一道和 栈 有关的题目,超级简单也超级容易理解,这道题目曾经出现在 bilibili 的面试。...一、题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。...无效的情况: 1)长度为奇数,左括号多余 image.png 2)长度为奇数,右括号多余 image.png 3)长度为偶数,左括号与右括号不配对 image.png 4)长度为偶数,部分子表达式可以配对...,比如 { [ ( ) ]} ,如果部分子表达式无效,那么整体都是无效的 3、部分子表达式如果建立了配对关系,是有效的括号,那么 消除 后是不会影响整体的 4、奇数长度的字符串总是无效的。...消除 的过程是由内向外进行,先判断能否消除部分子表达式(内),再判断能否消除整体表达式(外),但在遍历的过程却是由外向内进行遍历,需要保存状态,栈 先进后出的特点符合要求。

45120

JVM系列七(JIT 即时编译器).

然而,程序员开发过程,压根不会感知到即时编译器的存在,也参与不了即时编译器的过程,所以我们对即时编译器的学习更多的是了解,明白怎么写代码才能更好的被即时编译器优化。...公共子表达式消除 如果一个表达式 E 已经计算过了,并且从先前的计算到现在 E 中所有变量的值都没有发生变化,那么 E 的这次出现就成为了公共子表达式。...提取公共子表达式 int E = c * b; d = E * 12 + a + (a + E); // 2....虚拟机一般是在即时编译期间通过数据流分析来确定是否可以消除这种检查,比如 foo[3] 的访问,只有在编译的时候确定 3 不会超过 foo.length - 1 的值,就可以判断该次数组访问没有越界,就可以把数组边界检查消除...逃逸分析 逃逸分析的基本行为就是分析对象动态作用域:当一个对象方法被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法,称为方法逃逸;甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程访问的实例变量

97210

JAVA相关编译知识

通过判断他们两个是否达到一定数值来判断是不是热点代码。缺点是需要为每个方法建立维护计数器不能够得到虚拟机栈的调用信息;优点是统计的结果更加准确。...而第一种基于方法的则是每次调用方法时才进行的判断(这个时候方法栈帧还未建立)而不是像循环体一样每次碰到循环时(栈帧已经建立)都进行判断这时候循环体是已经运行的,所以第一种方法不是栈上替换。...判断是不是同一个调用着我也就是类型判断比起虚方法表查找效率也会更高一些)。 二,逃逸分析:名字听着高大上,其实就是看创建的对象会不会逃逸。...三,公共子表达式消除:如果一个表达式E之前已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就称为公共子表达式。...四,数组边界检查消除:java每次都进行读取或操作数组的元素时都要进行对访问的下标进行判断是否大于等于0并且没有超出数组的最大长度的限制。

59220

编译原理笔记(七)之代码优化「建议收藏」

第4章已经简单介绍了表达式的DAG表示,目的是消除公共子树。...现在我们将DAG的概念扩展到一个基本块的表达式集合,用下述方法构造基本块的DAG: 出现在基本块的每个变量的初始值DAG中有一个节点。 块的每条语句s关联一个节点N。...输出节点的特点是其中的变量退出基本块后仍然活跃,即变量的值流图的其他基本块可能会被引用。...找出局部公共子表达式 当需要在DAG中加入一个新节点M时,考察是否已存在其孩子个数、次序以及运算符均与M相同的节点N,若有,则N和M计算的是相同的值并且可以用N取代M....死代码消除 DAG上对应死代码消除的操作可以这样实现:从 DAG删除没有附加任何活跃变量的根(即没有前驱的节点)。重复此操作可以消除掉DAG中所有相应的死代码。

71220

常用的正则表达式

匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”的“do”。?等价于{0,1}。 _n_是一个非负整数。匹配确定的_n_次。...这种情况下,尽可能地(如果不是完全地)消除误匹配以及漏匹配,并提升运行效率,就是我们的目标。本文所提出的经验,主要是针对这种情况。 掌握语法细节。正则表达式各种语言中,其语法大致相同,细节各有千秋。...这样做的目的是先消除漏匹配(刚开始先尽可能多地匹配,做加法),然后再一点一点地消除误匹配(做减法)。这样有先有后,考虑时才不易出错,从而向“不误不漏”这个目标迈进。 留有余地。...对于这样的情况,写正则表达式时要跳出所能见到的文本的圈子,开拓思路,作出“战略性前瞻”。例如,经常收到这样的垃圾短信:“*票”、“#漂”。...例如,虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配,但是如果只要有一条子表达式(例如A)会产生误匹配,那么不论其它的子表达式(例如B)效率如何之高,范围如何精准,C的总体精准度也会因

88210

正则表达式总结

九、负向零宽断言 确保某个字符是否出现,但是不想去匹配它。 …… 十、注释 (?#command):凡是注释#内的,包括回车、换行写的都不看。...b,则匹配为aab和ab;(这里认为“以b结尾”是以第一个碰到的b结尾,中间就截断了) 注意:优先级→ 贪婪匹配>懒惰匹配 十二、如何写出高效率的正则表达式 如果纯粹是为了挑战自己的正则水平,用来实现一些特效...这样做的目的是先消除漏匹配(刚开始先尽可能多地匹配,做加法),然后再一点一点地消除误匹配(做减法)。这样有先有后,考虑时才不易出错,从而向“不误不漏”这个目标迈进。 5. 留有余地。...对于这样的情况,写正则表达式时要跳出所能见到的文本的圈子,开拓思路,作出“战略性前瞻”。例如,经常收到这样的垃圾短信:“*票”、“#漂”。...例如,虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配,但是如果只要有一条子表达式(例如A)会产生误匹配,那么不论其它的子表达式(例如B)效率如何之高,范围如何精准,C的总体精准度也会因

82250

《数据库系统实现》学习笔记

并操作的迭代器实现,open方法先调用第一个关系的迭代器,next方法判断第一个关系是否结束,如果结束就打开第二个关系的迭代器。...有一个例外,带有索引上属性和常量比较的选择扫描,效率会显著提高, open方法中非阻塞 4.2.2 整个关系的一元操作的一趟算法 消除重复 一次读取一个块,但对于每个元组要进行判断: 是第一个出现的元组...然后一个一个地读取R的元组t,判断t是否可以与S的元组连接,如果可以就连接输出。 open方法中非阻塞 4.3 嵌套循环连接 讨论更复杂的方法之前,先来看看嵌套循环连接操作算法。...4.4.3 利用排序进行分组和聚集 阶段1,取分组属性作为排序关键字。阶段2的归并流程2,先判断是否有分组属性值相同的元组,有就做聚集操作,没有就直接输出。...投影定律原理: 可以达式树的任意位置引入投影,只要他所消除的属性是其上的运算符从来不会用到的,也不在整个表达式的结果之中。

2.5K20
领券