mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
d32d86bc38
The "takeName" logic at the end of ScalarizerVisitor::finish could end up renaming global variables when having simplified and extractelement instruction to simply pick a single vector element. If the input vector to the extractelement instruction held pointers to global variables we ended up renaming the global variable. The patch make sure we only take the name of the replaced Op when we have added new instructions that might need a useful name. Reviewed By: lebedev.ri Differential Revision: https://reviews.llvm.org/D86472
24 lines
910 B
LLVM
24 lines
910 B
LLVM
; RUN: opt < %s -scalarizer -S -o - | FileCheck %s
|
|
; RUN: opt < %s -passes='function(scalarizer)' -S | FileCheck %s
|
|
|
|
@a = dso_local global i16 0, align 1
|
|
@b = dso_local local_unnamed_addr global i16 0, align 1
|
|
|
|
; The scalarizer used to take the name of the extractelement instruction
|
|
; ("extract") and put that on the extracted value, which in this test case is
|
|
; the global variable @a. That was wrong, as we must not change the name of
|
|
; the global variable. So make sure we find "@a" in the ptrtoint.
|
|
define dso_local void @test1() local_unnamed_addr {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[T0:%.*]] = ptrtoint i16* @a to i16
|
|
; CHECK-NEXT: store i16 [[T0]], i16* @b, align 1
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%extract = extractelement <4 x i16*> <i16* @a, i16* @a, i16* @a, i16* @a>, i32 1
|
|
%t0 = ptrtoint i16* %extract to i16
|
|
store i16 %t0, i16* @b, align 1
|
|
ret void
|
|
}
|