[llvm] cea5ab0 - [GlobalOpt] Fix the assert for null check of global value

Shimin Cui via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 24 17:48:13 PDT 2021


Author: Shimin Cui
Date: 2021-08-24T20:47:33-04:00
New Revision: cea5ab090b5e4e8ee06a9230b73e74c1230c1c54

URL: https://github.com/llvm/llvm-project/commit/cea5ab090b5e4e8ee06a9230b73e74c1230c1c54
DIFF: https://github.com/llvm/llvm-project/commit/cea5ab090b5e4e8ee06a9230b73e74c1230c1c54.diff

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

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

Reviewed By: asbirlea

Differential Revision: https://reviews.llvm.org/D108674

Added: 
    llvm/test/Transforms/GlobalOpt/null-check-global-value.ll

Modified: 
    llvm/lib/Transforms/IPO/GlobalOpt.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index 1ffba572ff35f..04282b5f8f10c 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -703,8 +703,9 @@ static bool AllUsesOfValueWillTrapIfNull(const Value *V,
                !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

diff  --git a/llvm/test/Transforms/GlobalOpt/null-check-global-value.ll b/llvm/test/Transforms/GlobalOpt/null-check-global-value.ll
new file mode 100644
index 0000000000000..0958440e765ba
--- /dev/null
+++ b/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)


        


More information about the llvm-commits mailing list