110 lines · plain
1; RUN: opt -S -passes='dxil-data-scalarization' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=SCHECK,CHECK2; RUN: opt -S -passes='dxil-data-scalarization,dxil-flatten-arrays' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefixes=FCHECK,CHECK3 4; CHECK-LABEL: alloca_2d__vec_test5define void @alloca_2d__vec_test() {6 ; SCHECK: alloca [2 x [4 x i32]], align 167 ; FCHECK: alloca [8 x i32], align 168 ; CHECK: ret void9 %1 = alloca [2 x <4 x i32>], align 1610 ret void11}12 13; CHECK-LABEL: alloca_4d__vec_test14define void @alloca_4d__vec_test() {15 ; SCHECK: alloca [2 x [2 x [2 x [2 x i32]]]], align 1616 ; FCHECK: alloca [16 x i32], align 1617 ; CHECK: ret void18 %1 = alloca [2 x [2 x [2 x <2 x i32>]]], align 1619 ret void20}21 22; CHECK-LABEL: alloca_vec_test23define void @alloca_vec_test() {24 ; CHECK: alloca [4 x i32], align 1625 ; CHECK: ret void26 %1 = alloca <4 x i32>, align 1627 ret void28}29 30; CHECK-LABEL: alloca_2d_gep_test31define void @alloca_2d_gep_test() {32 ; SCHECK: [[alloca_val:%.*]] = alloca [2 x [2 x i32]], align 1633 ; FCHECK: [[alloca_val:%.*]] = alloca [4 x i32], align 1634 ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)35 ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [2 x [2 x i32]], ptr [[alloca_val]], i32 0, i32 [[tid]]36 ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 237 ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]]38 ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [4 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]]39 ; CHECK: ret void40 %1 = alloca [2 x <2 x i32>], align 1641 %2 = tail call i32 @llvm.dx.thread.id(i32 0)42 %3 = getelementptr inbounds nuw [2 x <2 x i32>], ptr %1, i32 0, i32 %243 ret void44}45 46; CHECK-LABEL: subtype_array_test47define void @subtype_array_test() {48 ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 449 ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 450 ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)51 ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [4 x i32], ptr [[alloca_val]], i32 [[tid]]52 ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 453 ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]]54 ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]]55 ; CHECK: ret void56 %arr = alloca [8 x [4 x i32]], align 457 %i = tail call i32 @llvm.dx.thread.id(i32 0)58 %gep = getelementptr inbounds nuw [4 x i32], ptr %arr, i32 %i59 ret void60}61 62; CHECK-LABEL: subtype_vector_test63define void @subtype_vector_test() {64 ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 465 ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 466 ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)67 ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw [4 x i32], ptr [[alloca_val]], i32 [[tid]]68 ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 469 ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]]70 ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]]71 ; CHECK: ret void72 %arr = alloca [8 x <4 x i32>], align 473 %i = tail call i32 @llvm.dx.thread.id(i32 0)74 %gep = getelementptr inbounds nuw <4 x i32>, ptr %arr, i32 %i75 ret void76}77 78; CHECK-LABEL: subtype_scalar_test79define void @subtype_scalar_test() {80 ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 481 ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 482 ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)83 ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw i32, ptr [[alloca_val]], i32 [[tid]]84 ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 185 ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_mul]]86 ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]]87 ; CHECK: ret void88 %arr = alloca [8 x [4 x i32]], align 489 %i = tail call i32 @llvm.dx.thread.id(i32 0)90 %gep = getelementptr inbounds nuw i32, ptr %arr, i32 %i91 ret void92}93 94; CHECK-LABEL: subtype_i8_test95define void @subtype_i8_test() {96 ; SCHECK: [[alloca_val:%.*]] = alloca [8 x [4 x i32]], align 497 ; FCHECK: [[alloca_val:%.*]] = alloca [32 x i32], align 498 ; CHECK: [[tid:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)99 ; SCHECK: [[gep:%.*]] = getelementptr inbounds nuw i8, ptr [[alloca_val]], i32 [[tid]]100 ; FCHECK: [[flatidx_mul:%.*]] = mul i32 [[tid]], 1101 ; FCHECK: [[flatidx_lshr:%.*]] = lshr i32 [[flatidx_mul]], 2102 ; FCHECK: [[flatidx:%.*]] = add i32 0, [[flatidx_lshr]]103 ; FCHECK: [[gep:%.*]] = getelementptr inbounds nuw [32 x i32], ptr [[alloca_val]], i32 0, i32 [[flatidx]]104 ; CHECK: ret void105 %arr = alloca [8 x [4 x i32]], align 4106 %i = tail call i32 @llvm.dx.thread.id(i32 0)107 %gep = getelementptr inbounds nuw i8, ptr %arr, i32 %i108 ret void109}110