Craig Topper 2a21260ea8 [SelectionDAG] Use getVectorElementPointer in DAGCombiner::replaceStoreOfInsertLoad. (#74249)
This ensures we clip the index to be in bounds of the vector we are
inserting into. If the index is out of bounds the results of the insert
element is poison. If we don't clip the index we can write memory that
was not part of the original store.

Fixes #74248 #75557.
2023-12-14 20:25:16 -08:00

28 lines
916 B
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-apple-macosx10.15 | FileCheck %s
%0 = type <{ half }>
%1 = type <{ <16 x half> }>
define void @foo(ptr %0, ptr %1, ptr %2) #0 {
; CHECK-LABEL: foo:
; CHECK: ## %bb.0:
; CHECK-NEXT: movl (%rdx), %eax
; CHECK-NEXT: vpinsrw $0, (%rdi), %xmm0, %xmm0
; CHECK-NEXT: andl $15, %eax
; CHECK-NEXT: vpextrw $0, %xmm0, (%rsi,%rax,2)
; CHECK-NEXT: retq
%4 = bitcast ptr %2 to ptr
%5 = load i64, ptr %4, align 8
%6 = getelementptr inbounds %0, ptr %0, i64 0, i32 0
%7 = load half, ptr %6, align 2
%8 = getelementptr inbounds %1, ptr %1, i64 0, i32 0
%9 = load <16 x half>, ptr %8, align 16
%10 = trunc i64 %5 to i32
%11 = insertelement <16 x half> %9, half %7, i32 %10
store <16 x half> %11, ptr %8, align 16
ret void
}
attributes #0 = { nounwind "target-features"="+f16c" }