Files
clang-p2996/llvm/test/Transforms/FunctionAttrs/internal-noalias.ll
Johannes Doerfert 3ab9e8b818 [Attributor][Fix] Initialize the cache prior to using it
Summary:
There were segfaults as we modified and iterated the instruction maps in
the cache at the same time. This was happening because we created new
instructions while we populated the cache. This fix changes the order
in which we perform these actions. First, the caches for the whole
module are created, then we start to create abstract attributes.

I don't have a unit test but the LLVM test suite exposes this problem.

Reviewers: uenoku, sstefan1

Subscribers: hiraditya, bollu, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D67232

llvm-svn: 372105
2019-09-17 10:52:41 +00:00

50 lines
1.7 KiB
LLVM

; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=5 < %s | FileCheck %s
define dso_local i32 @visible(i32* noalias %A, i32* noalias %B) #0 {
entry:
%call1 = call i32 @noalias_args(i32* %A, i32* %B)
%call2 = call i32 @noalias_args_argmem(i32* %A, i32* %B)
%add = add nsw i32 %call1, %call2
ret i32 %add
}
; FIXME: Should be something like this.
; define internal i32 @noalias_args(i32* nocapture readonly %A, i32* noalias nocapture readonly %B)
; CHECK: define internal i32 @noalias_args(i32* nocapture %A, i32* noalias nocapture %B)
define internal i32 @noalias_args(i32* %A, i32* %B) #0 {
entry:
%0 = load i32, i32* %A, align 4
%1 = load i32, i32* %B, align 4
%add = add nsw i32 %0, %1
%call = call i32 @noalias_args_argmem(i32* %A, i32* %B)
%add2 = add nsw i32 %add, %call
ret i32 %add2
}
; FIXME: Should be something like this.
; define internal i32 @noalias_args_argmem(i32* noalias nocapture readonly %A, i32* noalias nocapture readonly %B)
; CHECK: define internal i32 @noalias_args_argmem(i32* nocapture %A, i32* nocapture %B)
;
define internal i32 @noalias_args_argmem(i32* %A, i32* %B) #1 {
entry:
%0 = load i32, i32* %A, align 4
%1 = load i32, i32* %B, align 4
%add = add nsw i32 %0, %1
ret i32 %add
}
define dso_local i32 @visible_local(i32* %A) #0 {
entry:
%B = alloca i32, align 4
store i32 5, i32* %B, align 4
%call1 = call i32 @noalias_args(i32* %A, i32* nonnull %B)
%call2 = call i32 @noalias_args_argmem(i32* %A, i32* nonnull %B)
%add = add nsw i32 %call1, %call2
ret i32 %add
}
attributes #0 = { noinline nounwind uwtable willreturn }
attributes #1 = { argmemonly noinline nounwind uwtable willreturn}