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
50 lines
1.7 KiB
LLVM
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}
|