Skip to content

Commit 0b21d55

Browse files
committed
[IR] Mark memset.* intrinsics as IntrWriteMem.
llvm.memset intrinsics do only write memory, but are missing IntrWriteMem, so they doesNotReadMemory() returns false for them. The test change is due to the test checking the fn attribute ids at the call sites, which got bumped up due to a new combination with writeonly appearing in the test file. Reviewers: jdoerfert, reames, efriedma, nlopes, lebedev.ri Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D72789
1 parent 736a380 commit 0b21d55

File tree

5 files changed

+43
-28
lines changed

5 files changed

+43
-28
lines changed

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,8 @@ def int_memmove : Intrinsic<[],
519519
def int_memset : Intrinsic<[],
520520
[llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty,
521521
llvm_i1_ty],
522-
[IntrArgMemOnly, IntrWillReturn, NoCapture<0>, WriteOnly<0>,
523-
ImmArg<3>]>;
522+
[IntrWriteMem, IntrArgMemOnly, IntrWillReturn, NoCapture<0>,
523+
WriteOnly<0>, ImmArg<3>]>;
524524

525525
// FIXME: Add version of these floating point intrinsics which allow non-default
526526
// rounding modes and FP exception handling.
@@ -1221,7 +1221,8 @@ def int_memmove_element_unordered_atomic
12211221
// @llvm.memset.element.unordered.atomic.*(dest, value, length, elementsize)
12221222
def int_memset_element_unordered_atomic
12231223
: Intrinsic<[], [ llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty, llvm_i32_ty ],
1224-
[ IntrArgMemOnly, IntrWillReturn, NoCapture<0>, WriteOnly<0>, ImmArg<3> ]>;
1224+
[ IntrWriteMem, IntrArgMemOnly, IntrWillReturn, NoCapture<0>, WriteOnly<0>,
1225+
ImmArg<3> ]>;
12251226

12261227
//===------------------------ Reduction Intrinsics ------------------------===//
12271228
//

llvm/test/Analysis/BasicAA/cs-cs.ll

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
1+
; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -S 2>&1 | FileCheck %s
22
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
33
target triple = "arm-apple-ios"
44

@@ -364,28 +364,42 @@ entry:
364364
call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
365365
ret void
366366

367-
; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
368-
; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
369-
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
370-
; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
371-
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
372-
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
373-
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
374-
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
375-
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #7 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
376-
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #7 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
377-
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #7 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
378-
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #8 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
379-
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #8 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
380-
; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #8 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
381-
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
382-
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
383-
; CHECK: Both ModRef (MustAlias): call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ]
384-
; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #7 [ "unknown"() ]
385-
; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #8 [ "unknown"() ]
386-
; CHECK: Both ModRef (MustAlias): call void @an_argmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #9 [ "unknown"() ]
367+
; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
368+
; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
369+
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
370+
; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
371+
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
372+
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
373+
; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
374+
; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
375+
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #8 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
376+
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #8 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
377+
; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #8 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
378+
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #9 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
379+
; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #9 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
380+
; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #9 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
381+
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
382+
; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
383+
; CHECK: Both ModRef (MustAlias): call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
384+
; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
385+
; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
386+
; CHECK: Both ModRef (MustAlias): call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
387387
}
388388

389+
390+
; CHECK: attributes #0 = { argmemonly nounwind willreturn writeonly }
391+
; CHECK-NEXT: attributes #1 = { argmemonly nounwind willreturn }
392+
; CHECK-NEXT: attributes #2 = { noinline nounwind readonly }
393+
; CHECK-NEXT: attributes #3 = { noinline nounwind writeonly }
394+
; CHECK-NEXT: attributes #4 = { nounwind ssp }
395+
; CHECK-NEXT: attributes #5 = { inaccessiblememonly nounwind }
396+
; CHECK-NEXT: attributes #6 = { inaccessiblemem_or_argmemonly nounwind }
397+
; CHECK-NEXT: attributes #7 = { argmemonly nounwind }
398+
; CHECK-NEXT: attributes #8 = { readonly }
399+
; CHECK-NEXT: attributes #9 = { inaccessiblememonly }
400+
; CHECK-NEXT: attributes #10 = { inaccessiblemem_or_argmemonly }
401+
; CHECK-NEXT: attributes #11 = { argmemonly }
402+
389403
attributes #0 = { argmemonly nounwind }
390404
attributes #1 = { noinline nounwind readonly }
391405
attributes #2 = { noinline nounwind writeonly }

llvm/test/Transforms/DeadStoreElimination/simple.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ define noalias i8* @test23() nounwind uwtable ssp {
508508
; CHECK-NEXT: store i8 97, i8* [[ARRAYIDX]], align 1
509509
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [2 x i8], [2 x i8]* [[X]], i64 0, i64 1
510510
; CHECK-NEXT: store i8 0, i8* [[ARRAYIDX1]], align 1
511-
; CHECK-NEXT: [[CALL:%.*]] = call i8* @strdup(i8* [[ARRAYIDX]]) #2
511+
; CHECK-NEXT: [[CALL:%.*]] = call i8* @strdup(i8* [[ARRAYIDX]]) #3
512512
; CHECK-NEXT: ret i8* [[CALL]]
513513
;
514514
%x = alloca [2 x i8], align 1
@@ -546,7 +546,7 @@ define i8* @test25(i8* %p) nounwind {
546546
; CHECK-NEXT: [[P_4:%.*]] = getelementptr i8, i8* [[P:%.*]], i64 4
547547
; CHECK-NEXT: [[TMP:%.*]] = load i8, i8* [[P_4]], align 1
548548
; CHECK-NEXT: store i8 0, i8* [[P_4]], align 1
549-
; CHECK-NEXT: [[Q:%.*]] = call i8* @strdup(i8* [[P]]) #5
549+
; CHECK-NEXT: [[Q:%.*]] = call i8* @strdup(i8* [[P]]) #6
550550
; CHECK-NEXT: store i8 [[TMP]], i8* [[P_4]], align 1
551551
; CHECK-NEXT: ret i8* [[Q]]
552552
;

llvm/test/Transforms/InstCombine/malloc-free-delete.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ define void @test10() {
292292

293293
define void @test11() {
294294
; CHECK-LABEL: @test11(
295-
; CHECK-NEXT: [[CALL:%.*]] = call dereferenceable(8) i8* @_Znwm(i64 8) #5
295+
; CHECK-NEXT: [[CALL:%.*]] = call dereferenceable(8) i8* @_Znwm(i64 8) #6
296296
; CHECK-NEXT: call void @_ZdlPv(i8* nonnull [[CALL]])
297297
; CHECK-NEXT: ret void
298298
;

llvm/test/Transforms/ObjCARC/nested.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -821,5 +821,5 @@ entry:
821821

822822

823823
; CHECK: attributes [[NUW]] = { nounwind }
824-
; CHECK: attributes #1 = { argmemonly nounwind willreturn }
824+
; CHECK: attributes #1 = { argmemonly nounwind willreturn writeonly }
825825
; CHECK: attributes #2 = { nonlazybind }

0 commit comments

Comments
 (0)