Skip to content

Commit 51abbf9

Browse files
committed
[InstCombine] Deduce align and nonnull return attributes for llvm.ptrmask
We can deduce the former based on the mask / incoming pointer alignment. We can set the latter based if know the result in non-zero (this is essentially just caching our analysis result). Differential Revision: https://reviews.llvm.org/D156636
1 parent edb9e9a commit 51abbf9

File tree

5 files changed

+45
-24
lines changed

5 files changed

+45
-24
lines changed

clang/test/CodeGen/arm64_32-vaarg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ long long test_longlong(OneLongLong input, va_list *mylist) {
2929
// CHECK-LABEL: define{{.*}} i64 @test_longlong(i64 %input
3030
// CHECK: [[STARTPTR:%.*]] = load ptr, ptr %mylist
3131
// CHECK: [[ALIGN_TMP:%.+]] = getelementptr inbounds i8, ptr [[STARTPTR]], i32 7
32-
// CHECK: [[ALIGNED_ADDR:%.+]] = tail call ptr @llvm.ptrmask.p0.i32(ptr nonnull [[ALIGN_TMP]], i32 -8)
32+
// CHECK: [[ALIGNED_ADDR:%.+]] = tail call align 8 ptr @llvm.ptrmask.p0.i32(ptr nonnull [[ALIGN_TMP]], i32 -8)
3333
// CHECK: [[NEXT:%.*]] = getelementptr inbounds i8, ptr [[ALIGNED_ADDR]], i32 8
3434
// CHECK: store ptr [[NEXT]], ptr %mylist
3535

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,6 +1978,27 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
19781978
*II, Builder.CreateIntrinsic(InnerPtr->getType(), Intrinsic::ptrmask,
19791979
{InnerPtr, NewMask}));
19801980
}
1981+
bool Changed = false;
1982+
// See if we can deduce non-null.
1983+
if (!CI.hasRetAttr(Attribute::NonNull) &&
1984+
(Known.isNonZero() ||
1985+
isKnownNonZero(II, DL, /*Depth*/ 0, &AC, II, &DT))) {
1986+
CI.addRetAttr(Attribute::NonNull);
1987+
Changed = true;
1988+
}
1989+
1990+
unsigned NewAlignmentLog =
1991+
std::min(Value::MaxAlignmentExponent,
1992+
std::min(BitWidth - 1, Known.countMinTrailingZeros()));
1993+
// Known bits will capture if we had alignment information associated with
1994+
// the pointer argument.
1995+
if (NewAlignmentLog > Log2(CI.getRetAlign().valueOrOne())) {
1996+
CI.addRetAttr(Attribute::getWithAlignment(
1997+
CI.getContext(), Align(uint64_t(1) << NewAlignmentLog)));
1998+
Changed = true;
1999+
}
2000+
if (Changed)
2001+
return &CI;
19812002
break;
19822003
}
19832004
case Intrinsic::uadd_with_overflow:

llvm/test/Transforms/InstCombine/align-addr.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ define <16 x i8> @ptrmask_align_unknown_ptr_align1(ptr align 1 %ptr, i64 %mask)
135135

