158 lines · plain
1; RUN: opt -S -scalarizer -dxil-op-lower < %s | FileCheck %s2 3; Make sure dxil operation function calls for round are generated for float and half.4 5target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64"6target triple = "dxil-pc-shadermodel6.7-library"7; Function Attrs: noinline nounwind optnone8define noundef i16 @umad_ushort(i16 noundef %p0, i16 noundef %p1, i16 noundef %p2) #0 {9entry:10 ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR:]]11 %p2.addr = alloca i16, align 212 %p1.addr = alloca i16, align 213 %p0.addr = alloca i16, align 214 store i16 %p2, ptr %p2.addr, align 215 store i16 %p1, ptr %p1.addr, align 216 store i16 %p0, ptr %p0.addr, align 217 %0 = load i16, ptr %p0.addr, align 218 %1 = load i16, ptr %p1.addr, align 219 %2 = load i16, ptr %p2.addr, align 220 %dx.umad = call i16 @llvm.dx.umad.i16(i16 %0, i16 %1, i16 %2)21 ret i16 %dx.umad22}23 24; Function Attrs: nocallback nofree nosync nounwind willreturn25declare i16 @llvm.dx.umad.i16(i16, i16, i16) #126 27; Function Attrs: noinline nounwind optnone28define noundef i32 @umad_uint(i32 noundef %p0, i32 noundef %p1, i32 noundef %p2) #0 {29entry:30 ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]31 %p2.addr = alloca i32, align 432 %p1.addr = alloca i32, align 433 %p0.addr = alloca i32, align 434 store i32 %p2, ptr %p2.addr, align 435 store i32 %p1, ptr %p1.addr, align 436 store i32 %p0, ptr %p0.addr, align 437 %0 = load i32, ptr %p0.addr, align 438 %1 = load i32, ptr %p1.addr, align 439 %2 = load i32, ptr %p2.addr, align 440 %dx.umad = call i32 @llvm.dx.umad.i32(i32 %0, i32 %1, i32 %2)41 ret i32 %dx.umad42}43 44; Function Attrs: nocallback nofree nosync nounwind willreturn45declare i32 @llvm.dx.umad.i32(i32, i32, i32) #146 47; Function Attrs: noinline nounwind optnone48define noundef i64 @umad_uint64(i64 noundef %p0, i64 noundef %p1, i64 noundef %p2) #0 {49entry:50 ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]51 %p2.addr = alloca i64, align 852 %p1.addr = alloca i64, align 853 %p0.addr = alloca i64, align 854 store i64 %p2, ptr %p2.addr, align 855 store i64 %p1, ptr %p1.addr, align 856 store i64 %p0, ptr %p0.addr, align 857 %0 = load i64, ptr %p0.addr, align 858 %1 = load i64, ptr %p1.addr, align 859 %2 = load i64, ptr %p2.addr, align 860 %dx.umad = call i64 @llvm.dx.umad.i64(i64 %0, i64 %1, i64 %2)61 ret i64 %dx.umad62}63 64; Function Attrs: nocallback nofree nosync nounwind willreturn65declare i64 @llvm.dx.umad.i64(i64, i64, i64) #166 67; Function Attrs: noinline nounwind optnone68define noundef <4 x i16> @umad_uint16_t4(<4 x i16> noundef %p0, <4 x i16> noundef %p1, <4 x i16> noundef %p2) #0 {69entry:70 ; CHECK: extractelement <4 x i16> %p0, i64 071 ; CHECK: extractelement <4 x i16> %p1, i64 072 ; CHECK: extractelement <4 x i16> %p2, i64 073 ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]74 ; CHECK: extractelement <4 x i16> %p0, i64 175 ; CHECK: extractelement <4 x i16> %p1, i64 176 ; CHECK: extractelement <4 x i16> %p2, i64 177 ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]78 ; CHECK: extractelement <4 x i16> %p0, i64 279 ; CHECK: extractelement <4 x i16> %p1, i64 280 ; CHECK: extractelement <4 x i16> %p2, i64 281 ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]82 ; CHECK: extractelement <4 x i16> %p0, i64 383 ; CHECK: extractelement <4 x i16> %p1, i64 384 ; CHECK: extractelement <4 x i16> %p2, i64 385 ; CHECK: call i16 @dx.op.tertiary.i16(i32 49, i16 %{{.*}}, i16 %{{.*}}, i16 %{{.*}}) #[[#ATTR]]86 ; CHECK: insertelement <4 x i16> poison, i16 %{{.*}}, i64 087 ; CHECK: insertelement <4 x i16> %{{.*}}, i16 %{{.*}}, i64 188 ; CHECK: insertelement <4 x i16> %{{.*}}, i16 %{{.*}}, i64 289 ; CHECK: insertelement <4 x i16> %{{.*}}, i16 %{{.*}}, i64 390 %dx.umad = call <4 x i16> @llvm.dx.umad.v4i16(<4 x i16> %p0, <4 x i16> %p1, <4 x i16> %p2)91 ret <4 x i16> %dx.umad92}93 94; Function Attrs: nocallback nofree nosync nounwind willreturn95declare <4 x i16> @llvm.dx.umad.v4i16(<4 x i16>, <4 x i16>, <4 x i16>) #196 97; Function Attrs: noinline nounwind optnone98define noundef <4 x i32> @umad_uint4(<4 x i32> noundef %p0, <4 x i32> noundef %p1, <4 x i32> noundef %p2) #0 {99entry:100 ; CHECK: extractelement <4 x i32> %p0, i64 0101 ; CHECK: extractelement <4 x i32> %p1, i64 0102 ; CHECK: extractelement <4 x i32> %p2, i64 0103 ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]104 ; CHECK: extractelement <4 x i32> %p0, i64 1105 ; CHECK: extractelement <4 x i32> %p1, i64 1106 ; CHECK: extractelement <4 x i32> %p2, i64 1107 ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]108 ; CHECK: extractelement <4 x i32> %p0, i64 2109 ; CHECK: extractelement <4 x i32> %p1, i64 2110 ; CHECK: extractelement <4 x i32> %p2, i64 2111 ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]112 ; CHECK: extractelement <4 x i32> %p0, i64 3113 ; CHECK: extractelement <4 x i32> %p1, i64 3114 ; CHECK: extractelement <4 x i32> %p2, i64 3115 ; CHECK: call i32 @dx.op.tertiary.i32(i32 49, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) #[[#ATTR]]116 ; CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i64 0117 ; CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i64 1118 ; CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i64 2119 ; CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i64 3120 %dx.umad = call <4 x i32> @llvm.dx.umad.v4i32(<4 x i32> %p0, <4 x i32> %p1, <4 x i32> %p2)121 ret <4 x i32> %dx.umad122}123 124; Function Attrs: nocallback nofree nosync nounwind willreturn125declare <4 x i32> @llvm.dx.umad.v4i32(<4 x i32>, <4 x i32>, <4 x i32>) #1126 127; Function Attrs: noinline nounwind optnone128define noundef <4 x i64> @umad_uint64_t4(<4 x i64> noundef %p0, <4 x i64> noundef %p1, <4 x i64> noundef %p2) #0 {129entry:130 ; CHECK: extractelement <4 x i64> %p0, i64 0131 ; CHECK: extractelement <4 x i64> %p1, i64 0132 ; CHECK: extractelement <4 x i64> %p2, i64 0133 ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]134 ; CHECK: extractelement <4 x i64> %p0, i64 1135 ; CHECK: extractelement <4 x i64> %p1, i64 1136 ; CHECK: extractelement <4 x i64> %p2, i64 1137 ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]138 ; CHECK: extractelement <4 x i64> %p0, i64 2139 ; CHECK: extractelement <4 x i64> %p1, i64 2140 ; CHECK: extractelement <4 x i64> %p2, i64 2141 ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]142 ; CHECK: extractelement <4 x i64> %p0, i64 3143 ; CHECK: extractelement <4 x i64> %p1, i64 3144 ; CHECK: extractelement <4 x i64> %p2, i64 3145 ; CHECK: call i64 @dx.op.tertiary.i64(i32 49, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}) #[[#ATTR]]146 ; CHECK: insertelement <4 x i64> poison, i64 %{{.*}}, i64 0147 ; CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i64 1148 ; CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i64 2149 ; CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i64 3150 %dx.umad = call <4 x i64> @llvm.dx.umad.v4i64(<4 x i64> %p0, <4 x i64> %p1, <4 x i64> %p2)151 ret <4 x i64> %dx.umad152}153 154; Function Attrs: nocallback nofree nosync nounwind willreturn155declare <4 x i64> @llvm.dx.umad.v4i64(<4 x i64>, <4 x i64>, <4 x i64>) #1156 157; CHECK: attributes #[[#ATTR]] = {{{.*}} memory(none) {{.*}}}158