blob: f6dcd59c339585b189d4d7f859a46afc9eb5bf92 [file] [log] [blame] [edit]
; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library < %s | FileCheck %s
; Test that for scalar values, WaveAcitveProduct maps down to the DirectX op
define noundef i1 @wave_active_all_equal_half(half noundef %expr) {
entry:
; CHECK: call i1 @dx.op.waveActiveAllEqual.f16(i32 115, half %expr)
%ret = call i1 @llvm.dx.wave.all.equal.f16(half %expr)
ret i1 %ret
}
define noundef i1 @wave_active_all_equal_float(float noundef %expr) {
entry:
; CHECK: call i1 @dx.op.waveActiveAllEqual.f32(i32 115, float %expr)
%ret = call i1 @llvm.dx.wave.all.equal.f32(float %expr)
ret i1 %ret
}
define noundef i1 @wave_active_all_equal_double(double noundef %expr) {
entry:
; CHECK: call i1 @dx.op.waveActiveAllEqual.f64(i32 115, double %expr)
%ret = call i1 @llvm.dx.wave.all.equal.f64(double %expr)
ret i1 %ret
}
define noundef i1 @wave_active_all_equal_i16(i16 noundef %expr) {
entry:
; CHECK: call i1 @dx.op.waveActiveAllEqual.i16(i32 115, i16 %expr)
%ret = call i1 @llvm.dx.wave.all.equal.i16(i16 %expr)
ret i1 %ret
}
define noundef i1 @wave_active_all_equal_i32(i32 noundef %expr) {
entry:
; CHECK: call i1 @dx.op.waveActiveAllEqual.i32(i32 115, i32 %expr)
%ret = call i1 @llvm.dx.wave.all.equal.i32(i32 %expr)
ret i1 %ret
}
define noundef i1 @wave_active_all_equal_i64(i64 noundef %expr) {
entry:
; CHECK: call i1 @dx.op.waveActiveAllEqual.i64(i32 115, i64 %expr)
%ret = call i1 @llvm.dx.wave.all.equal.i64(i64 %expr)
ret i1 %ret
}
declare i1 @llvm.dx.wave.all.equal.f16(half)
declare i1 @llvm.dx.wave.all.equal.f32(float)
declare i1 @llvm.dx.wave.all.equal.f64(double)
declare i1 @llvm.dx.wave.all.equal.i16(i16)
declare i1 @llvm.dx.wave.all.equal.i32(i32)
declare i1 @llvm.dx.wave.all.equal.i64(i64)
; Test that for vector values, WaveAcitveProduct scalarizes and maps down to the
; DirectX op
define noundef <2 x i1> @wave_active_all_equal_v2half(<2 x half> noundef %expr) {
entry:
; CHECK: %[[EXPR0:.*]] = extractelement <2 x half> %expr, i64 0
; CHECK: %[[RET0:.*]] = call i1 @dx.op.waveActiveAllEqual.f16(i32 115, half %[[EXPR0]])
; CHECK: %[[EXPR1:.*]] = extractelement <2 x half> %expr, i64 1
; CHECK: %[[RET1:.*]] = call i1 @dx.op.waveActiveAllEqual.f16(i32 115, half %[[EXPR1]])
; CHECK: %[[RETUPTO0:.*]] = insertelement <2 x i1> poison, i1 %[[RET0]], i64 0
; CHECK: %ret = insertelement <2 x i1> %[[RETUPTO0]], i1 %[[RET1]], i64 1
; CHECK: ret <2 x i1> %ret
%ret = call <2 x i1> @llvm.dx.wave.all.equal.v2f16(<2 x half> %expr)
ret <2 x i1> %ret
}
define noundef <3 x i1> @wave_active_all_equal_v3i32(<3 x i32> noundef %expr) {
entry:
; CHECK: %[[EXPR0:.*]] = extractelement <3 x i32> %expr, i64 0
; CHECK: %[[RET0:.*]] = call i1 @dx.op.waveActiveAllEqual.i32(i32 115, i32 %[[EXPR0]])
; CHECK: %[[EXPR1:.*]] = extractelement <3 x i32> %expr, i64 1
; CHECK: %[[RET1:.*]] = call i1 @dx.op.waveActiveAllEqual.i32(i32 115, i32 %[[EXPR1]])
; CHECK: %[[EXPR2:.*]] = extractelement <3 x i32> %expr, i64 2
; CHECK: %[[RET2:.*]] = call i1 @dx.op.waveActiveAllEqual.i32(i32 115, i32 %[[EXPR2]])
; CHECK: %[[RETUPTO0:.*]] = insertelement <3 x i1> poison, i1 %[[RET0]], i64 0
; CHECK: %[[RETUPTO1:.*]] = insertelement <3 x i1> %[[RETUPTO0]], i1 %[[RET1]], i64 1
; CHECK: %ret = insertelement <3 x i1> %[[RETUPTO1]], i1 %[[RET2]], i64 2
%ret = call <3 x i1> @llvm.dx.wave.all.equal.v3i32(<3 x i32> %expr)
ret <3 x i1> %ret
}
define noundef <4 x i1> @wave_active_all_equal_v4f64(<4 x double> noundef %expr) {
entry:
; CHECK: %[[EXPR0:.*]] = extractelement <4 x double> %expr, i64 0
; CHECK: %[[RET0:.*]] = call i1 @dx.op.waveActiveAllEqual.f64(i32 115, double %[[EXPR0]])
; CHECK: %[[EXPR1:.*]] = extractelement <4 x double> %expr, i64 1
; CHECK: %[[RET1:.*]] = call i1 @dx.op.waveActiveAllEqual.f64(i32 115, double %[[EXPR1]])
; CHECK: %[[EXPR2:.*]] = extractelement <4 x double> %expr, i64 2
; CHECK: %[[RET2:.*]] = call i1 @dx.op.waveActiveAllEqual.f64(i32 115, double %[[EXPR2]])
; CHECK: %[[EXPR3:.*]] = extractelement <4 x double> %expr, i64 3
; CHECK: %[[RET3:.*]] = call i1 @dx.op.waveActiveAllEqual.f64(i32 115, double %[[EXPR3]])
; CHECK: %[[RETUPTO0:.*]] = insertelement <4 x i1> poison, i1 %[[RET0]], i64 0
; CHECK: %[[RETUPTO1:.*]] = insertelement <4 x i1> %[[RETUPTO0]], i1 %[[RET1]], i64 1
; CHECK: %[[RETUPTO2:.*]] = insertelement <4 x i1> %[[RETUPTO1]], i1 %[[RET2]], i64 2
; CHECK: %ret = insertelement <4 x i1> %[[RETUPTO2]], i1 %[[RET3]], i64 3
%ret = call <4 x i1> @llvm.dx.wave.all.equal.v464(<4 x double> %expr)
ret <4 x i1> %ret
}
declare <2 x i1> @llvm.dx.wave.all.equal.v2f16(<2 x half>)
declare <3 x i1> @llvm.dx.wave.all.equal.v3i32(<3 x i32>)
declare <4 x i1> @llvm.dx.wave.all.equal.v4f64(<4 x double>)