207 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=attributor -S < %s | FileCheck %s3 4define ptr @align_ptrmask_back_no_prop(ptr align 2 %x, i1 %cmp1, i1 %cmp2) {5; CHECK-LABEL: define noundef nonnull align 8 dereferenceable(4) ptr @align_ptrmask_back_no_prop(6; CHECK-SAME: ptr nofree writeonly align 2 [[X:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR0:[0-9]+]] {7; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i64 -32, i64 -88; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i64 [[SEL]], i64 -169; CHECK-NEXT: [[P:%.*]] = tail call noundef nonnull align 8 dereferenceable(4) ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef [[SEL1]]) #[[ATTR4:[0-9]+]]10; CHECK-NEXT: store float 1.000000e+00, ptr [[P]], align 811; CHECK-NEXT: ret ptr [[P]]12;13 %sel = select i1 %cmp1, i64 -32, i64 -814 %sel1 = select i1 %cmp2, i64 %sel, i64 -1615 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 %sel1)16 store float 1.0, ptr %p, align 817 ret ptr %p18}19 20define ptr @align_ptrmask_back_prop(ptr align 2 %x, i1 %cmp1, i1 %cmp2) {21; CHECK-LABEL: define noundef nonnull align 16 dereferenceable(4) ptr @align_ptrmask_back_prop(22; CHECK-SAME: ptr nofree writeonly align 16 [[X:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR0]] {23; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i64 -32, i64 -824; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i64 [[SEL]], i64 -1625; CHECK-NEXT: [[P:%.*]] = tail call noundef nonnull align 16 dereferenceable(4) ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef [[SEL1]]) #[[ATTR4]]26; CHECK-NEXT: store float 1.000000e+00, ptr [[P]], align 1627; CHECK-NEXT: ret ptr [[P]]28;29 %sel = select i1 %cmp1, i64 -32, i64 -830 %sel1 = select i1 %cmp2, i64 %sel, i64 -1631 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 %sel1)32 store float 1.0, ptr %p, align 1633 ret ptr %p34}35 36define ptr @align_ptrmask_forward_mask(ptr align 2 %x, i1 %cmp1, i1 %cmp2) {37; CHECK-LABEL: define align 8 ptr @align_ptrmask_forward_mask(38; CHECK-SAME: ptr nofree readnone align 2 [[X:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1:[0-9]+]] {39; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i64 -32, i64 -840; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i64 [[SEL]], i64 -1641; CHECK-NEXT: [[P:%.*]] = tail call align 8 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef [[SEL1]]) #[[ATTR4]]42; CHECK-NEXT: ret ptr [[P]]43;44 %sel = select i1 %cmp1, i64 -32, i64 -845 %sel1 = select i1 %cmp2, i64 %sel, i64 -1646 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 %sel1)47 ret ptr %p48}49 50define ptr @align_ptrmask_forward_ptr(ptr align 16 %x, i1 %cmp1, i1 %cmp2) {51; CHECK-LABEL: define align 16 ptr @align_ptrmask_forward_ptr(52; CHECK-SAME: ptr nofree readnone align 16 [[X:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {53; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i64 -32, i64 -854; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i64 [[SEL]], i64 -1655; CHECK-NEXT: [[P:%.*]] = tail call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef [[SEL1]]) #[[ATTR4]]56; CHECK-NEXT: ret ptr [[P]]57;58 %sel = select i1 %cmp1, i64 -32, i64 -859 %sel1 = select i1 %cmp2, i64 %sel, i64 -1660 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 %sel1)61 ret ptr %p62}63 64define ptr @align_ptrmask_forward_nonconst_mask(ptr align 8 %x, i64 %y, i1 %cmp1, i1 %cmp2) {65; CHECK-LABEL: define align 8 ptr @align_ptrmask_forward_nonconst_mask(66; CHECK-SAME: ptr nofree readnone align 8 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {67; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i64 -32, i64 [[Y]]68; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i64 [[SEL]], i64 -1669; CHECK-NEXT: [[P:%.*]] = tail call align 8 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 [[SEL1]]) #[[ATTR4]]70; CHECK-NEXT: ret ptr [[P]]71;72 %sel = select i1 %cmp1, i64 -32, i64 %y73 %sel1 = select i1 %cmp2, i64 %sel, i64 -1674 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 %sel1)75 ret ptr %p76}77 78define ptr @align_ptrmask_back_nonconst_mask(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {79; CHECK-LABEL: define noundef nonnull align 8 dereferenceable(4) ptr @align_ptrmask_back_nonconst_mask(80; CHECK-SAME: ptr nofree writeonly align 8 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR0]] {81; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i64 -32, i64 [[Y]]82; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i64 [[SEL]], i64 -1683; CHECK-NEXT: [[P:%.*]] = tail call noundef nonnull align 8 dereferenceable(4) ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 [[SEL1]]) #[[ATTR4]]84; CHECK-NEXT: store float 1.000000e+00, ptr [[P]], align 885; CHECK-NEXT: ret ptr [[P]]86;87 %sel = select i1 %cmp1, i64 -32, i64 %y88 %sel1 = select i1 %cmp2, i64 %sel, i64 -1689 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 %sel1)90 store float 1.0, ptr %p, align 891 ret ptr %p92}93 94define ptr @align_ptrmask_back_const_back_noprop(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {95; CHECK-LABEL: define noundef nonnull align 8 dereferenceable(4) ptr @align_ptrmask_back_const_back_noprop(96; CHECK-SAME: ptr nofree writeonly align 4 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR0]] {97; CHECK-NEXT: [[P:%.*]] = tail call noundef nonnull align 8 dereferenceable(4) ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef -8) #[[ATTR4]]98; CHECK-NEXT: store float 1.000000e+00, ptr [[P]], align 899; CHECK-NEXT: ret ptr [[P]]100;101 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 -8)102 store float 1.0, ptr %p, align 8103 ret ptr %p104}105 106define ptr @align_ptrmask_back_const_back_prop(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {107; CHECK-LABEL: define noundef nonnull align 8 dereferenceable(4) ptr @align_ptrmask_back_const_back_prop(108; CHECK-SAME: ptr nofree writeonly align 8 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR0]] {109; CHECK-NEXT: [[P:%.*]] = tail call noundef nonnull align 8 dereferenceable(4) ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef -2) #[[ATTR4]]110; CHECK-NEXT: store float 1.000000e+00, ptr [[P]], align 8111; CHECK-NEXT: ret ptr [[P]]112;113 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 -2)114 store float 1.0, ptr %p, align 8115 ret ptr %p116}117 118define ptr @align_ptrmask_back_const_forward_mask(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {119; CHECK-LABEL: define align 8 ptr @align_ptrmask_back_const_forward_mask(120; CHECK-SAME: ptr nofree readnone align 4 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {121; CHECK-NEXT: [[P:%.*]] = tail call align 8 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef -8) #[[ATTR4]]122; CHECK-NEXT: ret ptr [[P]]123;124 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 -8)125 ret ptr %p126}127 128define ptr @align_ptrmask_back_const_forward_ptr(ptr align 16 %x, i64 %y, i1 %cmp1, i1 %cmp2) {129; CHECK-LABEL: define align 16 ptr @align_ptrmask_back_const_forward_ptr(130; CHECK-SAME: ptr nofree readnone align 16 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {131; CHECK-NEXT: [[P:%.*]] = tail call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef -8) #[[ATTR4]]132; CHECK-NEXT: ret ptr [[P]]133;134 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 -8)135 ret ptr %p136}137 138; FIXME: The store will create AAAlign for %ptr1,139; but the attribute didn't propagate through extractelement, need propagate140define <2 x ptr> @ptrmask_v2p0_v2i64(<2 x ptr> align 2 %ptr, i64 %a) {141; CHECK-LABEL: define <2 x ptr> @ptrmask_v2p0_v2i64(142; CHECK-SAME: <2 x ptr> align 2 [[PTR:%.*]], i64 [[A:%.*]]) #[[ATTR2:[0-9]+]] {143; CHECK-NEXT: [[RESULT:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[PTR]], <2 x i64> noundef splat (i64 -8)) #[[ATTR4]]144; CHECK-NEXT: [[PTR1:%.*]] = extractelement <2 x ptr> [[RESULT]], i32 0145; CHECK-NEXT: [[PTR2:%.*]] = extractelement <2 x ptr> [[RESULT]], i32 1146; CHECK-NEXT: store i64 [[A]], ptr [[PTR1]], align 16147; CHECK-NEXT: store i64 [[A]], ptr [[PTR2]], align 16148; CHECK-NEXT: ret <2 x ptr> [[RESULT]]149;150 %result = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> %ptr, <2 x i64> splat(i64 -8))151 %ptr1 = extractelement <2 x ptr> %result, i32 0152 %ptr2 = extractelement <2 x ptr> %result, i32 1153 store i64 %a, ptr %ptr1, align 16154 store i64 %a, ptr %ptr2, align 16155 ret <2 x ptr> %result156}157 158define ptr @align_ptrmask_forward_mask_positive(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {159; CHECK-LABEL: define align 4 ptr @align_ptrmask_forward_mask_positive(160; CHECK-SAME: ptr nofree readnone align 4 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {161; CHECK-NEXT: [[P:%.*]] = tail call align 4 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef 2) #[[ATTR4]]162; CHECK-NEXT: ret ptr [[P]]163;164 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 2)165 ret ptr %p166}167 168define ptr @align_ptrmask_forward_mask_poison(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {169; CHECK-LABEL: define align 4 ptr @align_ptrmask_forward_mask_poison(170; CHECK-SAME: ptr nofree readnone align 4 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {171; CHECK-NEXT: [[P:%.*]] = tail call align 4 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 poison) #[[ATTR4]]172; CHECK-NEXT: ret ptr [[P]]173;174 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 poison)175 ret ptr %p176}177 178define ptr @align_ptrmask_forward_mask_max(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {179; CHECK-LABEL: define align 4294967296 ptr @align_ptrmask_forward_mask_max(180; CHECK-SAME: ptr nofree readnone align 4 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {181; CHECK-NEXT: [[P:%.*]] = tail call align 4294967296 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef -4294967296) #[[ATTR4]]182; CHECK-NEXT: ret ptr [[P]]183;184 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 -4294967296)185 ret ptr %p186}187 188define ptr @align_ptrmask_forward_mask_max_plus_one(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {189; CHECK-LABEL: define align 4294967296 ptr @align_ptrmask_forward_mask_max_plus_one(190; CHECK-SAME: ptr nofree readnone align 4 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {191; CHECK-NEXT: [[P:%.*]] = tail call align 4294967296 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef -8589934592) #[[ATTR4]]192; CHECK-NEXT: ret ptr [[P]]193;194 %p = tail call ptr @llvm.ptrmask.p0.i64(ptr %x, i64 -8589934592)195 ret ptr %p196}197 198define ptr @align_ptrmask_back_callsite(ptr align 4 %x, i64 %y, i1 %cmp1, i1 %cmp2) {199; CHECK-LABEL: define align 16 ptr @align_ptrmask_back_callsite(200; CHECK-SAME: ptr nofree readnone align 16 [[X:%.*]], i64 [[Y:%.*]], i1 [[CMP1:%.*]], i1 [[CMP2:%.*]]) #[[ATTR1]] {201; CHECK-NEXT: [[P:%.*]] = tail call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 noundef -4) #[[ATTR4]]202; CHECK-NEXT: ret ptr [[P]]203;204 %p = tail call align 16 ptr @llvm.ptrmask.p0.i64(ptr %x, i64 -4)205 ret ptr %p206}207