[llvm] 7ccf4d1 - [Attributor][FIX] Account for blocks w/o predecessors

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 27 21:30:53 PDT 2023


Author: Johannes Doerfert
Date: 2023-03-27T21:30:23-07:00
New Revision: 7ccf4d1ad744355c09d938ba010a6d6f820a735f

URL: https://github.com/llvm/llvm-project/commit/7ccf4d1ad744355c09d938ba010a6d6f820a735f
DIFF: https://github.com/llvm/llvm-project/commit/7ccf4d1ad744355c09d938ba010a6d6f820a735f.diff

LOG: [Attributor][FIX] Account for blocks w/o predecessors

Added: 
    llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll

Modified: 
    llvm/lib/Transforms/IPO/AttributorAttributes.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index db4ad5343810e..3a092997301b7 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -1700,6 +1700,8 @@ ChangeStatus AAPointerInfoFloating::updateImpl(Attributor &A) {
             return false;
         } else {
           auto PredIt = pred_begin(IntrBB);
+          if (PredIt == pred_end(IntrBB))
+            return false;
           if ((*PredIt) != BB)
             return false;
           if (++PredIt != pred_end(IntrBB))

diff  --git a/llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll b/llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll
new file mode 100644
index 0000000000000..14842cffb298b
--- /dev/null
+++ b/llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll
@@ -0,0 +1,52 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes --check-attributes --check-globals
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC
+
+%"struct.ompx::state::TeamStateTy" = type { %"struct.ompx::state::ICVStateTy", i32, i32, ptr }
+%"struct.ompx::state::ICVStateTy" = type { i32, i32, i32, i32, i32, i32 }
+
+ at _ZN4ompx5state9TeamStateE = internal addrspace(3) global %"struct.ompx::state::TeamStateTy" undef
+
+; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
+declare void @llvm.assume(i1 noundef) #0
+
+;.
+; CHECK: @[[_ZN4OMPX5STATE9TEAMSTATEE:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global %"struct.ompx::state::TeamStateTy" undef
+;.
+define weak_odr amdgpu_kernel void @__omp_offloading_16_19bc70bc_main_l44() {
+; CHECK-LABEL: define {{[^@]+}}@__omp_offloading_16_19bc70bc_main_l44() {
+; CHECK-NEXT:    ret void
+;
+  call fastcc void @__omp_outlined__()
+  ret void
+}
+
+define internal fastcc void @__omp_outlined__() {
+; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CGSCC-LABEL: define {{[^@]+}}@__omp_outlined__
+; CGSCC-SAME: () #[[ATTR1:[0-9]+]] {
+; CGSCC-NEXT:    br label [[TMP2:%.*]]
+; CGSCC:       1:
+; CGSCC-NEXT:    unreachable
+; CGSCC:       2:
+; CGSCC-NEXT:    ret void
+;
+  %1 = load i32, ptr getelementptr inbounds (i8, ptr addrspacecast (ptr addrspace(3) @_ZN4ompx5state9TeamStateE to ptr), i64 4), align 4
+  br label %4
+
+2:                                                ; No predecessors!
+  %3 = icmp eq i32 %1, 0
+  call void @llvm.assume(i1 %3)
+  br label %4
+
+4:                                                ; preds = %2, %0
+  ret void
+}
+;.
+; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
+;.
+; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
+; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) }
+;.
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; TUNIT: {{.*}}


        


More information about the llvm-commits mailing list