
As discussed in this [proposal](https://github.com/llvm/wg-hlsl/pull/62/files?short_path=ac6e592#diff-ac6e59276afe8016e307eedc5c835f534c0cb353707760b44df0fa9d905a5cf8). We had to bring back the legacy pass manager interface for the scalarizer pass. Two reasons for this: 1. The DirectX backend is still using the legacy pass manager 2. The new PM isn't hooked up in clang yet via `BackendUtil.cpp`'s `AddEmitPasses` That means even if we add a `buildCodeGenPipeline` we won't be able to benefit from the new pass manager's scalarizer pass interface. The remaining changes are hooking up the scalarizer pass to the DirectX backend, updating the DirectX test cases, and allowing the `optdriver` to not block the legacy invocation of the scalarizer pass. Future work still needs to be done to allow the scalarizer pass to handle target specific intrinsics. closes #105178
53 lines
2.0 KiB
LLVM
53 lines
2.0 KiB
LLVM
; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
|
|
|
|
; Make sure dxil operation function calls for abs are generated for float, half, and double.
|
|
|
|
|
|
; CHECK-LABEL: fabs_half
|
|
define noundef half @fabs_half(half noundef %a) {
|
|
entry:
|
|
; CHECK: call half @dx.op.unary.f16(i32 6, half %{{.*}})
|
|
%elt.abs = call half @llvm.fabs.f16(half %a)
|
|
ret half %elt.abs
|
|
}
|
|
|
|
; CHECK-LABEL: fabs_float
|
|
define noundef float @fabs_float(float noundef %a) {
|
|
entry:
|
|
; CHECK: call float @dx.op.unary.f32(i32 6, float %{{.*}})
|
|
%elt.abs = call float @llvm.fabs.f32(float %a)
|
|
ret float %elt.abs
|
|
}
|
|
|
|
; CHECK-LABEL: fabs_double
|
|
define noundef double @fabs_double(double noundef %a) {
|
|
entry:
|
|
; CHECK: call double @dx.op.unary.f64(i32 6, double %{{.*}})
|
|
%elt.abs = call double @llvm.fabs.f64(double %a)
|
|
ret double %elt.abs
|
|
}
|
|
|
|
; CHECK-LABEL: fabs_float4
|
|
define noundef <4 x float> @fabs_float4(<4 x float> noundef %a) {
|
|
entry:
|
|
; CHECK: [[ee0:%.*]] = extractelement <4 x float> %a, i64 0
|
|
; CHECK: [[ie0:%.*]] = call float @dx.op.unary.f32(i32 6, float [[ee0]])
|
|
; CHECK: [[ee1:%.*]] = extractelement <4 x float> %a, i64 1
|
|
; CHECK: [[ie1:%.*]] = call float @dx.op.unary.f32(i32 6, float [[ee1]])
|
|
; CHECK: [[ee2:%.*]] = extractelement <4 x float> %a, i64 2
|
|
; CHECK: [[ie2:%.*]] = call float @dx.op.unary.f32(i32 6, float [[ee2]])
|
|
; CHECK: [[ee3:%.*]] = extractelement <4 x float> %a, i64 3
|
|
; CHECK: [[ie3:%.*]] = call float @dx.op.unary.f32(i32 6, float [[ee3]])
|
|
; CHECK: insertelement <4 x float> poison, float [[ie0]], i64 0
|
|
; CHECK: insertelement <4 x float> %{{.*}}, float [[ie1]], i64 1
|
|
; CHECK: insertelement <4 x float> %{{.*}}, float [[ie2]], i64 2
|
|
; CHECK: insertelement <4 x float> %{{.*}}, float [[ie3]], i64 3
|
|
%2 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
|
|
ret <4 x float> %2
|
|
}
|
|
|
|
declare half @llvm.fabs.f16(half)
|
|
declare float @llvm.fabs.f32(float)
|
|
declare double @llvm.fabs.f64(double)
|
|
declare <4 x float> @llvm.fabs.v4f32(<4 x float>)
|