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