[llvm] 4c62a35 - [Attributor][FIX] Remove duplicate, half-broken functionality

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 11 09:03:41 PST 2020


Author: Johannes Doerfert
Date: 2020-02-11T11:02:59-06:00
New Revision: 4c62a358602e88abc275009bd4170b891eb07870

URL: https://github.com/llvm/llvm-project/commit/4c62a358602e88abc275009bd4170b891eb07870
DIFF: https://github.com/llvm/llvm-project/commit/4c62a358602e88abc275009bd4170b891eb07870.diff

LOG: [Attributor][FIX] Remove duplicate, half-broken functionality

The changeXXXAfterManifest functions are better suited to deal with
changes so we should prefer them. These functions also recursively
delete dead instructions which is why we see test changes.

Added: 
    

Modified: 
    llvm/include/llvm/Transforms/IPO/Attributor.h
    llvm/lib/Transforms/IPO/Attributor.cpp
    llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll
    llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll
    llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll
    llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll
    llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll
    llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll
    llvm/test/Transforms/Attributor/liveness.ll
    llvm/test/Transforms/Attributor/nonnull.ll
    llvm/test/Transforms/Attributor/range.ll
    llvm/test/Transforms/Attributor/undefined_behavior.ll

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index 2228b62c0ca6..8437ed260f6c 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -1023,17 +1023,6 @@ struct Attributor {
   /// Return the data layout associated with the anchor scope.
   const DataLayout &getDataLayout() const { return InfoCache.DL; }
 
-  /// Replace all uses of \p Old with \p New and, for calls (and invokes),
-  /// update the call graph.
-  void replaceAllUsesWith(Value &Old, Value &New) {
-    if (CallBase *OldCB = dyn_cast<CallBase>(&Old)) {
-      // We do not modify the call graph here but simply reanalyze the old
-      // function. This should be revisited once the old PM is gone.
-      CGModifiedFunctions.insert(OldCB->getFunction());
-    }
-    Old.replaceAllUsesWith(&New);
-  }
-
 private:
   /// Check \p Pred on all call sites of \p Fn.
   ///

diff  --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index a7b51b314d85..52eafe5b8a4e 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -1192,8 +1192,9 @@ ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) {
   auto ReplaceCallSiteUsersWith = [&A](CallBase &CB, Constant &C) {
     if (CB.getNumUses() == 0 || CB.isMustTailCall())
       return ChangeStatus::UNCHANGED;
-    A.replaceAllUsesWith(CB, C);
-    return ChangeStatus::CHANGED;
+    if (A.changeValueAfterManifest(CB, C))
+      return ChangeStatus::CHANGED;
+    return ChangeStatus::UNCHANGED;
   };
 
   // If the assumed unique return value is an argument, annotate it.
@@ -4443,8 +4444,8 @@ struct AAValueSimplifyImpl : AAValueSimplify {
       if (!V.user_empty() && &V != C && V.getType() == C->getType()) {
         LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *C
                           << " :: " << *this << "\n");
-        A.changeValueAfterManifest(V, *C);
-        Changed = ChangeStatus::CHANGED;
+        if (A.changeValueAfterManifest(V, *C))
+          Changed = ChangeStatus::CHANGED;
       }
     }
 
