Files
clang-p2996/llvm/test/Transforms/SLPVectorizer/X86/const-in-different-functions.ll
Vitaly Buka 5ce47a5813 Reland "[Support] Assert that DomTree nodes share parent" (#102782)
A dominance query of a block that is in a different function is
ill-defined, so assert that getNode() is only called for blocks that are
in the same function.

There are three cases, where this behavior did occur. LoopFuse didn't
explicitly do this, but didn't invalidate the SCEV block dispositions,
leaving dangling pointers to free'ed basic blocks behind, causing
use-after-free. We do, however, want to be able to dereference basic
blocks inside the dominator tree, so that we can refer to them by a
number stored inside the basic block.

Reverts #102780
Reland #101198
Fixes #102784

Co-authored-by: Alexis Engelke <engelke@in.tum.de>
2024-08-13 11:56:02 +02:00

49 lines
1.8 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -mtriple=x86_64 -passes=slp-vectorizer < %s | FileCheck %s
; Test that SLP vectorize doesn't crash if a stored constant is used in multiple
; functions.
@p = external global [64 x float]
define void @_Z1hPfl() {
; CHECK-LABEL: define void @_Z1hPfl() {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr @p, i64 28
; CHECK-NEXT: store <2 x float> <float 0.000000e+00, float 1.000000e+00>, ptr [[TMP0]], align 4
; CHECK-NEXT: ret void
;
entry:
%0 = getelementptr i8, ptr @p, i64 28
store float 0.000000e+00, ptr %0, align 4
%1 = getelementptr i8, ptr @p, i64 32
store float 1.000000e+00, ptr %1, align 16
ret void
}
define void @_Z1mv(i64 %arrayidx4.i.2.idx) {
; CHECK-LABEL: define void @_Z1mv(
; CHECK-SAME: i64 [[ARRAYIDX4_I_2_IDX:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: ret void
; CHECK: [[FOR_COND1_PREHEADER_LR_PH_I:.*:]]
; CHECK-NEXT: br label %[[FOR_COND1_PREHEADER_I:.*]]
; CHECK: [[FOR_COND1_PREHEADER_I]]:
; CHECK-NEXT: store float 1.000000e+00, ptr @p, align 4
; CHECK-NEXT: [[ARRAYIDX4_I_2:%.*]] = getelementptr i8, ptr @p, i64 [[ARRAYIDX4_I_2_IDX]]
; CHECK-NEXT: store float 0.000000e+00, ptr [[ARRAYIDX4_I_2]], align 4
; CHECK-NEXT: br label %[[FOR_COND1_PREHEADER_I]]
;
entry:
ret void
for.cond1.preheader.lr.ph.i: ; No predecessors!
br label %for.cond1.preheader.i
for.cond1.preheader.i: ; preds = %for.cond1.preheader.i, %for.cond1.preheader.lr.ph.i
store float 1.000000e+00, ptr @p, align 4
%arrayidx4.i.2 = getelementptr i8, ptr @p, i64 %arrayidx4.i.2.idx
store float 0.000000e+00, ptr %arrayidx4.i.2, align 4
br label %for.cond1.preheader.i
}