diff --git a/clang/test/CodeGenCXX/pr60668.cpp b/clang/test/CodeGenCXX/pr60668.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCXX/pr60668.cpp @@ -0,0 +1,28 @@ +// RUN: %clang --target=aarch64-unknown-linux-gnu -O1 -fvisibility=hidden \ +// RUN: -fsanitize=hwaddress -fsanitize=undefined -std=c++17 -fno-exceptions \ +// RUN: -fno-rtti -c %s -S -o - | FileCheck %s + +struct AndroidSizeClassConfig { + static constexpr unsigned Classes[] = { + 0x00020, 0x00030, 0x00040, 0x00050, 0x00060, 0x00070, 0x00090, 0x000b0, + 0x000c0, 0x000e0, 0x00120, 0x00160, 0x001c0, 0x00250, 0x00320, 0x00450, + 0x00670, 0x00830, 0x00a10, 0x00c30, 0x01010, 0x01210, 0x01bd0, 0x02210, + 0x02d90, 0x03790, 0x04010, 0x04810, 0x05a10, 0x07310, 0x08210, 0x10010, + }; +}; + +static const unsigned NumClasses = + sizeof(AndroidSizeClassConfig::Classes) / sizeof(AndroidSizeClassConfig::Classes[0]); + +void func(unsigned); + +void printMap() { + for (unsigned I = 0; I < NumClasses; I++) { + func(AndroidSizeClassConfig::Classes[I]); + } +} + +// CHECK-LABEL: _Z8printMapv +// CHECK: adrp x{{.*}}, :pg_hi21_nc:_ZN22AndroidSizeClassConfig7ClassesE +// CHECK: movk x{{.*}}, #:prel_g3:_ZN22AndroidSizeClassConfig7ClassesE+4294967296 +// CHECK: add x{{.*}}, x19, :lo12:_ZN22AndroidSizeClassConfig7ClassesE diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -7449,10 +7449,6 @@ } else if (ConstantInt *CI = dyn_cast(V)) return getConstant(CI); else if (GlobalAlias *GA = dyn_cast(V)) { - if (!GA->isInterposable()) { - Ops.push_back(GA->getAliasee()); - return nullptr; - } return getUnknown(V); } else if (!isa(V)) return getUnknown(V); @@ -7639,7 +7635,7 @@ } else if (ConstantInt *CI = dyn_cast(V)) return getConstant(CI); else if (GlobalAlias *GA = dyn_cast(V)) - return GA->isInterposable() ? getUnknown(V) : getSCEV(GA->getAliasee()); + return getUnknown(V); else if (!isa(V)) return getUnknown(V); diff --git a/llvm/test/Analysis/ScalarEvolution/no-follow-alias.ll b/llvm/test/Analysis/ScalarEvolution/no-follow-alias.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/ScalarEvolution/no-follow-alias.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py +; RUN: opt -passes='print' -disable-output %s 2>&1 | FileCheck %s + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-unknown-linux-gnu" + +@glob.private = private constant [32 x i32] zeroinitializer +@glob = linkonce_odr hidden alias [32 x i32], inttoptr (i64 add (i64 ptrtoint (ptr @glob.private to i64), i64 1234) to ptr) + +define hidden void @func(i64 %idx) local_unnamed_addr { +; CHECK-LABEL: 'func' +; CHECK-NEXT: Classifying expressions for: @func +; CHECK-NEXT: %arrayidx = getelementptr inbounds [32 x i32], ptr @glob, i64 0, i64 %idx +; CHECK-NEXT: --> ((4 * %idx) + @glob) U: [0,-1) S: [-9223372036854775808,9223372036854775807) +; CHECK-NEXT: Determining loop execution counts for: @func +; + %arrayidx = getelementptr inbounds [32 x i32], ptr @glob, i64 0, i64 %idx + ret void +}