forked from OSchip/llvm-project
[Attributor][FIX] Treat invalidated attributes as changed
If we invalidate an attribute we need to inform all dependent ones even if the fixpoint state is not invalid. Before we only continued invalidation if the fixpoint state was invalid, now we signal a change in case the fixpoint state is valid. The test case was already included in D71620 but the problem was hiding because it only manifested with the old PM (for that input).
This commit is contained in:
parent
53992c7bf7
commit
224085409d
|
@ -6031,6 +6031,8 @@ ChangeStatus Attributor::run(Module &M) {
|
|||
assert(DOIAAState.isAtFixpoint() && "Expected fixpoint state!");
|
||||
if (!DOIAAState.isValidState())
|
||||
InvalidAAs.insert(DepOnInvalidAA);
|
||||
else
|
||||
ChangedAAs.push_back(DepOnInvalidAA);
|
||||
}
|
||||
if (!RecomputeDependences)
|
||||
Worklist.insert(QuerriedAAs.OptionalAAs.begin(),
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -attributor -attributor-manifest-internal --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR
|
||||
; RUN: opt -attributor -attributor-manifest-internal --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR
|
||||
|
||||
|
||||
declare void @deref_phi_user(i32* %a);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -passes=attributor -attributor-disable=false -S < %s | FileCheck %s
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
|
||||
; RUN: opt -attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,OLD_PM
|
||||
; RUN: opt -passes=attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,NEW_PM
|
||||
|
||||
define i32 @test0(i32* %p) {
|
||||
; CHECK-LABEL: define {{[^@]+}}@test0
|
||||
|
@ -279,21 +280,38 @@ return: ; preds = %if.end, %if.then
|
|||
declare dso_local void @unkown()
|
||||
|
||||
define internal i32 @r1(i32) local_unnamed_addr {
|
||||
; CHECK-LABEL: define {{[^@]+}}@r1() local_unnamed_addr
|
||||
; CHECK-NEXT: br label [[TMP3:%.*]]
|
||||
; CHECK: 1:
|
||||
; CHECK-NEXT: br label [[F:%.*]]
|
||||
; CHECK: 2:
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK: f:
|
||||
; CHECK-NEXT: ret i32 10
|
||||
; CHECK: 3:
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP7:%.*]], [[TMP3]] ]
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP6:%.*]], [[TMP3]] ]
|
||||
; CHECK-NEXT: [[TMP6]] = add nuw nsw i32 [[TMP4]], [[TMP5]]
|
||||
; CHECK-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP4]], 1
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 100
|
||||
; CHECK-NEXT: br i1 [[TMP8]], label [[TMP1:%.*]], label [[TMP3]]
|
||||
; OLD_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr
|
||||
; OLD_PM-NEXT: br label [[TMP4:%.*]]
|
||||
; OLD_PM: 1:
|
||||
; OLD_PM-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP7:%.*]], 10000
|
||||
; OLD_PM-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[F:%.*]]
|
||||
; OLD_PM: 3:
|
||||
; OLD_PM-NEXT: ret i32 20
|
||||
; OLD_PM: f:
|
||||
; OLD_PM-NEXT: ret i32 10
|
||||
; OLD_PM: 4:
|
||||
; OLD_PM-NEXT: [[TMP5:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP8:%.*]], [[TMP4]] ]
|
||||
; OLD_PM-NEXT: [[TMP6:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP7]], [[TMP4]] ]
|
||||
; OLD_PM-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP5]], [[TMP6]]
|
||||
; OLD_PM-NEXT: [[TMP8]] = add nuw nsw i32 [[TMP5]], 1
|
||||
; OLD_PM-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100
|
||||
; OLD_PM-NEXT: br i1 [[TMP9]], label [[TMP1:%.*]], label [[TMP4]]
|
||||
;
|
||||
; NEW_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr
|
||||
; NEW_PM-NEXT: br label [[TMP3:%.*]]
|
||||
; NEW_PM: 1:
|
||||
; NEW_PM-NEXT: br label [[F:%.*]]
|
||||
; NEW_PM: 2:
|
||||
; NEW_PM-NEXT: unreachable
|
||||
; NEW_PM: f:
|
||||
; NEW_PM-NEXT: ret i32 10
|
||||
; NEW_PM: 3:
|
||||
; NEW_PM-NEXT: [[TMP4:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP7:%.*]], [[TMP3]] ]
|
||||
; NEW_PM-NEXT: [[TMP5:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP6:%.*]], [[TMP3]] ]
|
||||
; NEW_PM-NEXT: [[TMP6]] = add nuw nsw i32 [[TMP4]], [[TMP5]]
|
||||
; NEW_PM-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP4]], 1
|
||||
; NEW_PM-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 100
|
||||
; NEW_PM-NEXT: br i1 [[TMP8]], label [[TMP1:%.*]], label [[TMP3]]
|
||||
;
|
||||
br label %5
|
||||
|
||||
|
@ -314,14 +332,25 @@ f:
|
|||
}
|
||||
|
||||
define void @f1(i32){
|
||||
; CHECK-LABEL: define {{[^@]+}}@f1
|
||||
; CHECK-SAME: (i32 [[TMP0:%.*]])
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = tail call i32 @r1()
|
||||
; CHECK-NEXT: br label [[TMP4:%.*]]
|
||||
; CHECK: 3:
|
||||
; CHECK-NEXT: unreachable
|
||||
; CHECK: 4:
|
||||
; CHECK-NEXT: ret void
|
||||
; OLD_PM-LABEL: define {{[^@]+}}@f1
|
||||
; OLD_PM-SAME: (i32 [[TMP0:%.*]])
|
||||
; OLD_PM-NEXT: [[TMP2:%.*]] = tail call i32 @r1()
|
||||
; OLD_PM-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP2]], 15
|
||||
; OLD_PM-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]]
|
||||
; OLD_PM: 4:
|
||||
; OLD_PM-NEXT: tail call void @unkown()
|
||||
; OLD_PM-NEXT: br label [[TMP5]]
|
||||
; OLD_PM: 5:
|
||||
; OLD_PM-NEXT: ret void
|
||||
;
|
||||
; NEW_PM-LABEL: define {{[^@]+}}@f1
|
||||
; NEW_PM-SAME: (i32 [[TMP0:%.*]])
|
||||
; NEW_PM-NEXT: [[TMP2:%.*]] = tail call i32 @r1()
|
||||
; NEW_PM-NEXT: br label [[TMP4:%.*]]
|
||||
; NEW_PM: 3:
|
||||
; NEW_PM-NEXT: unreachable
|
||||
; NEW_PM: 4:
|
||||
; NEW_PM-NEXT: ret void
|
||||
;
|
||||
%2 = tail call i32 @r1(i32 %0)
|
||||
%3 = icmp sgt i32 %2, 15
|
||||
|
|
Loading…
Reference in New Issue