blob: f96f20cf5e6ff38a56adce703e97f9a92e46566d [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -passes='function(scalarizer)' -S -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=CHECK,NOLOWER
; RUN: opt -passes='function(scalarizer),module(dxil-op-lower)' -S -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=CHECK,WITHLOWER
; Matrices are flattened to vectors in DXIL, so each matrix shape is exercised
; through its flattened <N x double> form (e.g. double2x2 -> <4 x double>).
define noundef <4 x i32> @test_mat2x2(<4 x double> noundef %d) {
; NOLOWER-LABEL: define noundef <4 x i32> @test_mat2x2(
; NOLOWER-SAME: <4 x double> noundef [[D:%.*]]) {
; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <4 x double> [[D]], i64 0
; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]])
; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <4 x double> [[D]], i64 1
; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]])
; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <4 x double> [[D]], i64 2
; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]])
; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <4 x double> [[D]], i64 3
; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]])
; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0
; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0
; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0
; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0
; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1
; NOLOWER-NEXT: [[DOTELEM14:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1
; NOLOWER-NEXT: [[DOTELEM15:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1
; NOLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1
; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM14]]
; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM15]]
; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM16]]
; NOLOWER-NEXT: [[DOTUPTO021:%.*]] = insertelement <4 x i32> poison, i32 [[DOTI0]], i64 0
; NOLOWER-NEXT: [[DOTUPTO122:%.*]] = insertelement <4 x i32> [[DOTUPTO021]], i32 [[DOTI1]], i64 1
; NOLOWER-NEXT: [[DOTUPTO223:%.*]] = insertelement <4 x i32> [[DOTUPTO122]], i32 [[DOTI2]], i64 2
; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> [[DOTUPTO223]], i32 [[DOTI3]], i64 3
; NOLOWER-NEXT: ret <4 x i32> [[TMP1]]
;
; WITHLOWER-LABEL: define noundef <4 x i32> @test_mat2x2(
; WITHLOWER-SAME: <4 x double> noundef [[D:%.*]]) {
; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <4 x double> [[D]], i64 0
; WITHLOWER-NEXT: [[HLSL_ASUINT_I027:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64:[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*]](i32 102, double [[D_I0]])
; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <4 x double> [[D]], i64 1
; WITHLOWER-NEXT: [[HLSL_ASUINT_I126:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]])
; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <4 x double> [[D]], i64 2
; WITHLOWER-NEXT: [[HLSL_ASUINT_I225:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]])
; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <4 x double> [[D]], i64 3
; WITHLOWER-NEXT: [[HLSL_ASUINT_I324:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]])
; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I027]], 0
; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I126]], 0
; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I225]], 0
; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I324]], 0
; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I027]], 1
; WITHLOWER-NEXT: [[DOTELEM14:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I126]], 1
; WITHLOWER-NEXT: [[DOTELEM15:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I225]], 1
; WITHLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I324]], 1
; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM14]]
; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM15]]
; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM16]]
; WITHLOWER-NEXT: [[DOTUPTO021:%.*]] = insertelement <4 x i32> poison, i32 [[DOTI0]], i64 0
; WITHLOWER-NEXT: [[DOTUPTO122:%.*]] = insertelement <4 x i32> [[DOTUPTO021]], i32 [[DOTI1]], i64 1
; WITHLOWER-NEXT: [[DOTUPTO223:%.*]] = insertelement <4 x i32> [[DOTUPTO122]], i32 [[DOTI2]], i64 2
; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> [[DOTUPTO223]], i32 [[DOTI3]], i64 3
; WITHLOWER-NEXT: ret <4 x i32> [[TMP1]]
;
%hlsl.asuint = call { <4 x i32>, <4 x i32> } @llvm.dx.splitdouble.v4i32(<4 x double> %d)
%1 = extractvalue { <4 x i32>, <4 x i32> } %hlsl.asuint, 0
%2 = extractvalue { <4 x i32>, <4 x i32> } %hlsl.asuint, 1
%3 = add <4 x i32> %1, %2
ret <4 x i32> %3
}
define noundef <6 x i32> @test_mat2x3(<6 x double> noundef %d) {
; NOLOWER-LABEL: define noundef <6 x i32> @test_mat2x3(
; NOLOWER-SAME: <6 x double> noundef [[D:%.*]]) {
; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <6 x double> [[D]], i64 0
; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]])
; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <6 x double> [[D]], i64 1
; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]])
; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <6 x double> [[D]], i64 2
; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]])
; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <6 x double> [[D]], i64 3
; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]])
; NOLOWER-NEXT: [[D_I4:%.*]] = extractelement <6 x double> [[D]], i64 4
; NOLOWER-NEXT: [[HLSL_ASUINT_I4:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I4]])
; NOLOWER-NEXT: [[D_I5:%.*]] = extractelement <6 x double> [[D]], i64 5
; NOLOWER-NEXT: [[HLSL_ASUINT_I5:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I5]])
; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0
; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0
; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0
; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0
; NOLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 0
; NOLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 0
; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1
; NOLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1
; NOLOWER-NEXT: [[DOTELEM17:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1
; NOLOWER-NEXT: [[DOTELEM18:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1
; NOLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 1
; NOLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 1
; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM16]]
; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM17]]
; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM18]]
; NOLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM19]]
; NOLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM110]]
; NOLOWER-NEXT: [[DOTUPTO033:%.*]] = insertelement <6 x i32> poison, i32 [[DOTI0]], i64 0
; NOLOWER-NEXT: [[DOTUPTO134:%.*]] = insertelement <6 x i32> [[DOTUPTO033]], i32 [[DOTI1]], i64 1
; NOLOWER-NEXT: [[DOTUPTO235:%.*]] = insertelement <6 x i32> [[DOTUPTO134]], i32 [[DOTI2]], i64 2
; NOLOWER-NEXT: [[DOTUPTO336:%.*]] = insertelement <6 x i32> [[DOTUPTO235]], i32 [[DOTI3]], i64 3
; NOLOWER-NEXT: [[DOTUPTO437:%.*]] = insertelement <6 x i32> [[DOTUPTO336]], i32 [[DOTI4]], i64 4
; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <6 x i32> [[DOTUPTO437]], i32 [[DOTI5]], i64 5
; NOLOWER-NEXT: ret <6 x i32> [[TMP1]]
;
; WITHLOWER-LABEL: define noundef <6 x i32> @test_mat2x3(
; WITHLOWER-SAME: <6 x double> noundef [[D:%.*]]) {
; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <6 x double> [[D]], i64 0
; WITHLOWER-NEXT: [[HLSL_ASUINT_I043:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I0]])
; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <6 x double> [[D]], i64 1
; WITHLOWER-NEXT: [[HLSL_ASUINT_I142:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]])
; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <6 x double> [[D]], i64 2
; WITHLOWER-NEXT: [[HLSL_ASUINT_I241:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]])
; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <6 x double> [[D]], i64 3
; WITHLOWER-NEXT: [[HLSL_ASUINT_I340:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]])
; WITHLOWER-NEXT: [[D_I4:%.*]] = extractelement <6 x double> [[D]], i64 4
; WITHLOWER-NEXT: [[HLSL_ASUINT_I439:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I4]])
; WITHLOWER-NEXT: [[D_I5:%.*]] = extractelement <6 x double> [[D]], i64 5
; WITHLOWER-NEXT: [[HLSL_ASUINT_I538:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I5]])
; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I043]], 0
; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I142]], 0
; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I241]], 0
; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I340]], 0
; WITHLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I439]], 0
; WITHLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I538]], 0
; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I043]], 1
; WITHLOWER-NEXT: [[DOTELEM16:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I142]], 1
; WITHLOWER-NEXT: [[DOTELEM17:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I241]], 1
; WITHLOWER-NEXT: [[DOTELEM18:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I340]], 1
; WITHLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I439]], 1
; WITHLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I538]], 1
; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM16]]
; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM17]]
; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM18]]
; WITHLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM19]]
; WITHLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM110]]
; WITHLOWER-NEXT: [[DOTUPTO033:%.*]] = insertelement <6 x i32> poison, i32 [[DOTI0]], i64 0
; WITHLOWER-NEXT: [[DOTUPTO134:%.*]] = insertelement <6 x i32> [[DOTUPTO033]], i32 [[DOTI1]], i64 1
; WITHLOWER-NEXT: [[DOTUPTO235:%.*]] = insertelement <6 x i32> [[DOTUPTO134]], i32 [[DOTI2]], i64 2
; WITHLOWER-NEXT: [[DOTUPTO336:%.*]] = insertelement <6 x i32> [[DOTUPTO235]], i32 [[DOTI3]], i64 3
; WITHLOWER-NEXT: [[DOTUPTO437:%.*]] = insertelement <6 x i32> [[DOTUPTO336]], i32 [[DOTI4]], i64 4
; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <6 x i32> [[DOTUPTO437]], i32 [[DOTI5]], i64 5
; WITHLOWER-NEXT: ret <6 x i32> [[TMP1]]
;
%hlsl.asuint = call { <6 x i32>, <6 x i32> } @llvm.dx.splitdouble.v6i32(<6 x double> %d)
%1 = extractvalue { <6 x i32>, <6 x i32> } %hlsl.asuint, 0
%2 = extractvalue { <6 x i32>, <6 x i32> } %hlsl.asuint, 1
%3 = add <6 x i32> %1, %2
ret <6 x i32> %3
}
define noundef <9 x i32> @test_mat3x3(<9 x double> noundef %d) {
; NOLOWER-LABEL: define noundef <9 x i32> @test_mat3x3(
; NOLOWER-SAME: <9 x double> noundef [[D:%.*]]) {
; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <9 x double> [[D]], i64 0
; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]])
; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <9 x double> [[D]], i64 1
; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]])
; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <9 x double> [[D]], i64 2
; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]])
; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <9 x double> [[D]], i64 3
; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]])
; NOLOWER-NEXT: [[D_I4:%.*]] = extractelement <9 x double> [[D]], i64 4
; NOLOWER-NEXT: [[HLSL_ASUINT_I4:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I4]])
; NOLOWER-NEXT: [[D_I5:%.*]] = extractelement <9 x double> [[D]], i64 5
; NOLOWER-NEXT: [[HLSL_ASUINT_I5:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I5]])
; NOLOWER-NEXT: [[D_I6:%.*]] = extractelement <9 x double> [[D]], i64 6
; NOLOWER-NEXT: [[HLSL_ASUINT_I6:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I6]])
; NOLOWER-NEXT: [[D_I7:%.*]] = extractelement <9 x double> [[D]], i64 7
; NOLOWER-NEXT: [[HLSL_ASUINT_I7:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I7]])
; NOLOWER-NEXT: [[D_I8:%.*]] = extractelement <9 x double> [[D]], i64 8
; NOLOWER-NEXT: [[HLSL_ASUINT_I8:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I8]])
; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0
; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0
; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0
; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0
; NOLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 0
; NOLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 0
; NOLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 0
; NOLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 0
; NOLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 0
; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1
; NOLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1
; NOLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1
; NOLOWER-NEXT: [[DOTELEM111:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1
; NOLOWER-NEXT: [[DOTELEM112:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 1
; NOLOWER-NEXT: [[DOTELEM113:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 1
; NOLOWER-NEXT: [[DOTELEM114:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 1
; NOLOWER-NEXT: [[DOTELEM115:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 1
; NOLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 1
; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM19]]
; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM110]]
; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM111]]
; NOLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM112]]
; NOLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM113]]
; NOLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM114]]
; NOLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM115]]
; NOLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM116]]
; NOLOWER-NEXT: [[DOTUPTO051:%.*]] = insertelement <9 x i32> poison, i32 [[DOTI0]], i64 0
; NOLOWER-NEXT: [[DOTUPTO152:%.*]] = insertelement <9 x i32> [[DOTUPTO051]], i32 [[DOTI1]], i64 1
; NOLOWER-NEXT: [[DOTUPTO253:%.*]] = insertelement <9 x i32> [[DOTUPTO152]], i32 [[DOTI2]], i64 2
; NOLOWER-NEXT: [[DOTUPTO354:%.*]] = insertelement <9 x i32> [[DOTUPTO253]], i32 [[DOTI3]], i64 3
; NOLOWER-NEXT: [[DOTUPTO455:%.*]] = insertelement <9 x i32> [[DOTUPTO354]], i32 [[DOTI4]], i64 4
; NOLOWER-NEXT: [[DOTUPTO556:%.*]] = insertelement <9 x i32> [[DOTUPTO455]], i32 [[DOTI5]], i64 5
; NOLOWER-NEXT: [[DOTUPTO657:%.*]] = insertelement <9 x i32> [[DOTUPTO556]], i32 [[DOTI6]], i64 6
; NOLOWER-NEXT: [[DOTUPTO758:%.*]] = insertelement <9 x i32> [[DOTUPTO657]], i32 [[DOTI7]], i64 7
; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <9 x i32> [[DOTUPTO758]], i32 [[DOTI8]], i64 8
; NOLOWER-NEXT: ret <9 x i32> [[TMP1]]
;
; WITHLOWER-LABEL: define noundef <9 x i32> @test_mat3x3(
; WITHLOWER-SAME: <9 x double> noundef [[D:%.*]]) {
; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <9 x double> [[D]], i64 0
; WITHLOWER-NEXT: [[HLSL_ASUINT_I067:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I0]])
; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <9 x double> [[D]], i64 1
; WITHLOWER-NEXT: [[HLSL_ASUINT_I166:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]])
; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <9 x double> [[D]], i64 2
; WITHLOWER-NEXT: [[HLSL_ASUINT_I265:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]])
; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <9 x double> [[D]], i64 3
; WITHLOWER-NEXT: [[HLSL_ASUINT_I364:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]])
; WITHLOWER-NEXT: [[D_I4:%.*]] = extractelement <9 x double> [[D]], i64 4
; WITHLOWER-NEXT: [[HLSL_ASUINT_I463:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I4]])
; WITHLOWER-NEXT: [[D_I5:%.*]] = extractelement <9 x double> [[D]], i64 5
; WITHLOWER-NEXT: [[HLSL_ASUINT_I562:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I5]])
; WITHLOWER-NEXT: [[D_I6:%.*]] = extractelement <9 x double> [[D]], i64 6
; WITHLOWER-NEXT: [[HLSL_ASUINT_I661:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I6]])
; WITHLOWER-NEXT: [[D_I7:%.*]] = extractelement <9 x double> [[D]], i64 7
; WITHLOWER-NEXT: [[HLSL_ASUINT_I760:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I7]])
; WITHLOWER-NEXT: [[D_I8:%.*]] = extractelement <9 x double> [[D]], i64 8
; WITHLOWER-NEXT: [[HLSL_ASUINT_I859:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I8]])
; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I067]], 0
; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I166]], 0
; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I265]], 0
; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I364]], 0
; WITHLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I463]], 0
; WITHLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I562]], 0
; WITHLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I661]], 0
; WITHLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I760]], 0
; WITHLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I859]], 0
; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I067]], 1
; WITHLOWER-NEXT: [[DOTELEM19:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I166]], 1
; WITHLOWER-NEXT: [[DOTELEM110:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I265]], 1
; WITHLOWER-NEXT: [[DOTELEM111:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I364]], 1
; WITHLOWER-NEXT: [[DOTELEM112:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I463]], 1
; WITHLOWER-NEXT: [[DOTELEM113:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I562]], 1
; WITHLOWER-NEXT: [[DOTELEM114:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I661]], 1
; WITHLOWER-NEXT: [[DOTELEM115:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I760]], 1
; WITHLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I859]], 1
; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM19]]
; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM110]]
; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM111]]
; WITHLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM112]]
; WITHLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM113]]
; WITHLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM114]]
; WITHLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM115]]
; WITHLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM116]]
; WITHLOWER-NEXT: [[DOTUPTO051:%.*]] = insertelement <9 x i32> poison, i32 [[DOTI0]], i64 0
; WITHLOWER-NEXT: [[DOTUPTO152:%.*]] = insertelement <9 x i32> [[DOTUPTO051]], i32 [[DOTI1]], i64 1
; WITHLOWER-NEXT: [[DOTUPTO253:%.*]] = insertelement <9 x i32> [[DOTUPTO152]], i32 [[DOTI2]], i64 2
; WITHLOWER-NEXT: [[DOTUPTO354:%.*]] = insertelement <9 x i32> [[DOTUPTO253]], i32 [[DOTI3]], i64 3
; WITHLOWER-NEXT: [[DOTUPTO455:%.*]] = insertelement <9 x i32> [[DOTUPTO354]], i32 [[DOTI4]], i64 4
; WITHLOWER-NEXT: [[DOTUPTO556:%.*]] = insertelement <9 x i32> [[DOTUPTO455]], i32 [[DOTI5]], i64 5
; WITHLOWER-NEXT: [[DOTUPTO657:%.*]] = insertelement <9 x i32> [[DOTUPTO556]], i32 [[DOTI6]], i64 6
; WITHLOWER-NEXT: [[DOTUPTO758:%.*]] = insertelement <9 x i32> [[DOTUPTO657]], i32 [[DOTI7]], i64 7
; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <9 x i32> [[DOTUPTO758]], i32 [[DOTI8]], i64 8
; WITHLOWER-NEXT: ret <9 x i32> [[TMP1]]
;
%hlsl.asuint = call { <9 x i32>, <9 x i32> } @llvm.dx.splitdouble.v9i32(<9 x double> %d)
%1 = extractvalue { <9 x i32>, <9 x i32> } %hlsl.asuint, 0
%2 = extractvalue { <9 x i32>, <9 x i32> } %hlsl.asuint, 1
%3 = add <9 x i32> %1, %2
ret <9 x i32> %3
}
define noundef <16 x i32> @test_mat4x4(<16 x double> noundef %d) {
; NOLOWER-LABEL: define noundef <16 x i32> @test_mat4x4(
; NOLOWER-SAME: <16 x double> noundef [[D:%.*]]) {
; NOLOWER-NEXT: [[D_I0:%.*]] = extractelement <16 x double> [[D]], i64 0
; NOLOWER-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]])
; NOLOWER-NEXT: [[D_I1:%.*]] = extractelement <16 x double> [[D]], i64 1
; NOLOWER-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]])
; NOLOWER-NEXT: [[D_I2:%.*]] = extractelement <16 x double> [[D]], i64 2
; NOLOWER-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]])
; NOLOWER-NEXT: [[D_I3:%.*]] = extractelement <16 x double> [[D]], i64 3
; NOLOWER-NEXT: [[HLSL_ASUINT_I3:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I3]])
; NOLOWER-NEXT: [[D_I4:%.*]] = extractelement <16 x double> [[D]], i64 4
; NOLOWER-NEXT: [[HLSL_ASUINT_I4:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I4]])
; NOLOWER-NEXT: [[D_I5:%.*]] = extractelement <16 x double> [[D]], i64 5
; NOLOWER-NEXT: [[HLSL_ASUINT_I5:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I5]])
; NOLOWER-NEXT: [[D_I6:%.*]] = extractelement <16 x double> [[D]], i64 6
; NOLOWER-NEXT: [[HLSL_ASUINT_I6:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I6]])
; NOLOWER-NEXT: [[D_I7:%.*]] = extractelement <16 x double> [[D]], i64 7
; NOLOWER-NEXT: [[HLSL_ASUINT_I7:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I7]])
; NOLOWER-NEXT: [[D_I8:%.*]] = extractelement <16 x double> [[D]], i64 8
; NOLOWER-NEXT: [[HLSL_ASUINT_I8:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I8]])
; NOLOWER-NEXT: [[D_I9:%.*]] = extractelement <16 x double> [[D]], i64 9
; NOLOWER-NEXT: [[HLSL_ASUINT_I9:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I9]])
; NOLOWER-NEXT: [[D_I10:%.*]] = extractelement <16 x double> [[D]], i64 10
; NOLOWER-NEXT: [[HLSL_ASUINT_I10:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I10]])
; NOLOWER-NEXT: [[D_I11:%.*]] = extractelement <16 x double> [[D]], i64 11
; NOLOWER-NEXT: [[HLSL_ASUINT_I11:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I11]])
; NOLOWER-NEXT: [[D_I12:%.*]] = extractelement <16 x double> [[D]], i64 12
; NOLOWER-NEXT: [[HLSL_ASUINT_I12:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I12]])
; NOLOWER-NEXT: [[D_I13:%.*]] = extractelement <16 x double> [[D]], i64 13
; NOLOWER-NEXT: [[HLSL_ASUINT_I13:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I13]])
; NOLOWER-NEXT: [[D_I14:%.*]] = extractelement <16 x double> [[D]], i64 14
; NOLOWER-NEXT: [[HLSL_ASUINT_I14:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I14]])
; NOLOWER-NEXT: [[D_I15:%.*]] = extractelement <16 x double> [[D]], i64 15
; NOLOWER-NEXT: [[HLSL_ASUINT_I15:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I15]])
; NOLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0
; NOLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0
; NOLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0
; NOLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 0
; NOLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 0
; NOLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 0
; NOLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 0
; NOLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 0
; NOLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 0
; NOLOWER-NEXT: [[DOTELEM09:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I9]], 0
; NOLOWER-NEXT: [[DOTELEM010:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I10]], 0
; NOLOWER-NEXT: [[DOTELEM011:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I11]], 0
; NOLOWER-NEXT: [[DOTELEM012:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I12]], 0
; NOLOWER-NEXT: [[DOTELEM013:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I13]], 0
; NOLOWER-NEXT: [[DOTELEM014:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I14]], 0
; NOLOWER-NEXT: [[DOTELEM015:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I15]], 0
; NOLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1
; NOLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1
; NOLOWER-NEXT: [[DOTELEM117:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1
; NOLOWER-NEXT: [[DOTELEM118:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I3]], 1
; NOLOWER-NEXT: [[DOTELEM119:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I4]], 1
; NOLOWER-NEXT: [[DOTELEM120:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I5]], 1
; NOLOWER-NEXT: [[DOTELEM121:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I6]], 1
; NOLOWER-NEXT: [[DOTELEM122:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I7]], 1
; NOLOWER-NEXT: [[DOTELEM123:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I8]], 1
; NOLOWER-NEXT: [[DOTELEM124:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I9]], 1
; NOLOWER-NEXT: [[DOTELEM125:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I10]], 1
; NOLOWER-NEXT: [[DOTELEM126:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I11]], 1
; NOLOWER-NEXT: [[DOTELEM127:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I12]], 1
; NOLOWER-NEXT: [[DOTELEM128:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I13]], 1
; NOLOWER-NEXT: [[DOTELEM129:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I14]], 1
; NOLOWER-NEXT: [[DOTELEM130:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I15]], 1
; NOLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; NOLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM116]]
; NOLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM117]]
; NOLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM118]]
; NOLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM119]]
; NOLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM120]]
; NOLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM121]]
; NOLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM122]]
; NOLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM123]]
; NOLOWER-NEXT: [[DOTI9:%.*]] = add i32 [[DOTELEM09]], [[DOTELEM124]]
; NOLOWER-NEXT: [[DOTI10:%.*]] = add i32 [[DOTELEM010]], [[DOTELEM125]]
; NOLOWER-NEXT: [[DOTI11:%.*]] = add i32 [[DOTELEM011]], [[DOTELEM126]]
; NOLOWER-NEXT: [[DOTI12:%.*]] = add i32 [[DOTELEM012]], [[DOTELEM127]]
; NOLOWER-NEXT: [[DOTI13:%.*]] = add i32 [[DOTELEM013]], [[DOTELEM128]]
; NOLOWER-NEXT: [[DOTI14:%.*]] = add i32 [[DOTELEM014]], [[DOTELEM129]]
; NOLOWER-NEXT: [[DOTI15:%.*]] = add i32 [[DOTELEM015]], [[DOTELEM130]]
; NOLOWER-NEXT: [[DOTUPTO093:%.*]] = insertelement <16 x i32> poison, i32 [[DOTI0]], i64 0
; NOLOWER-NEXT: [[DOTUPTO194:%.*]] = insertelement <16 x i32> [[DOTUPTO093]], i32 [[DOTI1]], i64 1
; NOLOWER-NEXT: [[DOTUPTO295:%.*]] = insertelement <16 x i32> [[DOTUPTO194]], i32 [[DOTI2]], i64 2
; NOLOWER-NEXT: [[DOTUPTO396:%.*]] = insertelement <16 x i32> [[DOTUPTO295]], i32 [[DOTI3]], i64 3
; NOLOWER-NEXT: [[DOTUPTO497:%.*]] = insertelement <16 x i32> [[DOTUPTO396]], i32 [[DOTI4]], i64 4
; NOLOWER-NEXT: [[DOTUPTO598:%.*]] = insertelement <16 x i32> [[DOTUPTO497]], i32 [[DOTI5]], i64 5
; NOLOWER-NEXT: [[DOTUPTO699:%.*]] = insertelement <16 x i32> [[DOTUPTO598]], i32 [[DOTI6]], i64 6
; NOLOWER-NEXT: [[DOTUPTO7100:%.*]] = insertelement <16 x i32> [[DOTUPTO699]], i32 [[DOTI7]], i64 7
; NOLOWER-NEXT: [[DOTUPTO8101:%.*]] = insertelement <16 x i32> [[DOTUPTO7100]], i32 [[DOTI8]], i64 8
; NOLOWER-NEXT: [[DOTUPTO9102:%.*]] = insertelement <16 x i32> [[DOTUPTO8101]], i32 [[DOTI9]], i64 9
; NOLOWER-NEXT: [[DOTUPTO10103:%.*]] = insertelement <16 x i32> [[DOTUPTO9102]], i32 [[DOTI10]], i64 10
; NOLOWER-NEXT: [[DOTUPTO11104:%.*]] = insertelement <16 x i32> [[DOTUPTO10103]], i32 [[DOTI11]], i64 11
; NOLOWER-NEXT: [[DOTUPTO12105:%.*]] = insertelement <16 x i32> [[DOTUPTO11104]], i32 [[DOTI12]], i64 12
; NOLOWER-NEXT: [[DOTUPTO13106:%.*]] = insertelement <16 x i32> [[DOTUPTO12105]], i32 [[DOTI13]], i64 13
; NOLOWER-NEXT: [[DOTUPTO14107:%.*]] = insertelement <16 x i32> [[DOTUPTO13106]], i32 [[DOTI14]], i64 14
; NOLOWER-NEXT: [[TMP1:%.*]] = insertelement <16 x i32> [[DOTUPTO14107]], i32 [[DOTI15]], i64 15
; NOLOWER-NEXT: ret <16 x i32> [[TMP1]]
;
; WITHLOWER-LABEL: define noundef <16 x i32> @test_mat4x4(
; WITHLOWER-SAME: <16 x double> noundef [[D:%.*]]) {
; WITHLOWER-NEXT: [[D_I0:%.*]] = extractelement <16 x double> [[D]], i64 0
; WITHLOWER-NEXT: [[HLSL_ASUINT_I0123:%.*]] = call [[DX_TYPES_SPLITDOUBLE:%.*]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I0]])
; WITHLOWER-NEXT: [[D_I1:%.*]] = extractelement <16 x double> [[D]], i64 1
; WITHLOWER-NEXT: [[HLSL_ASUINT_I1122:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I1]])
; WITHLOWER-NEXT: [[D_I2:%.*]] = extractelement <16 x double> [[D]], i64 2
; WITHLOWER-NEXT: [[HLSL_ASUINT_I2121:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I2]])
; WITHLOWER-NEXT: [[D_I3:%.*]] = extractelement <16 x double> [[D]], i64 3
; WITHLOWER-NEXT: [[HLSL_ASUINT_I3120:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I3]])
; WITHLOWER-NEXT: [[D_I4:%.*]] = extractelement <16 x double> [[D]], i64 4
; WITHLOWER-NEXT: [[HLSL_ASUINT_I4119:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I4]])
; WITHLOWER-NEXT: [[D_I5:%.*]] = extractelement <16 x double> [[D]], i64 5
; WITHLOWER-NEXT: [[HLSL_ASUINT_I5118:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I5]])
; WITHLOWER-NEXT: [[D_I6:%.*]] = extractelement <16 x double> [[D]], i64 6
; WITHLOWER-NEXT: [[HLSL_ASUINT_I6117:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I6]])
; WITHLOWER-NEXT: [[D_I7:%.*]] = extractelement <16 x double> [[D]], i64 7
; WITHLOWER-NEXT: [[HLSL_ASUINT_I7116:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I7]])
; WITHLOWER-NEXT: [[D_I8:%.*]] = extractelement <16 x double> [[D]], i64 8
; WITHLOWER-NEXT: [[HLSL_ASUINT_I8115:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I8]])
; WITHLOWER-NEXT: [[D_I9:%.*]] = extractelement <16 x double> [[D]], i64 9
; WITHLOWER-NEXT: [[HLSL_ASUINT_I9114:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I9]])
; WITHLOWER-NEXT: [[D_I10:%.*]] = extractelement <16 x double> [[D]], i64 10
; WITHLOWER-NEXT: [[HLSL_ASUINT_I10113:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I10]])
; WITHLOWER-NEXT: [[D_I11:%.*]] = extractelement <16 x double> [[D]], i64 11
; WITHLOWER-NEXT: [[HLSL_ASUINT_I11112:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I11]])
; WITHLOWER-NEXT: [[D_I12:%.*]] = extractelement <16 x double> [[D]], i64 12
; WITHLOWER-NEXT: [[HLSL_ASUINT_I12111:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I12]])
; WITHLOWER-NEXT: [[D_I13:%.*]] = extractelement <16 x double> [[D]], i64 13
; WITHLOWER-NEXT: [[HLSL_ASUINT_I13110:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I13]])
; WITHLOWER-NEXT: [[D_I14:%.*]] = extractelement <16 x double> [[D]], i64 14
; WITHLOWER-NEXT: [[HLSL_ASUINT_I14109:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I14]])
; WITHLOWER-NEXT: [[D_I15:%.*]] = extractelement <16 x double> [[D]], i64 15
; WITHLOWER-NEXT: [[HLSL_ASUINT_I15108:%.*]] = call [[DX_TYPES_SPLITDOUBLE]] @[[DX_OP_SPLITDOUBLE_F64]](i32 102, double [[D_I15]])
; WITHLOWER-NEXT: [[DOTELEM0:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I0123]], 0
; WITHLOWER-NEXT: [[DOTELEM01:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I1122]], 0
; WITHLOWER-NEXT: [[DOTELEM02:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I2121]], 0
; WITHLOWER-NEXT: [[DOTELEM03:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I3120]], 0
; WITHLOWER-NEXT: [[DOTELEM04:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I4119]], 0
; WITHLOWER-NEXT: [[DOTELEM05:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I5118]], 0
; WITHLOWER-NEXT: [[DOTELEM06:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I6117]], 0
; WITHLOWER-NEXT: [[DOTELEM07:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I7116]], 0
; WITHLOWER-NEXT: [[DOTELEM08:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I8115]], 0
; WITHLOWER-NEXT: [[DOTELEM09:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I9114]], 0
; WITHLOWER-NEXT: [[DOTELEM010:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I10113]], 0
; WITHLOWER-NEXT: [[DOTELEM011:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I11112]], 0
; WITHLOWER-NEXT: [[DOTELEM012:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I12111]], 0
; WITHLOWER-NEXT: [[DOTELEM013:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I13110]], 0
; WITHLOWER-NEXT: [[DOTELEM014:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I14109]], 0
; WITHLOWER-NEXT: [[DOTELEM015:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I15108]], 0
; WITHLOWER-NEXT: [[DOTELEM1:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I0123]], 1
; WITHLOWER-NEXT: [[DOTELEM116:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I1122]], 1
; WITHLOWER-NEXT: [[DOTELEM117:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I2121]], 1
; WITHLOWER-NEXT: [[DOTELEM118:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I3120]], 1
; WITHLOWER-NEXT: [[DOTELEM119:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I4119]], 1
; WITHLOWER-NEXT: [[DOTELEM120:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I5118]], 1
; WITHLOWER-NEXT: [[DOTELEM121:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I6117]], 1
; WITHLOWER-NEXT: [[DOTELEM122:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I7116]], 1
; WITHLOWER-NEXT: [[DOTELEM123:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I8115]], 1
; WITHLOWER-NEXT: [[DOTELEM124:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I9114]], 1
; WITHLOWER-NEXT: [[DOTELEM125:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I10113]], 1
; WITHLOWER-NEXT: [[DOTELEM126:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I11112]], 1
; WITHLOWER-NEXT: [[DOTELEM127:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I12111]], 1
; WITHLOWER-NEXT: [[DOTELEM128:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I13110]], 1
; WITHLOWER-NEXT: [[DOTELEM129:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I14109]], 1
; WITHLOWER-NEXT: [[DOTELEM130:%.*]] = extractvalue [[DX_TYPES_SPLITDOUBLE]] [[HLSL_ASUINT_I15108]], 1
; WITHLOWER-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
; WITHLOWER-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM116]]
; WITHLOWER-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM117]]
; WITHLOWER-NEXT: [[DOTI3:%.*]] = add i32 [[DOTELEM03]], [[DOTELEM118]]
; WITHLOWER-NEXT: [[DOTI4:%.*]] = add i32 [[DOTELEM04]], [[DOTELEM119]]
; WITHLOWER-NEXT: [[DOTI5:%.*]] = add i32 [[DOTELEM05]], [[DOTELEM120]]
; WITHLOWER-NEXT: [[DOTI6:%.*]] = add i32 [[DOTELEM06]], [[DOTELEM121]]
; WITHLOWER-NEXT: [[DOTI7:%.*]] = add i32 [[DOTELEM07]], [[DOTELEM122]]
; WITHLOWER-NEXT: [[DOTI8:%.*]] = add i32 [[DOTELEM08]], [[DOTELEM123]]
; WITHLOWER-NEXT: [[DOTI9:%.*]] = add i32 [[DOTELEM09]], [[DOTELEM124]]
; WITHLOWER-NEXT: [[DOTI10:%.*]] = add i32 [[DOTELEM010]], [[DOTELEM125]]
; WITHLOWER-NEXT: [[DOTI11:%.*]] = add i32 [[DOTELEM011]], [[DOTELEM126]]
; WITHLOWER-NEXT: [[DOTI12:%.*]] = add i32 [[DOTELEM012]], [[DOTELEM127]]
; WITHLOWER-NEXT: [[DOTI13:%.*]] = add i32 [[DOTELEM013]], [[DOTELEM128]]
; WITHLOWER-NEXT: [[DOTI14:%.*]] = add i32 [[DOTELEM014]], [[DOTELEM129]]
; WITHLOWER-NEXT: [[DOTI15:%.*]] = add i32 [[DOTELEM015]], [[DOTELEM130]]
; WITHLOWER-NEXT: [[DOTUPTO093:%.*]] = insertelement <16 x i32> poison, i32 [[DOTI0]], i64 0
; WITHLOWER-NEXT: [[DOTUPTO194:%.*]] = insertelement <16 x i32> [[DOTUPTO093]], i32 [[DOTI1]], i64 1
; WITHLOWER-NEXT: [[DOTUPTO295:%.*]] = insertelement <16 x i32> [[DOTUPTO194]], i32 [[DOTI2]], i64 2
; WITHLOWER-NEXT: [[DOTUPTO396:%.*]] = insertelement <16 x i32> [[DOTUPTO295]], i32 [[DOTI3]], i64 3
; WITHLOWER-NEXT: [[DOTUPTO497:%.*]] = insertelement <16 x i32> [[DOTUPTO396]], i32 [[DOTI4]], i64 4
; WITHLOWER-NEXT: [[DOTUPTO598:%.*]] = insertelement <16 x i32> [[DOTUPTO497]], i32 [[DOTI5]], i64 5
; WITHLOWER-NEXT: [[DOTUPTO699:%.*]] = insertelement <16 x i32> [[DOTUPTO598]], i32 [[DOTI6]], i64 6
; WITHLOWER-NEXT: [[DOTUPTO7100:%.*]] = insertelement <16 x i32> [[DOTUPTO699]], i32 [[DOTI7]], i64 7
; WITHLOWER-NEXT: [[DOTUPTO8101:%.*]] = insertelement <16 x i32> [[DOTUPTO7100]], i32 [[DOTI8]], i64 8
; WITHLOWER-NEXT: [[DOTUPTO9102:%.*]] = insertelement <16 x i32> [[DOTUPTO8101]], i32 [[DOTI9]], i64 9
; WITHLOWER-NEXT: [[DOTUPTO10103:%.*]] = insertelement <16 x i32> [[DOTUPTO9102]], i32 [[DOTI10]], i64 10
; WITHLOWER-NEXT: [[DOTUPTO11104:%.*]] = insertelement <16 x i32> [[DOTUPTO10103]], i32 [[DOTI11]], i64 11
; WITHLOWER-NEXT: [[DOTUPTO12105:%.*]] = insertelement <16 x i32> [[DOTUPTO11104]], i32 [[DOTI12]], i64 12
; WITHLOWER-NEXT: [[DOTUPTO13106:%.*]] = insertelement <16 x i32> [[DOTUPTO12105]], i32 [[DOTI13]], i64 13
; WITHLOWER-NEXT: [[DOTUPTO14107:%.*]] = insertelement <16 x i32> [[DOTUPTO13106]], i32 [[DOTI14]], i64 14
; WITHLOWER-NEXT: [[TMP1:%.*]] = insertelement <16 x i32> [[DOTUPTO14107]], i32 [[DOTI15]], i64 15
; WITHLOWER-NEXT: ret <16 x i32> [[TMP1]]
;
%hlsl.asuint = call { <16 x i32>, <16 x i32> } @llvm.dx.splitdouble.v16i32(<16 x double> %d)
%1 = extractvalue { <16 x i32>, <16 x i32> } %hlsl.asuint, 0
%2 = extractvalue { <16 x i32>, <16 x i32> } %hlsl.asuint, 1
%3 = add <16 x i32> %1, %2
ret <16 x i32> %3
}
; WITHLOWER: declare %dx.types.splitdouble @dx.op.splitDouble.f64(i32, double) #[[#ATTR0:]]
; WITHLOWER: attributes #[[#ATTR0]] = { nounwind memory(none) }
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; CHECK: {{.*}}