
Passes in general shouldn't replace an alias with the aliasee (see https://reviews.llvm.org/D66606). This can lead to situations where a linkonce_odr symbol (which could be interposable if lowered to weak linkage) can be replaced with a local aliasee which won't be interposable. SVEC does this when the function is invoked by FunctionPass Manager -> Loop Pass Manager -> Induction Variable Users in the codegen pipeline. This was found in hwasan instrumented code where a linonce_odr alias was replaced with its private aliasee. This fixes the bug descriped at https://github.com/llvm/llvm-project/issues/60668. Differential Revision: https://reviews.llvm.org/D144035
20 lines
939 B
LLVM
20 lines
939 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
|
|
; RUN: opt -passes='print<scalar-evolution>' -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
|
|
}
|