[llvm] 137c99a - [Attributor][FIX] Restrict cross-SCC call deletion

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 14 19:45:49 PST 2020


Author: Johannes Doerfert
Date: 2020-02-14T21:44:46-06:00
New Revision: 137c99a6a5cd419086824035c1498baddbd46962

URL: https://github.com/llvm/llvm-project/commit/137c99a6a5cd419086824035c1498baddbd46962
DIFF: https://github.com/llvm/llvm-project/commit/137c99a6a5cd419086824035c1498baddbd46962.diff

LOG: [Attributor][FIX] Restrict cross-SCC call deletion

If we know a call was not needed we might have ended up deleting it even
if it was in a different SCC. This prevents us from doing so.

Added: 
    

Modified: 
    llvm/lib/Transforms/IPO/Attributor.cpp
    llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll
    llvm/test/Transforms/Attributor/range.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index e7b8927fe7eb..0ca65eb55566 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -7481,6 +7481,10 @@ ChangeStatus Attributor::run() {
       LLVM_DEBUG(dbgs() << "Use " << *NewV << " in " << *U->getUser()
                         << " instead of " << *OldV << "\n");
       U->set(NewV);
+      // Do not modify call instructions outside the SCC.
+      if (auto *CB = dyn_cast<CallBase>(OldV))
+        if (!Functions.count(CB->getCaller()))
+          continue;
       if (Instruction *I = dyn_cast<Instruction>(OldV)) {
         CGModifiedFunctions.insert(I->getFunction());
         if (!isa<PHINode>(I) && !ToBeDeletedInsts.count(I) &&

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 23715ae2da7c..c69842119ec6 100644
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll
@@ -1,12 +1,13 @@
 ; 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=4 < %s | FileCheck %s --check-prefixes=CHECK
-; RUN: opt -S -basicaa -attributor-cgscc -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %s | FileCheck %s --check-prefixes=CHECK
-; RUN: opt -S -passes='attributor-cgscc' -aa-pipeline='basic-aa' -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK
+; RUN: opt -S -basicaa -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %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=4 < %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
 
-; CHECK-NOT: @dead(
-; CHECK-NOT: @test(
-; CHECK-NOT: @caller(
+; OLDPM_MODULE-NOT: @dead
+; NEWPM_MODULE-NOT: @dead
+; OLDPM_CGSCC-NOT: @dead
+; NEWPM_CGSCC-NOT: @dead
 
 define internal void @dead() {
   call i32 @test(i32* null, i32* null)
@@ -14,6 +15,24 @@ define internal void @dead() {
 }
 
 define internal i32 @test(i32* %X, i32* %Y) {
+; OLDPM_CGSCC-LABEL: define {{[^@]+}}@test
+; OLDPM_CGSCC-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])
+; OLDPM_CGSCC-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]
+; OLDPM_CGSCC:       live:
+; OLDPM_CGSCC-NEXT:    store i32 0, i32* [[X]], align 4
+; OLDPM_CGSCC-NEXT:    ret i32 undef
+; OLDPM_CGSCC:       dead:
+; OLDPM_CGSCC-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 undef
+; NEWPM_CGSCC:       dead:
+; NEWPM_CGSCC-NEXT:    unreachable
+;
   br i1 true, label %live, label %dead
 live:
   store i32 0, i32* %X
@@ -25,6 +44,18 @@ dead:
 }
 
 define internal i32 @caller(i32* %B) {
+; OLDPM_CGSCC-LABEL: define {{[^@]+}}@caller()
+; OLDPM_CGSCC-NEXT:    [[A:%.*]] = alloca i32
+; OLDPM_CGSCC-NEXT:    store i32 1, i32* [[A]], align 4
+; OLDPM_CGSCC-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])
+; OLDPM_CGSCC-NEXT:    ret i32 0
+;
+; NEWPM_CGSCC-LABEL: define {{[^@]+}}@caller()
+; NEWPM_CGSCC-NEXT:    [[A:%.*]] = alloca i32
+; NEWPM_CGSCC-NEXT:    store i32 1, i32* [[A]], align 4
+; NEWPM_CGSCC-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])
+; NEWPM_CGSCC-NEXT:    ret i32 undef
+;
   %A = alloca i32
   store i32 1, i32* %A
   %C = call i32 @test(i32* %A, i32* %B)

diff  --git a/llvm/test/Transforms/Attributor/range.ll b/llvm/test/Transforms/Attributor/range.ll
index 4f2c941f4f42..f943f650a02c 100644
--- a/llvm/test/Transforms/Attributor/range.ll
+++ b/llvm/test/Transforms/Attributor/range.ll
@@ -722,6 +722,23 @@ 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
 


        


More information about the llvm-commits mailing list