diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -1161,6 +1161,7 @@ // value was null. if (GV->getInitializer()->getType()->isPointerTy() && GV->getInitializer()->isNullValue() && + StoredOnceVal->getType()->isPointerTy() && !NullPointerIsDefined( nullptr /* F */, GV->getInitializer()->getType()->getPointerAddressSpace())) { diff --git a/llvm/test/Transforms/GlobalOpt/2021-08-02-CastStoreOnceP2I.ll b/llvm/test/Transforms/GlobalOpt/2021-08-02-CastStoreOnceP2I.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/2021-08-02-CastStoreOnceP2I.ll @@ -0,0 +1,20 @@ +; RUN: opt -globalopt -S < %s | FileCheck %s +; RUN: opt -passes=globalopt -S < %s | FileCheck %s + +; This tests the assignemnt of non-pointer to global address +; (assert due to D106589). + +@a162 = internal global i16* null, align 1 + +define void @f363() { +; CHECK-LABEL: @f363( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load i16*, i16** @a162, align 1 +; CHECK-NEXT: store i16 0, i16* bitcast (i16** @a162 to i16*), align 1 +; CHECK-NEXT: ret void +; +entry: + %0 = load i16*, i16** @a162, align 1 + store i16 0, i16* bitcast (i16** @a162 to i16*), align 1 + ret void +}