[PATCH] D108674: [GlobalOpt] Fix the assert for null check of global value

Shimin Cui via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 24 16:34:01 PDT 2021


scui created this revision.
scui added reviewers: asbirlea, efriedma.
Herald added subscribers: ormris, hiraditya.
scui requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This is to fix the reported assert - https://bugs.llvm.org/show_bug.cgi?id=51608.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D108674

Files:
  llvm/lib/Transforms/IPO/GlobalOpt.cpp
  llvm/test/Transforms/GlobalOpt/null-check-global-value.ll


Index: llvm/test/Transforms/GlobalOpt/null-check-global-value.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/GlobalOpt/null-check-global-value.ll
@@ -0,0 +1,32 @@
+; RUN: opt -globalopt -S < %s | FileCheck %s
+
+%sometype = type { i8* }
+
+ at map = internal unnamed_addr global %sometype* null, align 8
+
+define void @Init() {
+; CHECK-LABEL: @Init(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i1 true, i1* @map.init, align 1
+; CHECK-NEXT:    ret void
+;
+entry:
+  %call = tail call noalias nonnull dereferenceable(48) i8* @_Znwm(i64 48)
+  store i8* %call, i8** bitcast (%sometype** @map to i8**), align 8
+  ret void
+}
+
+define void @Usage() {
+; CHECK-LABEL: @Usage(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[MAP_INIT_VAL:%.*]] = load i1, i1* @map.init, align 1
+; CHECK-NEXT:    [[NOTINIT:%.*]] = xor i1 [[MAP_INIT_VAL]], true
+; CHECK-NEXT:    unreachable
+;
+entry:
+  %0 = load i8*, i8** bitcast (%sometype** @map to i8**), align 8
+  %.not = icmp eq i8* %0, null
+  unreachable
+}
+
+declare i8* @_Znwm(i64)
Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp
===================================================================
--- llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -703,8 +703,9 @@
                !ICmpInst::isSigned(cast<ICmpInst>(U)->getPredicate()) &&
                isa<LoadInst>(U->getOperand(0)) &&
                isa<ConstantPointerNull>(U->getOperand(1))) {
-      assert(isa<GlobalValue>(
-                 cast<LoadInst>(U->getOperand(0))->getPointerOperand()) &&
+      assert(isa<GlobalValue>(cast<LoadInst>(U->getOperand(0))
+                                  ->getPointerOperand()
+                                  ->stripPointerCasts()) &&
              "Should be GlobalVariable");
       // This and only this kind of non-signed ICmpInst is to be replaced with
       // the comparing of the value of the created global init bool later in


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D108674.368495.patch
Type: text/x-patch
Size: 1981 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210824/34bddb36/attachment.bin>


More information about the llvm-commits mailing list