
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.
28 lines
916 B
LLVM
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" }
|