[llvm] f622446 - [OpenMP][FIX] Ensure combing accesses does not violate invariants

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 12 20:56:55 PST 2022


Author: Johannes Doerfert
Date: 2022-12-12T20:55:36-08:00
New Revision: f6224467690b0e49f37f4b33f6a9d7a434e88de5

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

LOG: [OpenMP][FIX] Ensure combing accesses does not violate invariants

Added: 
    llvm/test/Transforms/OpenMP/reduced_pointer_info_assertion.ll

Modified: 
    llvm/include/llvm/Transforms/IPO/Attributor.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index 28cb568f081ea..99e151e861466 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -5041,6 +5041,11 @@ struct AAPointerInfo : public AbstractAttribute {
       assert(RemoteI == R.RemoteI && "Expected same instruction!");
       assert(LocalI == R.LocalI && "Expected same instruction!");
       Kind = AccessKind(Kind | R.Kind);
+      // If we combine a may and a must access we clear the must bit.
+      if (Kind & AK_MUST && Kind & AK_MAY) {
+        Kind = AccessKind(Kind | AK_MAY);
+        Kind = AccessKind(Kind & ~AK_MUST);
+      }
       auto Before = Range;
       Range &= R.Range;
       if (Before.isUnassigned() || Before == Range) {

diff  --git a/llvm/test/Transforms/OpenMP/reduced_pointer_info_assertion.ll b/llvm/test/Transforms/OpenMP/reduced_pointer_info_assertion.ll
new file mode 100644
index 0000000000000..1b132df039dd2
--- /dev/null
+++ b/llvm/test/Transforms/OpenMP/reduced_pointer_info_assertion.ll
@@ -0,0 +1,53 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -S -passes=openmp-opt | FileCheck %s --check-prefix=MODULE
+; RUN: opt < %s -S -passes=openmp-opt-cgscc | FileCheck %s --check-prefix=CGSCC
+
+target triple = "nvptx64-nvidia-cuda"
+
+declare noalias ptr @alloc()
+
+define internal i32 @nblist() {
+; MODULE-LABEL: define {{[^@]+}}@nblist(
+; MODULE-NEXT:    [[TMP1:%.*]] = call ptr @alloc()
+; MODULE-NEXT:    call fastcc void @rec.internalized(ptr [[TMP1]], i64 0)
+; MODULE-NEXT:    ret i32 0
+;
+; CGSCC-LABEL: define {{[^@]+}}@nblist(
+; CGSCC-NEXT:    [[TMP1:%.*]] = call ptr @alloc()
+; CGSCC-NEXT:    call fastcc void @rec(ptr [[TMP1]], i64 0)
+; CGSCC-NEXT:    ret i32 0
+;
+  %1 = call ptr @alloc()
+  call fastcc void @rec(ptr %1, i64 0)
+  ret i32 0
+}
+
+define fastcc void @rec(ptr %0, i64 %1) {
+; MODULE-LABEL: define {{[^@]+}}@rec(
+; MODULE-NEXT:    [[TMP3:%.*]] = getelementptr i32, ptr [[TMP0:%.*]], i64 [[TMP1:%.*]]
+; MODULE-NEXT:    store i32 0, ptr [[TMP3]], align 4
+; MODULE-NEXT:    call fastcc void @rec(ptr [[TMP0]], i64 0)
+; MODULE-NEXT:    ret void
+;
+; CGSCC-LABEL: define {{[^@]+}}@rec(
+; CGSCC-NEXT:    [[TMP3:%.*]] = getelementptr i32, ptr [[TMP0:%.*]], i64 [[TMP1:%.*]]
+; CGSCC-NEXT:    store i32 0, ptr [[TMP3]], align 4
+; CGSCC-NEXT:    call fastcc void @rec(ptr [[TMP0]], i64 0)
+; CGSCC-NEXT:    ret void
+;
+; CHECK-LABEL: define {{[^@]+}}@rec(
+; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i32, ptr [[TMP0:%.*]], i64 [[TMP1:%.*]]
+; CHECK-NEXT:    store i32 0, ptr [[TMP3]], align 4
+; CHECK-NEXT:    call fastcc void @rec(ptr [[TMP0]], i64 0)
+; CHECK-NEXT:    ret void
+;
+  %3 = getelementptr i32, ptr %0, i64 %1
+  store i32 0, ptr %3, align 4
+  call fastcc void @rec(ptr %0, i64 0)
+  ret void
+}
+
+!llvm.module.flags = !{!0, !1}
+
+!0 = !{i32 7, !"openmp", i32 50}
+!1 = !{i32 7, !"openmp-device", i32 50}


        


More information about the llvm-commits mailing list