blob: b29167d2dfb27c1ea64319be044c7d35335e75e5 [file] [edit]
; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower %s | FileCheck %s
target triple = "dxil-pc-shadermodel6.0-pixel"
; Scalar float load: one LoadInput call, result forwarded directly.
; CHECK-LABEL: define float @load_scalar_f32
define float @load_scalar_f32() {
; CHECK: [[V:%.*]] = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 1, i8 2, i32 0)
; CHECK-NEXT: ret float [[V]]
; CHECK-NOT: llvm.dx.load.input
%v = call float @llvm.dx.load.input.f32(i32 99, i32 0, i32 1, i8 2, i32 0)
ret float %v
}
; Vector float4 load: four per-component LoadInput calls reassembled into a vector.
; CHECK-LABEL: define <4 x float> @load_v4f32
define <4 x float> @load_v4f32() {
; CHECK: [[S0:%.*]] = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 0)
; CHECK-NEXT: insertelement <4 x float> {{.*}}, float [[S0]], i32 0
; CHECK: [[S1:%.*]] = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 0)
; CHECK-NEXT: insertelement {{.*}}, float [[S1]], i32 1
; CHECK: [[S2:%.*]] = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 2, i32 0)
; CHECK-NEXT: insertelement {{.*}}, float [[S2]], i32 2
; CHECK: [[S3:%.*]] = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 3, i32 0)
; CHECK-NEXT: insertelement {{.*}}, float [[S3]], i32 3
; CHECK-NOT: llvm.dx.load.input
%v = call <4 x float> @llvm.dx.load.input.v4f32(i32 99, i32 1, i32 0, i8 0, i32 0)
ret <4 x float> %v
}
; Vector float2 load with non-zero start column: col indices must be 2 and 3.
; CHECK-LABEL: define <2 x float> @load_v2f32_col2
define <2 x float> @load_v2f32_col2() {
; CHECK: [[S0:%.*]] = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 2, i32 0)
; CHECK-NEXT: insertelement <2 x float> {{.*}}, float [[S0]], i32 0
; CHECK: [[S1:%.*]] = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 3, i32 0)
; CHECK-NEXT: insertelement {{.*}}, float [[S1]], i32 1
; CHECK-NOT: llvm.dx.load.input
%v = call <2 x float> @llvm.dx.load.input.v2f32(i32 99, i32 2, i32 0, i8 2, i32 0)
ret <2 x float> %v
}
; Scalar int load: one LoadInput call, result forwarded directly.
; CHECK-LABEL: define i32 @load_scalar_i32
define i32 @load_scalar_i32() {
; CHECK: [[V:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 2, i32 0, i8 0, i32 0)
; CHECK-NEXT: ret i32 [[V]]
; CHECK-NOT: llvm.dx.load.input
%v = call i32 @llvm.dx.load.input.i32(i32 99, i32 2, i32 0, i8 0, i32 0)
ret i32 %v
}