136136
define <16 x i8> @ptrmask_align_unknown_ptr_align8(ptr align 8 %ptr, i64 %mask) {
137137
; CHECK-LABEL: @ptrmask_align_unknown_ptr_align8(
138-
; CHECK-NEXT: [[ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 [[MASK:%.*]])
138+
; CHECK-NEXT: [[ALIGNED:%.*]] = call align 8 ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 [[MASK:%.*]])
139139
; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ALIGNED]], align 1
140140
; CHECK-NEXT: ret <16 x i8> [[LOAD]]
141141
;
@@ -147,7 +147,7 @@ define <16 x i8> @ptrmask_align_unknown_ptr_align8(ptr align 8 %ptr, i64 %mask)
147147
; Increase load align from 1 to 2
148148
define <16 x i8> @ptrmask_align2_ptr_align1(ptr align 1 %ptr) {
149149
; CHECK-LABEL: @ptrmask_align2_ptr_align1(
150-
; CHECK-NEXT: [[ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -2)
150+
; CHECK-NEXT: [[ALIGNED:%.*]] = call align 2 ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -2)
151151
; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ALIGNED]], align 1
152152
; CHECK-NEXT: ret <16 x i8> [[LOAD]]
153153
;
@@ -159,7 +159,7 @@ define <16 x i8> @ptrmask_align2_ptr_align1(ptr align 1 %ptr) {
159159
; Increase load align from 1 to 4
160160
define <16 x i8> @ptrmask_align4_ptr_align1(ptr align 1 %ptr) {
161161
; CHECK-LABEL: @ptrmask_align4_ptr_align1(
162-
; CHECK-NEXT: [[ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)
162+
; CHECK-NEXT: [[ALIGNED:%.*]] = call align 4 ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)
163163
; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ALIGNED]], align 1
164164
; CHECK-NEXT: ret <16 x i8> [[LOAD]]
165165
;
@@ -171,7 +171,7 @@ define <16 x i8> @ptrmask_align4_ptr_align1(ptr align 1 %ptr) {
171171
; Increase load align from 1 to 8
172172
define <16 x i8> @ptrmask_align8_ptr_align1(ptr align 1 %ptr) {
173173
; CHECK-LABEL: @ptrmask_align8_ptr_align1(
174-
; CHECK-NEXT: [[ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -8)
174+
; CHECK-NEXT: [[ALIGNED:%.*]] = call align 8 ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -8)
175175
; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ALIGNED]], align 1
176176
; CHECK-NEXT: ret <16 x i8> [[LOAD]]
177177
;

llvm/test/Transforms/InstCombine/consecutive-ptrmask.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ define <2 x ptr> @fold_2x_vec_i64(<2 x ptr> %p, <2 x i64> %m0) {
6363
; CHECK-LABEL: define <2 x ptr> @fold_2x_vec_i64
6464
; CHECK-SAME: (<2 x ptr> [[P:%.*]], <2 x i64> [[M0:%.*]]) {
6565
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i64> [[M0]], <i64 -2, i64 -2>
66-
; CHECK-NEXT: [[P1:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> [[TMP1]])
66+
; CHECK-NEXT: [[P1:%.*]] = call align 2 <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> [[TMP1]])
6767
; CHECK-NEXT: ret <2 x ptr> [[P1]]
6868
;
6969
%p0 = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> %p, <2 x i64> %m0)

llvm/test/Transforms/InstCombine/ptrmask.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ define ptr @ptrmask_combine_consecutive_preserve_attrs(ptr %p0, i64 %m1) {
1212
; CHECK-LABEL: define ptr @ptrmask_combine_consecutive_preserve_attrs
1313
; CHECK-SAME: (ptr [[P0:%.*]], i64 [[M1:%.*]]) {
1414
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[M1]], 224
15-
; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[TMP1]])
15+
; CHECK-NEXT: [[R:%.*]] = call align 32 ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[TMP1]])
1616
; CHECK-NEXT: ret ptr [[R]]
1717
;
1818
%pm0 = call ptr @llvm.ptrmask.p0.i64(ptr %p0, i64 224)
@@ -47,7 +47,7 @@ define ptr @ptrmask_combine_consecutive_preserve_attrs_fail(ptr %p0, i64 %m0) {
4747
define ptr @ptrmask_combine_consecutive_preserve_attrs_todo0(ptr %p0) {
4848
; CHECK-LABEL: define ptr @ptrmask_combine_consecutive_preserve_attrs_todo0
4949
; CHECK-SAME: (ptr [[P0:%.*]]) {
50-
; CHECK-NEXT: [[PM0:%.*]] = call noalias ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 224)
50+
; CHECK-NEXT: [[PM0:%.*]] = call noalias align 32 ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 224)
5151
; CHECK-NEXT: ret ptr [[PM0]]
5252
;
5353
%pm0 = call noalias ptr @llvm.ptrmask.p0.i64(ptr %p0, i64 224)
@@ -58,7 +58,7 @@ define ptr @ptrmask_combine_consecutive_preserve_attrs_todo0(ptr %p0) {
5858
define ptr @ptrmask_combine_consecutive_preserve_attrs_todo1(ptr %p0) {
5959
; CHECK-LABEL: define ptr @ptrmask_combine_consecutive_preserve_attrs_todo1
6060
; CHECK-SAME: (ptr [[P0:%.*]]) {
61-
; CHECK-NEXT: [[PM0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 224)
61+
; CHECK-NEXT: [[PM0:%.*]] = call align 32 ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 224)
6262
; CHECK-NEXT: ret ptr [[PM0]]
6363
;
6464
%pm0 = call ptr @llvm.ptrmask.p0.i64(ptr %p0, i64 224)
@@ -69,7 +69,7 @@ define ptr @ptrmask_combine_consecutive_preserve_attrs_todo1(ptr %p0) {
6969
define ptr addrspace(1) @ptrmask_combine_consecutive_preserve_attrs_todo2(ptr addrspace(1) %p0) {
7070
; CHECK-LABEL: define ptr addrspace(1) @ptrmask_combine_consecutive_preserve_attrs_todo2
7171
; CHECK-SAME: (ptr addrspace(1) [[P0:%.*]]) {
72-
; CHECK-NEXT: [[PM0:%.*]] = call noalias ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P0]], i32 224)
72+
; CHECK-NEXT: [[PM0:%.*]] = call noalias align 32 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P0]], i32 224)
7373
; CHECK-NEXT: ret ptr addrspace(1) [[PM0]]
7474
;
7575
%pm0 = call noalias ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p0, i32 224)
@@ -80,9 +80,9 @@ define ptr addrspace(1) @ptrmask_combine_consecutive_preserve_attrs_todo2(ptr ad
8080
define ptr @ptrmask_combine_add_nonnull(ptr %p) {
8181
; CHECK-LABEL: define ptr @ptrmask_combine_add_nonnull
8282
; CHECK-SAME: (ptr [[P:%.*]]) {
83-
; CHECK-NEXT: [[PM0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64)
83+
; CHECK-NEXT: [[PM0:%.*]] = call align 64 ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64)
8484
; CHECK-NEXT: [[PGEP:%.*]] = getelementptr i8, ptr [[PM0]], i64 33
85-
; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PGEP]], i64 -32)
85+
; CHECK-NEXT: [[R:%.*]] = call nonnull align 32 ptr @llvm.ptrmask.p0.i64(ptr [[PGEP]], i64 -32)
8686
; CHECK-NEXT: ret ptr [[R]]
8787
;
8888
%pm0 = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -64)
@@ -94,7 +94,7 @@ define ptr @ptrmask_combine_add_nonnull(ptr %p) {
9494
define ptr @ptrmask_combine_add_alignment(ptr %p) {
9595
; CHECK-LABEL: define ptr @ptrmask_combine_add_alignment
9696
; CHECK-SAME: (ptr [[P:%.*]]) {
97-
; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64)
97+
; CHECK-NEXT: [[R:%.*]] = call align 64 ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64)
9898
; CHECK-NEXT: ret ptr [[R]]
9999
;
100100
%r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -64)
@@ -104,7 +104,7 @@ define ptr @ptrmask_combine_add_alignment(ptr %p) {
104104
define ptr addrspace(1) @ptrmask_combine_add_alignment2(ptr addrspace(1) align 32 %p) {
105105
; CHECK-LABEL: define ptr addrspace(1) @ptrmask_combine_add_alignment2
106106
; CHECK-SAME: (ptr addrspace(1) align 32 [[P:%.*]]) {
107-
; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 -64)
107+
; CHECK-NEXT: [[R:%.*]] = call align 64 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 -64)
108108
; CHECK-NEXT: ret ptr addrspace(1) [[R]]
109109
;
110110
%r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 -64)
@@ -114,7 +114,7 @@ define ptr addrspace(1) @ptrmask_combine_add_alignment2(ptr addrspace(1) align 3
114114
define <2 x ptr> @ptrmask_combine_add_alignment_vec(<2 x ptr> %p) {
115115
; CHECK-LABEL: define <2 x ptr> @ptrmask_combine_add_alignment_vec
116116
; CHECK-SAME: (<2 x ptr> [[P:%.*]]) {
117-
; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> <i64 -96, i64 -96>)
117+
; CHECK-NEXT: [[R:%.*]] = call align 32 <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> <i64 -96, i64 -96>)
118118
; CHECK-NEXT: ret <2 x ptr> [[R]]
119119
;
120120
%r = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> %p, <2 x i64> <i64 -96, i64 -96>)
@@ -124,7 +124,7 @@ define <2 x ptr> @ptrmask_combine_add_alignment_vec(<2 x ptr> %p) {
124124
define ptr addrspace(1) @ptrmask_combine_improve_alignment(ptr addrspace(1) %p) {
125125
; CHECK-LABEL: define ptr addrspace(1) @ptrmask_combine_improve_alignment
126126
; CHECK-SAME: (ptr addrspace(1) [[P:%.*]]) {
127-
; CHECK-NEXT: [[R:%.*]] = call align 32 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 -64)
127+
; CHECK-NEXT: [[R:%.*]] = call align 64 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 -64)
128128
; CHECK-NEXT: ret ptr addrspace(1) [[R]]
129129
;
130130
%r = call align 32 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 -64)
@@ -134,7 +134,7 @@ define ptr addrspace(1) @ptrmask_combine_improve_alignment(ptr addrspace(1) %p)
134134
define <2 x ptr addrspace(1) > @ptrmask_combine_improve_alignment_vec(<2 x ptr addrspace(1) > %p) {
135135
; CHECK-LABEL: define <2 x ptr addrspace(1)> @ptrmask_combine_improve_alignment_vec
136136
; CHECK-SAME: (<2 x ptr addrspace(1)> [[P:%.*]]) {
137-
; CHECK-NEXT: [[R:%.*]] = call align 32 <2 x ptr addrspace(1)> @llvm.ptrmask.v2p1.v2i32(<2 x ptr addrspace(1)> [[P]], <2 x i32> <i32 -64, i32 -128>)
137+
; CHECK-NEXT: [[R:%.*]] = call align 64 <2 x ptr addrspace(1)> @llvm.ptrmask.v2p1.v2i32(<2 x ptr addrspace(1)> [[P]], <2 x i32> <i32 -64, i32 -128>)
138138
; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[R]]
139139
;
140140
%r = call align 32 <2 x ptr addrspace(1) > @llvm.ptrmask.v2p1.v2i32(<2 x ptr addrspace(1) > %p, <2 x i32> <i32 -64, i32 -128>)
@@ -230,7 +230,7 @@ define <2 x i32> @ptrtoint_of_ptrmask_vec_fail(<2 x ptr addrspace(1) > %p, <2 x
230230
define ptr addrspace(1) @ptrmask_is_null(ptr addrspace(1) align 32 %p) {
231231
; CHECK-LABEL: define ptr addrspace(1) @ptrmask_is_null
232232
; CHECK-SAME: (ptr addrspace(1) align 32 [[P:%.*]]) {
233-
; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 0)
233+
; CHECK-NEXT: [[R:%.*]] = call align 4294967296 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 0)
234234
; CHECK-NEXT: ret ptr addrspace(1) [[R]]
235235
;
236236
%r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 31)
@@ -250,7 +250,7 @@ define <2 x ptr addrspace(1) > @ptrmask_is_null_vec(<2 x ptr addrspace(1) > alig
250250
define ptr addrspace(1) @ptrmask_is_null_fail(ptr addrspace(1) align 16 %p) {
251251
; CHECK-LABEL: define ptr addrspace(1) @ptrmask_is_null_fail
252252
; CHECK-SAME: (ptr addrspace(1) align 16 [[P:%.*]]) {
253-
; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 16)
253+
; CHECK-NEXT: [[R:%.*]] = call align 16 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 16)
254254
; CHECK-NEXT: ret ptr addrspace(1) [[R]]
255255
;
256256
%r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 31)
@@ -270,7 +270,7 @@ define <2 x ptr addrspace(1) > @ptrmask_is_null_vec_fail(<2 x ptr addrspace(1) >
270270
define ptr @ptrmask_maintain_provenance_i64(ptr %p0) {
271271
; CHECK-LABEL: define ptr @ptrmask_maintain_provenance_i64
272272
; CHECK-SAME: (ptr [[P0:%.*]]) {
273-
; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 0)
273+
; CHECK-NEXT: [[R:%.*]] = call align 4294967296 ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 0)
274274
; CHECK-NEXT: ret ptr [[R]]
275275
;
276276
%r = call ptr @llvm.ptrmask.p0.i64(ptr %p0, i64 0)
@@ -280,7 +280,7 @@ define ptr @ptrmask_maintain_provenance_i64(ptr %p0) {
280280
define ptr addrspace(1) @ptrmask_maintain_provenance_i32(ptr addrspace(1) %p0) {
281281
; CHECK-LABEL: define ptr addrspace(1) @ptrmask_maintain_provenance_i32
282282
; CHECK-SAME: (ptr addrspace(1) [[P0:%.*]]) {
283-
; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P0]], i32 0)
283+
; CHECK-NEXT: [[R:%.*]] = call align 4294967296 ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P0]], i32 0)
284284
; CHECK-NEXT: ret ptr addrspace(1) [[R]]
285285
;
286286
%r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p0, i32 0)
@@ -292,7 +292,7 @@ define ptr @ptrmask_is_useless0(i64 %i, i64 %m) {
292292
; CHECK-SAME: (i64 [[I:%.*]], i64 [[M:%.*]]) {
293293
; CHECK-NEXT: [[I0:%.*]] = and i64 [[I]], -4
294294
; CHECK-NEXT: [[P0:%.*]] = inttoptr i64 [[I0]] to ptr
295-
; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[M]])
295+
; CHECK-NEXT: [[R:%.*]] = call align 4 ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[M]])
296296
; CHECK-NEXT: ret ptr [[R]]
297297
;
298298
%m0 = and i64 %m, -4
@@ -307,7 +307,7 @@ define ptr @ptrmask_is_useless1(i64 %i, i64 %m) {
307307
; CHECK-SAME: (i64 [[I:%.*]], i64 [[M:%.*]]) {
308308
; CHECK-NEXT: [[I0:%.*]] = and i64 [[I]], -8
309309
; CHECK-NEXT: [[P0:%.*]] = inttoptr i64 [[I0]] to ptr
310-
; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[M]])
310+
; CHECK-NEXT: [[R:%.*]] = call align 8 ptr @llvm.ptrmask.p0.i64(ptr [[P0]], i64 [[M]])
311311
; CHECK-NEXT: ret ptr [[R]]
312312
;
313313
%m0 = and i64 %m, -4
@@ -397,7 +397,7 @@ define ptr @ptrmask_is_useless_fail0(i64 %i, i64 %m) {
397397
; CHECK-NEXT: [[M0:%.*]] = and i64 [[M]], -4
398398
; CHECK-NEXT: [[I0:%.*]] = or i64 [[I]], -4
399399
; CHECK-NEXT: [[P0:%.*]] = inttoptr i64 [[I0]] to ptr
400-
; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr nonnull [[P0]], i64 [[M0]])
400+
; CHECK-NEXT: [[R:%.*]] = call align 4 ptr @llvm.ptrmask.p0.i64(ptr nonnull [[P0]], i64 [[M0]])
401401
; CHECK-NEXT: ret ptr [[R]]
402402
;
403403
%m0 = and i64 %m, -4

0 commit comments

Comments
 (0)