brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 7eb47ba Raw
183 lines · plain
1; RUN: opt -S -passes='dxil-legalize' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s2 3define i32 @removal_only_test(i32 %a) {4  ; CHECK-LABEL: define i32 @removal_only_test(5  ; CHECK-SAME: i32 [[A:%.*]]) {6  ; CHECK: ret i32 [[A]]7  %1 = trunc nsw i32 %a to i88  %3 = sext i8 %1 to i329  ret i32 %310}11 12define i32 @i8trunc(float %0) #0 {13  ; CHECK-LABEL: define i32 @i8trunc(14  ; CHECK-NOT: %4 = trunc nsw i32 %3 to i815  ; CHECK: add nsw i3216  ; CHECK-NEXT: srem i3217  ; CHECK-NEXT: sub i3218  ; CHECK-NEXT: mul i3219  ; CHECK-NEXT: udiv i3220  ; CHECK-NEXT: sdiv i3221  ; CHECK-NEXT: urem i3222  ; CHECK-NEXT: and i3223  ; CHECK-NEXT: or i3224  ; CHECK-NEXT: xor i3225  ; CHECK-NEXT: shl i3226  ; CHECK-NEXT: lshr i3227  ; CHECK-NEXT: ashr i3228  ; CHECK-NOT: %7 = sext i8 %6 to i3229  30  %2 = fptosi float %0 to i3231  %3 = srem i32 %2, 832  %4 = trunc nsw i32 %3 to i833  %5 = add nsw i8 %4, 134  %6 = srem i8 %5, 835  %7 = sub i8 %6, 136  %8 = mul i8 %7, 137  %9 = udiv i8 %8, 138  %10 = sdiv i8 %9, 139  %11 = urem i8 %10, 140  %12 = and i8 %11, 141  %13 = or i8 %12, 142  %14 = xor i8 %13, 143  %15 = shl i8 %14, 144  %16 = lshr i8 %15, 145  %17 = ashr i8 %16, 146  %18 = sext i8 %17 to i3247  ret i32 %1848}49 50define i32 @cast_removal_test(i32 %a) {51  ; CHECK-LABEL: define i32 @cast_removal_test(52  ; CHECK-SAME: i32 [[A:%.*]]) {53  ; CHECK-NOT: trunc54  ; CHECK-NOT: zext i855  ; CHECK-NOT: sext i856  ; CHECK: add i32 [[A]], [[A]]57  %1 = trunc nsw i32 %a to i858  %2 = zext i8 %1 to i3259  %3 = sext i8 %1 to i3260  %4 = add i32 %2, %361  ret i32 %462}63 64define i1 @trunc_cmp_test(i32 %a, i32 %b) {65  ; CHECK-LABEL: define i1 @trunc_cmp_test(66  ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {67  ; CHECK: icmp slt i32 [[A]], [[B]]68  ; CHECK: icmp sgt i32 [[A]], [[B]]69  %1 = trunc nsw i32 %a to i870  %2 = trunc nsw i32 %b to i871  %3 = icmp slt i8 %1, %272  %4 = icmp sgt i8 %1, %273  %5 = and i1 %3, %474  ret i1 %575}76 77define i32 @first_operand_imm_test(i32 %a) {78  ; CHECK-LABEL: define i32 @first_operand_imm_test(79  ; CHECK-SAME: i32 [[A:%.*]]) {80  ; CHECK-NOT: trunc81  ; CHECK: sub i32 0, [[A]]82  ; CHECK-NOT: sext i883  %1 = trunc nsw i32 %a to i884  %2 = sub i8 0, %185  %3 = sext i8 %2 to i3286  ret i32 %387}88 89define i16 @i16_test(i16 %a) {90  ; CHECK-LABEL: define i16 @i16_test(91  ; CHECK-SAME: i16 [[A:%.*]]) {92  ; CHECK-NOT: trunc93  ; CHECK: sub i16 0, [[A]]94  ; CHECK-NOT: sext i895  %1 = trunc nsw i16 %a to i896  %2 = sub i8 0, %197  %3 = sext i8 %2 to i1698  ret i16 %399}100 101define i32 @all_imm() {102  ; CHECK-LABEL: define i32 @all_imm(103  ; CHECK-NOT: sext i8104  ; CHECK: ret i32 -1105  %1 = sub i8 0, 1106  %2 = sext i8 %1 to i32107  ret i32 %2108}109 110define i32 @scalar_i8_geps() {111  ; CHECK-LABEL: define i32 @scalar_i8_geps(112  ; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca i32, align 4113  ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw [1 x i32], ptr [[ALLOCA]], i32 0, i32 0114  ; CHECK:         [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4115  ; CHECK-NEXT:    ret i32 [[LOAD]]116    %1 = alloca i8, align 4117    %2 = getelementptr inbounds nuw i8, ptr %1, i32 0118    %3 = load i8, ptr %2119    %4 = sext i8 %3 to i32120    ret i32 %4121}122 123define i32 @i8_geps_index0() {124  ; CHECK-LABEL: define i32 @i8_geps_index0(125  ; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca [2 x i32], align 8126  ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw [2 x i32], ptr [[ALLOCA]], i32 0, i32 0127  ; CHECK:         [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4128  ; CHECK-NEXT:    ret i32 [[LOAD]]129  %1 = alloca [2 x i32], align 8130  %2 = load i8, ptr %1131  %3 = sext i8 %2 to i32132  ret i32 %3133}134 135define i32 @i8_geps_index1() {136  ; CHECK-LABEL: define i32 @i8_geps_index1(137  ; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca [2 x i32], align 8138  ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw [2 x i32], ptr [[ALLOCA]], i32 0, i32 1139  ; CHECK:         [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4140  ; CHECK-NEXT:    ret i32 [[LOAD]]141  %1 = alloca [2 x i32], align 8142  %2 = getelementptr inbounds nuw i8, ptr %1, i32 4143  %3 = load i8, ptr %2144  %4 = sext i8 %3 to i32145  ret i32 %4146}147 148define i32 @i8_gep_store() {149  ; CHECK-LABEL: define i32 @i8_gep_store(150  ; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca [2 x i32], align 8151  ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw [2 x i32], ptr [[ALLOCA]], i32 0, i32 0152  ; CHECK-NEXT:    store i32 0, ptr [[GEP]], align 4153  ; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw [2 x i32], ptr [[ALLOCA]], i32 0, i32 1154  ; CHECK-NEXT:    store i32 1, ptr [[GEP]], align 4155  ; CHECK:         [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4156  ; CHECK-NEXT:    ret i32 [[LOAD]]157  %1 = alloca [2 x i32], align 8158  store i8 0, ptr %1159  %2 = getelementptr inbounds nuw i8, ptr %1, i32 4160  store i8 1, ptr %2161  %3 = load i8, ptr %2162  %4 = sext i8 %3 to i32163  ret i32 %4164}165 166@g = local_unnamed_addr addrspace(3) global [2 x float] zeroinitializer, align 4167define float @i8_gep_global_index() {168  ; CHECK-LABEL: define float @i8_gep_global_index(169  ; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(3) getelementptr inbounds nuw ([2 x float], ptr addrspace(3) @g, i32 0, i32 1), align 4170  ; CHECK-NEXT:    ret float [[LOAD]]171  %1 = getelementptr inbounds nuw i8, ptr addrspace(3) @g, i32 4172  %2 = load float, ptr addrspace(3) %1, align 4173  ret float %2174}175 176define float @i8_gep_global_constexpr() {177  ; CHECK-LABEL: define float @i8_gep_global_constexpr(178  ; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(3) getelementptr inbounds nuw ([2 x float], ptr addrspace(3) @g, i32 0, i32 1), align 4179  ; CHECK-NEXT: ret float [[LOAD]]180  %1 = load float, ptr addrspace(3) getelementptr inbounds nuw (i8, ptr addrspace(3) @g, i32 4), align 4181  ret float %1182}183