Files
clang-p2996/llvm/test/Transforms/Scalarizer/opaque-ptr-bug.ll
Nicolai Hähnle 6c379cb318 Scalarizer: fix an opaque pointer bug
With opaque pointers, it's possible for the same pointer value to be
used to store different vector types (both number and type of elements),
so we need to take that into account when caching the scattering.

Differential Revision: https://reviews.llvm.org/D139359
2022-12-08 20:48:14 +01:00

29 lines
1.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt %s -passes='scalarizer,dce' -S -scalarize-load-store -o - | FileCheck %s
; This used to crash because the same (pointer) value was scattered by
; different amounts.
define void @test1(ptr %p) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: [[P_I12:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 1
; CHECK-NEXT: [[P_I11:%.*]] = getelementptr i32, ptr [[P]], i32 1
; CHECK-NEXT: [[P_I2:%.*]] = getelementptr i32, ptr [[P]], i32 2
; CHECK-NEXT: [[P_I3:%.*]] = getelementptr i32, ptr [[P]], i32 3
; CHECK-NEXT: store i32 0, ptr [[P]], align 8
; CHECK-NEXT: [[P_I1:%.*]] = getelementptr i32, ptr [[P]], i32 1
; CHECK-NEXT: store i32 0, ptr [[P_I1]], align 4
; CHECK-NEXT: store i32 0, ptr [[P]], align 16
; CHECK-NEXT: store i32 0, ptr [[P_I11]], align 4
; CHECK-NEXT: store i32 0, ptr [[P_I2]], align 8
; CHECK-NEXT: store i32 0, ptr [[P_I3]], align 4
; CHECK-NEXT: store i16 0, ptr [[P]], align 4
; CHECK-NEXT: store i16 0, ptr [[P_I12]], align 2
; CHECK-NEXT: ret void
;
store <2 x i32> zeroinitializer, ptr %p
store <4 x i32> zeroinitializer, ptr %p
store <2 x i16> zeroinitializer, ptr %p
ret void
}