From cea5ab090b5e4e8ee06a9230b73e74c1230c1c54 Mon Sep 17 00:00:00 2001 From: Shimin Cui Date: Tue, 24 Aug 2021 20:47:33 -0400 Subject: [PATCH] [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 --- llvm/lib/Transforms/IPO/GlobalOpt.cpp | 5 ++-- .../GlobalOpt/null-check-global-value.ll | 32 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 llvm/test/Transforms/GlobalOpt/null-check-global-value.ll diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 1ffba57..04282b5 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(U)->getPredicate()) && isa(U->getOperand(0)) && isa(U->getOperand(1))) { - assert(isa( - cast(U->getOperand(0))->getPointerOperand()) && + assert(isa(cast(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 0000000..0958440 --- /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* } + +@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) -- 2.7.4