[PATCH] D99909: [GVN] Add missing ICF update

Arthur Eubanks via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 5 17:17:06 PDT 2021


aeubanks created this revision.
Herald added a subscriber: hiraditya.
aeubanks requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

performScalarPREInsertion() inserts instructions into blocks that we
need to tell ImplicitControlFlowTracking about, otherwise the ICF cache
may be invalid.

Fixes PR49193.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D99909

Files:
  llvm/lib/Transforms/Scalar/GVN.cpp
  llvm/test/Transforms/GVN/pr49193.ll


Index: llvm/test/Transforms/GVN/pr49193.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/GVN/pr49193.ll
@@ -0,0 +1,58 @@
+; RUN: opt -passes=gvn -S < %s | FileCheck %s
+
+ at a = external local_unnamed_addr global i32, align 4
+ at b = external local_unnamed_addr global i32, align 4
+
+; Function Attrs: nounwind readnone
+declare i32* @j() local_unnamed_addr #0
+
+; CHECK: define {{.*}}@k()
+
+define i64 @k() local_unnamed_addr {
+bb:
+  br i1 undef, label %bb10.preheader, label %bb3
+
+bb10.preheader:                                   ; preds = %bb
+  br label %bb13
+
+bb3:                                              ; preds = %bb
+  %i4 = load i32, i32* @a, align 4
+  %i5.not = icmp eq i32 %i4, 0
+  br label %bb7
+
+bb7:                                              ; preds = %bb3
+  %i8 = tail call i32* @j()
+  br label %bb37
+
+bb13:                                             ; preds = %bb34, %bb10.preheader
+  br i1 undef, label %bb30thread-pre-split, label %bb16
+
+bb16:                                             ; preds = %bb13
+  %i17 = tail call i32* @j()
+  br i1 undef, label %bb22thread-pre-split, label %bb37.loopexit
+
+bb22thread-pre-split:                             ; preds = %bb16
+  br label %bb27
+
+bb27:                                             ; preds = %bb22thread-pre-split
+  br i1 undef, label %bb30thread-pre-split, label %bb37.loopexit
+
+bb30thread-pre-split:                             ; preds = %bb27, %bb13
+  %i31.pr = load i32, i32* @a, align 4
+  %i32.not2 = icmp eq i32 %i31.pr, 0
+  br label %bb34
+
+bb34:                                             ; preds = %bb30thread-pre-split
+  br i1 undef, label %bb37.loopexit, label %bb13
+
+bb37.loopexit:                                    ; preds = %bb34, %bb27, %bb16
+  br label %bb37
+
+bb37:                                             ; preds = %bb37.loopexit, %bb7
+  %i38 = load i32, i32* @a, align 4
+  store i32 %i38, i32* @b, align 4
+  %i39 = tail call i32* @j()
+  unreachable
+}
+
+attributes #0 = { nounwind readnone }
Index: llvm/lib/Transforms/Scalar/GVN.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/GVN.cpp
+++ llvm/lib/Transforms/Scalar/GVN.cpp
@@ -2469,6 +2469,8 @@
   Instr->setName(Instr->getName() + ".pre");
   Instr->setDebugLoc(Instr->getDebugLoc());
 
+  ICF->insertInstructionTo(Instr, Pred);
+
   unsigned Num = VN.lookupOrAdd(Instr);
   VN.add(Instr, Num);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99909.335357.patch
Type: text/x-patch
Size: 2509 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210406/cea0a379/attachment.bin>


More information about the llvm-commits mailing list