We tend to assume that the AA pipeline is by default the default AA pipeline and it's confusing when it's empty instead. PR48779 Initially reverted due to BasicAA running analyses in an unspecified order (multiple function calls as parameters), fixed by fetching analyses before the call to construct BasicAA. Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D95117
57 lines
2.9 KiB
LLVM
57 lines
2.9 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -O2 -S | FileCheck %s
|
|
; RUN: opt < %s -passes='default<O2>' -S | FileCheck %s
|
|
|
|
target triple = "x86_64--"
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
declare void @llvm.x86.avx.maskstore.ps.256(i8*, <8 x i32>, <8 x float>) #0
|
|
declare void @llvm.masked.store.v8f32.p0v8f32(<8 x float>, <8 x float>*, i32, <8 x i1>)
|
|
|
|
; PR11210: If we have been able to replace a AVX/AVX2 masked store with a
|
|
; generic masked store intrinsic, then we should be able to remove dead
|
|
; masked stores.
|
|
|
|
define void @PR11210_v8f32_maskstore_maskstore(i8* %ptr, <8 x float> %x, <8 x float> %y, <8 x i32> %src) {
|
|
; CHECK-LABEL: @PR11210_v8f32_maskstore_maskstore(
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <8 x i32> [[SRC:%.*]], zeroinitializer
|
|
; CHECK-NEXT: [[CASTVEC:%.*]] = bitcast i8* [[PTR:%.*]] to <8 x float>*
|
|
; CHECK-NEXT: tail call void @llvm.masked.store.v8f32.p0v8f32(<8 x float> [[Y:%.*]], <8 x float>* [[CASTVEC]], i32 1, <8 x i1> [[CMP]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%cmp = icmp sgt <8 x i32> %src, zeroinitializer
|
|
%mask = sext <8 x i1> %cmp to <8 x i32>
|
|
call void @llvm.x86.avx.maskstore.ps.256(i8* %ptr, <8 x i32> %mask, <8 x float> %x)
|
|
call void @llvm.x86.avx.maskstore.ps.256(i8* %ptr, <8 x i32> %mask, <8 x float> %y)
|
|
ret void
|
|
}
|
|
|
|
; The contents of %mask are unknown so we don't replace this with a generic masked.store.
|
|
define void @PR11210_v8f32_maskstore_maskstore_raw_mask(i8* %ptr, <8 x float> %x, <8 x float> %y, <8 x i32> %mask) {
|
|
; CHECK-LABEL: @PR11210_v8f32_maskstore_maskstore_raw_mask(
|
|
; CHECK-NEXT: tail call void @llvm.x86.avx.maskstore.ps.256(i8* [[PTR:%.*]], <8 x i32> [[MASK:%.*]], <8 x float> [[X:%.*]])
|
|
; CHECK-NEXT: tail call void @llvm.x86.avx.maskstore.ps.256(i8* [[PTR]], <8 x i32> [[MASK]], <8 x float> [[Y:%.*]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @llvm.x86.avx.maskstore.ps.256(i8* %ptr, <8 x i32> %mask, <8 x float> %x)
|
|
call void @llvm.x86.avx.maskstore.ps.256(i8* %ptr, <8 x i32> %mask, <8 x float> %y)
|
|
ret void
|
|
}
|
|
|
|
; Mix AVX and generic masked stores.
|
|
define void @PR11210_v8f32_mstore_maskstore(i8* %ptr, <8 x float> %x, <8 x float> %y, <8 x i32> %src) {
|
|
; CHECK-LABEL: @PR11210_v8f32_mstore_maskstore(
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <8 x i32> [[SRC:%.*]], zeroinitializer
|
|
; CHECK-NEXT: [[PTRF:%.*]] = bitcast i8* [[PTR:%.*]] to <8 x float>*
|
|
; CHECK-NEXT: tail call void @llvm.masked.store.v8f32.p0v8f32(<8 x float> [[Y:%.*]], <8 x float>* [[PTRF]], i32 1, <8 x i1> [[CMP]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%cmp = icmp sgt <8 x i32> %src, zeroinitializer
|
|
%mask = sext <8 x i1> %cmp to <8 x i32>
|
|
%ptrf = bitcast i8* %ptr to <8 x float>*
|
|
tail call void @llvm.masked.store.v8f32.p0v8f32(<8 x float> %x, <8 x float>* %ptrf, i32 1, <8 x i1> %cmp)
|
|
call void @llvm.x86.avx.maskstore.ps.256(i8* %ptr, <8 x i32> %mask, <8 x float> %y)
|
|
ret void
|
|
}
|
|
|