[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