@@ -4696,7 +4697,7 @@ struct AAHeapToStackImpl : public AAHeapToStack {
         AI = new BitCastInst(AI, MallocCall->getType(), "malloc_bc",
                              AI->getNextNode());
 
-      A.replaceAllUsesWith(*MallocCall, *AI);
+      A.changeValueAfterManifest(*MallocCall, *AI);
 
       if (auto *II = dyn_cast<InvokeInst>(MallocCall)) {
         auto *NBB = II->getNormalDest();

diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll
index 6677cb546725..3396cf3b4ac7 100644
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll
@@ -1,8 +1,8 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
-; RUN: opt -S -basicaa -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s --check-prefixes=CHECK,OLDPM_MODULE
-; RUN: opt -S -basicaa -attributor-cgscc -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,OLDPM_CGSCC
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s --check-prefixes=CHECK,NEWPM_MODULE
-; RUN: opt -S -passes='attributor-cgscc' -aa-pipeline='basic-aa' -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,NEWPM_CGSCC
+; RUN: opt -S -basicaa -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s --check-prefixes=CHECK,OLDPM,OLDPM_MODULE
+; RUN: opt -S -basicaa -attributor-cgscc -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,OLDPM,OLDPM_CGSCC
+; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s --check-prefixes=CHECK,NEWPM,NEWPM_MODULE
+; RUN: opt -S -passes='attributor-cgscc' -aa-pipeline='basic-aa' -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,NEWPM,NEWPM_CGSCC
 
 ; OLDPM_MODULE-NOT: @dead
 ; NEWPM_MODULE-NOT: @dead
@@ -15,15 +15,36 @@ define internal void @dead() {
 }
 
 define internal i32 @test(i32* %X, i32* %Y) {
-; CHECK-LABEL: define {{[^@]+}}@test()
-; CHECK-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]
-; CHECK:       live:
-; CHECK-NEXT:    ret i32 0
-; CHECK:       dead:
-; CHECK-NEXT:    unreachable
+; OLDPM-LABEL: define {{[^@]+}}@test
+; OLDPM-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])
+; OLDPM-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]
+; OLDPM:       live:
+; OLDPM-NEXT:    store i32 0, i32* [[X]], align 4
+; OLDPM-NEXT:    ret i32 0
+; OLDPM:       dead:
+; OLDPM-NEXT:    unreachable
+;
+; NEWPM_MODULE-LABEL: define {{[^@]+}}@test
+; NEWPM_MODULE-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])
+; NEWPM_MODULE-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]
+; NEWPM_MODULE:       live:
+; NEWPM_MODULE-NEXT:    store i32 0, i32* [[X]], align 4
+; NEWPM_MODULE-NEXT:    ret i32 0
+; NEWPM_MODULE:       dead:
+; NEWPM_MODULE-NEXT:    unreachable
+;
+; NEWPM_CGSCC-LABEL: define {{[^@]+}}@test
+; NEWPM_CGSCC-SAME: (i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[X:%.*]])
+; NEWPM_CGSCC-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]
+; NEWPM_CGSCC:       live:
+; NEWPM_CGSCC-NEXT:    store i32 0, i32* [[X]], align 4
+; NEWPM_CGSCC-NEXT:    ret i32 0
+; NEWPM_CGSCC:       dead:
+; NEWPM_CGSCC-NEXT:    unreachable
 ;
   br i1 true, label %live, label %dead
 live:
+  store i32 0, i32* %X
   ret i32 0
 dead:
   call i32 @caller(i32* null)
@@ -35,7 +56,7 @@ define internal i32 @caller(i32* %B) {
 ; CHECK-LABEL: define {{[^@]+}}@caller()
 ; CHECK-NEXT:    [[A:%.*]] = alloca i32
 ; CHECK-NEXT:    store i32 1, i32* [[A]], align 4
-; CHECK-NEXT:    [[C:%.*]] = call i32 @test()
+; CHECK-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])
 ; CHECK-NEXT:    ret i32 0
 ;
   %A = alloca i32

diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll
index 2c83cbb4aff4..ac0fc2b9951c 100644
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll
@@ -45,11 +45,6 @@ define i32 @foo(%T* %p, i32 %v) {
 }
 
 define internal i32 @test2(%T* %p, i32 %p2) {
-; CHECK-LABEL: define {{[^@]+}}@test2
-; CHECK-SAME: (%T* nocapture nofree readonly [[P:%.*]], i32 [[P2:%.*]])
-; CHECK-NEXT:    [[CA:%.*]] = musttail call i32 @foo(%T* undef, i32 undef)
-; CHECK-NEXT:    ret i32 [[CA]]
-;
   %a.gep = getelementptr %T, %T* %p, i64 0, i32 3
   %b.gep = getelementptr %T, %T* %p, i64 0, i32 2
   %a = load i32, i32* %a.gep
@@ -62,9 +57,54 @@ define internal i32 @test2(%T* %p, i32 %p2) {
 define i32 @caller2(%T* %g) {
 ; CHECK-LABEL: define {{[^@]+}}@caller2
 ; CHECK-SAME: (%T* nocapture nofree readonly [[G:%.*]])
-; CHECK-NEXT:    [[V:%.*]] = call i32 @test2(%T* nocapture nofree readonly undef, i32 undef)
 ; CHECK-NEXT:    ret i32 0
 ;
   %v = call i32 @test2(%T* %g, i32 0)
   ret i32 %v
 }
+
+; In the version above we can remove the call to foo completely.
+; In the version below we keep the call and verify the return value
+; is kept as well.
+
+define i32 @bar(%T* %p, i32 %v) {
+; CHECK-LABEL: define {{[^@]+}}@bar
+; CHECK-SAME: (%T* nocapture nofree nonnull writeonly dereferenceable(4) [[P:%.*]], i32 [[V:%.*]])
+; CHECK-NEXT:    [[I32PTR:%.*]] = getelementptr [[T:%.*]], %T* [[P]], i64 0, i32 0
+; CHECK-NEXT:    store i32 [[V]], i32* [[I32PTR]]
+; CHECK-NEXT:    ret i32 0
+;
+  %i32ptr = getelementptr %T, %T* %p, i64 0, i32 0
+  store i32 %v, i32* %i32ptr
+  ret i32 0
+}
+
+define internal i32 @test2b(%T* %p, i32 %p2) {
+; CHECK-LABEL: define {{[^@]+}}@test2b
+; CHECK-SAME: (%T* nocapture nofree readonly [[P:%.*]], i32 [[P2:%.*]])
+; CHECK-NEXT:    [[A_GEP:%.*]] = getelementptr [[T:%.*]], %T* [[P]], i64 0, i32 3
+; CHECK-NEXT:    [[B_GEP:%.*]] = getelementptr [[T]], %T* [[P]], i64 0, i32 2
+; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[A_GEP]]
+; CHECK-NEXT:    [[B:%.*]] = load i32, i32* [[B_GEP]]
+; CHECK-NEXT:    [[V:%.*]] = add i32 [[A]], [[B]]
+; CHECK-NEXT:    [[CA:%.*]] = musttail call i32 @bar(%T* undef, i32 [[V]])
+; CHECK-NEXT:    ret i32 [[CA]]
+;
+  %a.gep = getelementptr %T, %T* %p, i64 0, i32 3
+  %b.gep = getelementptr %T, %T* %p, i64 0, i32 2
+  %a = load i32, i32* %a.gep
+  %b = load i32, i32* %b.gep
+  %v = add i32 %a, %b
+  %ca = musttail call i32 @bar(%T* undef, i32 %v)
+  ret i32 %ca
+}
+
+define i32 @caller2b(%T* %g) {
+; CHECK-LABEL: define {{[^@]+}}@caller2b
+; CHECK-SAME: (%T* nocapture nofree readonly [[G:%.*]])
+; CHECK-NEXT:    [[V:%.*]] = call i32 @test2b(%T* nocapture nofree readonly [[G]], i32 undef)
+; CHECK-NEXT:    ret i32 0
+;
+  %v = call i32 @test2b(%T* %g, i32 0)
+  ret i32 %v
+}

diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll b/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll
index 2f50a9c3d203..2fcde7a92288 100644
--- a/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll
@@ -15,7 +15,6 @@ define i32 @baz() {
 
 define linkonce_odr i32 @foo() {
 ; CHECK-LABEL: define {{[^@]+}}@foo()
-; CHECK-NEXT:    [[VAL:%.*]] = call i32 @baz()
 ; CHECK-NEXT:    ret i32 10
 ;
 

diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll b/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll
index 3e0b575f94f5..339a9fc4b767 100644
--- a/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll
@@ -10,7 +10,6 @@
 define i32 @main() noreturn nounwind {
 ; CHECK-LABEL: define {{[^@]+}}@main()
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[CALL2:%.*]] = tail call i32 @wwrite(i64 0)
 ; CHECK-NEXT:    ret i32 123
 ;
 entry:
@@ -19,18 +18,6 @@ entry:
 }
 
 define internal i32 @wwrite(i64 %i) nounwind readnone {
-; CHECK-LABEL: define {{[^@]+}}@wwrite
-; CHECK-SAME: (i64 [[I:%.*]])
-; CHECK-NEXT:  entry:
-; CHECK-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [
-; CHECK-NEXT:    i64 3, label [[RETURN:%.*]]
-; CHECK-NEXT:    i64 10, label [[RETURN]]
-; CHECK-NEXT:    ]
-; CHECK:       sw.default:
-; CHECK-NEXT:    ret i32 123
-; CHECK:       return:
-; CHECK-NEXT:    unreachable
-;
 entry:
   switch i64 %i, label %sw.default [
   i64 3, label %return

diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll b/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll
index 4bc1b25572d4..cfbef759d41c 100644
--- a/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll
@@ -44,7 +44,6 @@ F:              ; preds = %0
 define i1 @caller(i1 %C) {
 ; CHECK-LABEL: define {{[^@]+}}@caller
 ; CHECK-SAME: (i1 [[C:%.*]])
-; CHECK-NEXT:    [[X:%.*]] = call i32 @foo(i1 [[C]])
 ; CHECK-NEXT:    ret i1 true
 ;
   %X = call i32 @foo( i1 %C )             ; <i32> [#uses=1]

diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll b/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll
index ff33eccb2255..ba3f9f929cd5 100644
--- a/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll
@@ -2,17 +2,6 @@
 ; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=2 < %s | FileCheck %s
 
 define internal i32 @testf(i1 %c) {
-; CHECK-LABEL: define {{[^@]+}}@testf
-; CHECK-SAME: (i1 [[C:%.*]])
-; CHECK-NEXT:  entry:
-; CHECK-NEXT:    br i1 [[C]], label [[IF_COND:%.*]], label [[IF_END:%.*]]
-; CHECK:       if.cond:
-; CHECK-NEXT:    unreachable
-; CHECK:       if.then:
-; CHECK-NEXT:    unreachable
-; CHECK:       if.end:
-; CHECK-NEXT:    ret i32 10
-;
 entry:
   br i1 %c, label %if.cond, label %if.end
 
@@ -27,18 +16,6 @@ if.end:                                          ; preds = %if.then1, %entry
 }
 
 define internal i32 @test1(i1 %c) {
-; CHECK-LABEL: define {{[^@]+}}@test1
-; CHECK-SAME: (i1 [[C:%.*]])
-; CHECK-NEXT:  entry:
-; CHECK-NEXT:    br label [[IF_THEN:%.*]]
-; CHECK:       if.then:
-; CHECK-NEXT:    [[CALL:%.*]] = call i32 @testf(i1 [[C]])
-; CHECK-NEXT:    br label [[RET1:%.*]]
-; CHECK:       ret1:
-; CHECK-NEXT:    ret i32 99
-; CHECK:       ret2:
-; CHECK-NEXT:    unreachable
-;
 entry:
   br label %if.then
 
@@ -57,7 +34,6 @@ ret2:                                           ; preds = %if.then, %entry
 define i32 @main(i1 %c) {
 ; CHECK-LABEL: define {{[^@]+}}@main
 ; CHECK-SAME: (i1 [[C:%.*]])
-; CHECK-NEXT:    [[RES:%.*]] = call i32 @test1(i1 [[C]])
 ; CHECK-NEXT:    ret i32 99
 ;
   %res = call i32 @test1(i1 %c)

diff  --git a/llvm/test/Transforms/Attributor/liveness.ll b/llvm/test/Transforms/Attributor/liveness.ll
index d8e879e02279..4f1cc36f14ce 100644
--- a/llvm/test/Transforms/Attributor/liveness.ll
+++ b/llvm/test/Transforms/Attributor/liveness.ll
@@ -544,6 +544,7 @@ define internal i8* @f3(i8* readnone %0) local_unnamed_addr #0 {
   ret i8* %6
 }
 
+declare void @sink() nofree nosync nounwind willreturn
 define void @test_unreachable() {
 ; CHECK:       define void @test_unreachable()
 ; CHECK-NEXT:    call void @test_unreachable()
@@ -906,6 +907,7 @@ define internal i32 @switch_default(i64 %i) nounwind {
 ; CHECK-NEXT:    i64 10, label [[RETURN]]
 ; CHECK-NEXT:    ]
 ; CHECK:       sw.default:
+; CHECK-NEXT:    call void @sink()
 ; CHECK-NEXT:    ret i32 123
 ; CHECK:       return:
 ; CHECK-NEXT:    unreachable
@@ -917,6 +919,7 @@ entry:
   ]
 
 sw.default:
+  call void @sink()
   ret i32 123
 
 return:
@@ -924,13 +927,35 @@ return:
 }
 
 define i32 @switch_default_caller() {
-; CHECK-LABEL: define {{[^@]+}}@switch_default_caller()
-; CHECK-NEXT:    [[CALL2:%.*]] = tail call i32 @switch_default(i64 0)
-; CHECK-NEXT:    ret i32 123
+; CGSCC-LABEL: define {{[^@]+}}@switch_default_caller()
+; CGSCC-NEXT:    [[CALL2:%.*]] = tail call i32 @switch_default(i64 0)
+; CGSCC-NEXT:    ret i32 123
 ;
   %call2 = tail call i32 @switch_default(i64 0)
   ret i32 %call2
 }
+
+define internal i32 @switch_default_dead(i64 %i) nounwind {
+entry:
+  switch i64 %i, label %sw.default [
+  i64 3, label %return
+  i64 10, label %return
+  ]
+
+sw.default:
+  ret i32 123
+
+return:
+  ret i32 0
+}
+
+define i32 @switch_default_dead_caller() {
+; CHECK-LABEL: define {{[^@]+}}@switch_default_dead_caller()
+; CHECK-NEXT:    ret i32 123
+;
+  %call2 = tail call i32 @switch_default_dead(i64 0)
+  ret i32 %call2
+}
 ; UTC_ARGS: --turn off
 
 ; Allow blockaddress users

diff  --git a/llvm/test/Transforms/Attributor/nonnull.ll b/llvm/test/Transforms/Attributor/nonnull.ll
index 7420a39b8907..f11f3941aaa8 100644
--- a/llvm/test/Transforms/Attributor/nonnull.ll
+++ b/llvm/test/Transforms/Attributor/nonnull.ll
@@ -525,12 +525,14 @@ define i32 addrspace(3)* @as(i32 addrspace(3)* dereferenceable(4) %p) {
   ret i32 addrspace(3)* %p
 }
 
-; ATTRIBUTOR: define internal nonnull align 4 i32* @g2()
+; ATTRIBUTOR-NOT: @g2()
 define internal i32* @g2() {
   ret i32* inttoptr (i64 4 to i32*)
 }
 
-define  i32* @g1() {
+; ATTRIBUTOR: define nonnull align 4 i32* @g1()
+; ATTRIBUTOR:   ret i32* inttoptr (i64 4 to i32*)
+define i32* @g1() {
  %c = call i32* @g2()
   ret i32* %c
 }

diff  --git a/llvm/test/Transforms/Attributor/range.ll b/llvm/test/Transforms/Attributor/range.ll
index 5712c947ccf9..efdb8a5c0019 100644
--- a/llvm/test/Transforms/Attributor/range.ll
+++ b/llvm/test/Transforms/Attributor/range.ll
@@ -705,22 +705,6 @@ define internal i32 @r1(i32) local_unnamed_addr {
 ; 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]]
-;
 ; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@r1
 ; CGSCC_OLD_PM-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr
 ; CGSCC_OLD_PM-NEXT:    br label [[TMP5:%.*]]
@@ -738,23 +722,6 @@ define internal i32 @r1(i32) local_unnamed_addr {
 ; CGSCC_OLD_PM-NEXT:    [[TMP9]] = add nuw nsw i32 [[TMP6]], 1
 ; CGSCC_OLD_PM-NEXT:    [[TMP10:%.*]] = icmp eq i32 [[TMP9]], 100
 ; CGSCC_OLD_PM-NEXT:    br i1 [[TMP10]], label [[TMP2:%.*]], label [[TMP5]]
-;
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@r1
-; CGSCC_NEW_PM-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr
-; CGSCC_NEW_PM-NEXT:    br label [[TMP4:%.*]]
-; CGSCC_NEW_PM:       2:
-; CGSCC_NEW_PM-NEXT:    br label [[F:%.*]]
-; CGSCC_NEW_PM:       3:
-; CGSCC_NEW_PM-NEXT:    unreachable
-; CGSCC_NEW_PM:       f:
-; CGSCC_NEW_PM-NEXT:    ret i32 10
-; CGSCC_NEW_PM:       4:
-; CGSCC_NEW_PM-NEXT:    [[TMP5:%.*]] = phi i32 [ 0, [[TMP1:%.*]] ], [ [[TMP8:%.*]], [[TMP4]] ]
-; CGSCC_NEW_PM-NEXT:    [[TMP6:%.*]] = phi i32 [ 0, [[TMP1]] ], [ [[TMP7:%.*]], [[TMP4]] ]
-; CGSCC_NEW_PM-NEXT:    [[TMP7]] = add nuw nsw i32 [[TMP5]], [[TMP6]]
-; CGSCC_NEW_PM-NEXT:    [[TMP8]] = add nuw nsw i32 [[TMP5]], 1
-; CGSCC_NEW_PM-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100
-; CGSCC_NEW_PM-NEXT:    br i1 [[TMP9]], label [[TMP2:%.*]], label [[TMP4]]
 ;
   br label %5
 
@@ -788,11 +755,10 @@ define void @f1(i32){
 ;
 ; 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:    br label [[TMP3:%.*]]
+; NEW_PM:       2:
 ; NEW_PM-NEXT:    unreachable
-; NEW_PM:       4:
+; NEW_PM:       3:
 ; NEW_PM-NEXT:    ret void
 ;
 ; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@f1
@@ -808,11 +774,10 @@ define void @f1(i32){
 ;
 ; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@f1
 ; CGSCC_NEW_PM-SAME: (i32 [[TMP0:%.*]])
-; CGSCC_NEW_PM-NEXT:    [[TMP2:%.*]] = tail call i32 @r1(i32 [[TMP0]])
-; CGSCC_NEW_PM-NEXT:    br label [[TMP4:%.*]]
-; CGSCC_NEW_PM:       3:
+; CGSCC_NEW_PM-NEXT:    br label [[TMP3:%.*]]
+; CGSCC_NEW_PM:       2:
 ; CGSCC_NEW_PM-NEXT:    unreachable
-; CGSCC_NEW_PM:       4:
+; CGSCC_NEW_PM:       3:
 ; CGSCC_NEW_PM-NEXT:    ret void
 ;
   %2 = tail call i32 @r1(i32 %0)

diff  --git a/llvm/test/Transforms/Attributor/undefined_behavior.ll b/llvm/test/Transforms/Attributor/undefined_behavior.ll
index 8e16a919f483..1d2f6fb430db 100644
--- a/llvm/test/Transforms/Attributor/undefined_behavior.ll
+++ b/llvm/test/Transforms/Attributor/undefined_behavior.ll
@@ -223,7 +223,6 @@ define i1 @ret_undef() {
 
 define void @cond_br_on_undef_interproc() {
 ; ATTRIBUTOR-LABEL: @cond_br_on_undef_interproc(
-; ATTRIBUTOR-NEXT:    %cond = call i1 @ret_undef()
 ; ATTRIBUTOR-NEXT:    unreachable
 ; ATTRIBUTOR:       t:
 ; ATTRIBUTOR-NEXT:    unreachable
@@ -249,7 +248,6 @@ e:
 ; More complicated interproc deduction of undef
 define void @cond_br_on_undef_interproc2() {
 ; ATTRIBUTOR-LABEL: @cond_br_on_undef_interproc2(
-; ATTRIBUTOR-NEXT:    %cond = call i1 @ret_undef2()
 ; ATTRIBUTOR-NEXT:    unreachable
 ; ATTRIBUTOR:       t:
 ; ATTRIBUTOR-NEXT:    unreachable


        


More information about the llvm-commits mailing list