[PATCH] D139437: [SimplifyCFG] Prohibit hoisting from deoptimize blocks

Dmitry Makogon via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 6 08:34:45 PST 2022


dmakogon created this revision.
dmakogon added a reviewer: mkazantsev.
Herald added a subscriber: hiraditya.
Herald added a project: All.
dmakogon requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This prohibits hoisiting common instructions from 'then' and 'else' branches of a conditional branch into the block with the branch if one of the branches is a deoptimizing branch (has a postdominating llvm.deoptimize call)
This may save some compile time by not doing meaningless job of hoisiting from non-deoptimizing blocks.
Also this fixes an issue when we would hoist two identical llvm.deoptimize calls from 'then' and 'else' branches. This is illegal as such calls must be immediately followed by a return.


https://reviews.llvm.org/D139437

Files:
  llvm/lib/Transforms/Utils/SimplifyCFG.cpp
  llvm/test/Transforms/SimplifyCFG/dont-hoist-deoptimize.ll


Index: llvm/test/Transforms/SimplifyCFG/dont-hoist-deoptimize.ll
===================================================================
--- llvm/test/Transforms/SimplifyCFG/dont-hoist-deoptimize.ll
+++ llvm/test/Transforms/SimplifyCFG/dont-hoist-deoptimize.ll
@@ -1,13 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt -S --passes='simplifycfg<hoist-common-insts>' -simplifycfg-hoist-common-skip-limit=0 %s | FileCheck %s
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
 target triple = "x86_64-unknown-linux-gnu"
 
 declare void @llvm.experimental.deoptimize.isVoid(...) #0
 
-; REQUIRES: asserts
-; XFAIL: *
-
 define void @widget(i1 %arg) {
+; CHECK-LABEL: @widget(
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[BB1:%.*]], label [[BB4:%.*]]
+; CHECK:       bb1:
+; CHECK-NEXT:    [[TMP:%.*]] = trunc i64 5 to i32
+; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 0 to i32
+; CHECK-NEXT:    [[TMP3:%.*]] = trunc i64 0 to i32
+; CHECK-NEXT:    call void (...) @llvm.experimental.deoptimize.isVoid(i32 13) #[[ATTR0:[0-9]+]] [ "deopt"(i32 0, i32 1, i32 0, i32 502, i32 4, i32 35, i32 0, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP3]], i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP]], i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 14, i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 0, ptr addrspace(1) null, i32 3, float 0.000000e+00, i32 4, double 0.000000e+00, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null) ]
+; CHECK-NEXT:    ret void
+; CHECK:       bb4:
+; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 5 to i32
+; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 1 to i32
+; CHECK-NEXT:    [[TMP7:%.*]] = trunc i64 0 to i32
+; CHECK-NEXT:    call void (...) @llvm.experimental.deoptimize.isVoid(i32 13) #[[ATTR0]] [ "deopt"(i32 0, i32 1, i32 0, i32 502, i32 4, i32 35, i32 0, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 3, i32 -99, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP7]], i32 3, i32 0, i32 3, i32 0, i32 3, i32 [[TMP5]], i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 14, i32 3, i32 0, i32 3, i32 -99, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 3, i32 0, i32 0, ptr addrspace(1) null, i32 3, float 0.000000e+00, i32 4, double 0.000000e+00, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 0, ptr addrspace(1) null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null) ]
+; CHECK-NEXT:    ret void
+;
 bb:
   br i1 %arg, label %bb1, label %bb4
 
Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -1508,6 +1508,11 @@
   if (BB1->hasAddressTaken() || BB2->hasAddressTaken())
     return false;
 
+  // Don't try to hoist anything from deoptimization blocks.
+  if (BB1->getPostdominatingDeoptimizeCall() ||
+      BB2->getPostdominatingDeoptimizeCall())
+    return false;
+
   BasicBlock::iterator BB1_Itr = BB1->begin();
   BasicBlock::iterator BB2_Itr = BB2->begin();
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139437.480503.patch
Type: text/x-patch
Size: 3823 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221206/bfe0146a/attachment.bin>


More information about the llvm-commits mailing list