93 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt < %s -passes=infer-alignment -S | FileCheck %s3 4target datalayout = "p1:64:64:64:32"5 6; ------------------------------------------------------------------------------7; load instructions8; ------------------------------------------------------------------------------9 10define void @load(ptr align 1 %ptr) {11; CHECK-LABEL: define void @load12; CHECK-SAME: (ptr align 1 [[PTR:%.*]]) {13; CHECK-NEXT: [[ALIGNED_0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -2)14; CHECK-NEXT: [[ALIGNED_1:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -4)15; CHECK-NEXT: [[ALIGNED_2:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -8)16; CHECK-NEXT: [[LOAD_0:%.*]] = load <16 x i8>, ptr [[ALIGNED_0]], align 217; CHECK-NEXT: [[LOAD_1:%.*]] = load <16 x i8>, ptr [[ALIGNED_1]], align 418; CHECK-NEXT: [[LOAD_2:%.*]] = load <16 x i8>, ptr [[ALIGNED_2]], align 819; CHECK-NEXT: ret void20;21 %aligned.0 = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -2)22 %aligned.1 = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -4)23 %aligned.2 = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -8)24 25 %load.0 = load <16 x i8>, ptr %aligned.0, align 126 %load.1 = load <16 x i8>, ptr %aligned.1, align 127 %load.2 = load <16 x i8>, ptr %aligned.2, align 128 29 ret void30}31 32; ------------------------------------------------------------------------------33; store instructions34; ------------------------------------------------------------------------------35 36define void @store(ptr align 1 %ptr) {37; CHECK-LABEL: define void @store38; CHECK-SAME: (ptr align 1 [[PTR:%.*]]) {39; CHECK-NEXT: [[ALIGNED_0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -2)40; CHECK-NEXT: [[ALIGNED_1:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -4)41; CHECK-NEXT: [[ALIGNED_2:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -8)42; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr [[ALIGNED_0]], align 243; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr [[ALIGNED_1]], align 444; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr [[ALIGNED_2]], align 845; CHECK-NEXT: ret void46;47 %aligned.0 = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -2)48 %aligned.1 = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -4)49 %aligned.2 = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -8)50 51 store <16 x i8> zeroinitializer, ptr %aligned.0, align 152 store <16 x i8> zeroinitializer, ptr %aligned.1, align 153 store <16 x i8> zeroinitializer, ptr %aligned.2, align 154 55 ret void56}57 58; ------------------------------------------------------------------------------59; Overaligned pointer60; ------------------------------------------------------------------------------61 62; Underlying alignment greater than alignment forced by ptrmask63define void @ptrmask_overaligned(ptr align 16 %ptr) {64; CHECK-LABEL: define void @ptrmask_overaligned65; CHECK-SAME: (ptr align 16 [[PTR:%.*]]) {66; CHECK-NEXT: [[ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -8)67; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ALIGNED]], align 1668; CHECK-NEXT: store <16 x i8> zeroinitializer, ptr [[ALIGNED]], align 1669; CHECK-NEXT: ret void70;71 %aligned = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -8)72 73 %load = load <16 x i8>, ptr %aligned, align 174 store <16 x i8> zeroinitializer, ptr %aligned, align 175 76 ret void77}78 79define i8 @smaller_index_type(ptr addrspace(1) %ptr) {80; CHECK-LABEL: define i8 @smaller_index_type81; CHECK-SAME: (ptr addrspace(1) [[PTR:%.*]]) {82; CHECK-NEXT: [[PTR2:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR]], i32 -4)83; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(1) [[PTR2]], align 484; CHECK-NEXT: ret i8 [[LOAD]]85;86 %ptr2 = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %ptr, i32 -4)87 %load = load i8, ptr addrspace(1) %ptr2, align 188 ret i8 %load89}90 91declare ptr @llvm.ptrmask.p0.i64(ptr, i64)92declare ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1), i32)93