From 1e06efcc5cc0beb6cb97c1a747b6f8257d39b801 Mon Sep 17 00:00:00 2001 From: Alireza Torabian Date: Wed, 6 Nov 2024 13:18:34 -0500 Subject: [PATCH] [Flang2] Fix duplicate TBAA type systems across modules In Flang, functions within the same module are assigned unique TBAA type system IDs based on their order, but functions in different modules can unintentionally receive the same ID, leading to incorrect non-aliasing results. This commit resolves the issue by appending a hash of the module name to each function type system metadata, ensuring unique type systems across modules and preventing aliasing errors. --- .../tbaa_multimod_01_callee.f90 | 24 +++++++++++++++++++ .../tbaa_multimod_01_caller.f90 | 18 ++++++++++++++ .../tbaa_multimod_02_callee.f90 | 12 ++++++++++ .../tbaa_multimod_02_caller.f90 | 14 +++++++++++ tools/flang2/flang2exe/cgmain.cpp | 10 ++++---- 5 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 test/llvm_ir_correct/tbaa_multimod_01_callee.f90 create mode 100644 test/llvm_ir_correct/tbaa_multimod_01_caller.f90 create mode 100644 test/llvm_ir_correct/tbaa_multimod_02_callee.f90 create mode 100644 test/llvm_ir_correct/tbaa_multimod_02_caller.f90 diff --git a/test/llvm_ir_correct/tbaa_multimod_01_callee.f90 b/test/llvm_ir_correct/tbaa_multimod_01_callee.f90 new file mode 100644 index 00000000000..19500aba083 --- /dev/null +++ b/test/llvm_ir_correct/tbaa_multimod_01_callee.f90 @@ -0,0 +1,24 @@ +! A part of the test provided in tbaa_multimod_01_caller.f90 +! Empty RUN and CHECK to prevent error +! RUN: echo "NoCheck" | FileCheck %s +! CHECK: NoCheck +subroutine modify1(arr) + implicit none + real, intent(inout) :: arr(:) + arr(0) = arr(0) + 0.5 +end subroutine modify1 + +subroutine modify2(arr) + implicit none + real, intent(inout) :: arr(:) + arr(2) = arr(2) + 1.5 +end subroutine modify2 + +subroutine printout(arr) + implicit none + real, intent(in) :: arr(:) + integer :: i + do i = 1, size(arr) + print arr(i), " " + enddo +end subroutine printout diff --git a/test/llvm_ir_correct/tbaa_multimod_01_caller.f90 b/test/llvm_ir_correct/tbaa_multimod_01_caller.f90 new file mode 100644 index 00000000000..0be7b817a1f --- /dev/null +++ b/test/llvm_ir_correct/tbaa_multimod_01_caller.f90 @@ -0,0 +1,18 @@ +! This test contians two files, tbaa_multimod_01_caller.f90 and tbaa_multimod_01_callee.f90 +! RUN: %flang -Wl,-mllvm,-aa-trace -fuse-ld=llvm-lto -flto=full -O3 %s %S/tbaa_multimod_01_callee.f90 -o - 2>&1 1>- | FileCheck %s +! CHECK: End ptr getelementptr (%struct.BSS1, ptr @.BSS1, i64 -1, i32 0, i64 16) @ LocationSize::precise(16), ptr inttoptr (i64 56 to ptr) @ LocationSize::precise(8) = MayAlias + +program main + implicit none + integer, parameter :: n = 5 + real :: arr(n) + integer :: i + i = 0 + arr = 3.2 + arr(i) = 4 + call modify1(arr) + call modify2(arr) + + arr(i) = arr(i) + 2.5 + call printout(arr) +end program main diff --git a/test/llvm_ir_correct/tbaa_multimod_02_callee.f90 b/test/llvm_ir_correct/tbaa_multimod_02_callee.f90 new file mode 100644 index 00000000000..6a150abb84d --- /dev/null +++ b/test/llvm_ir_correct/tbaa_multimod_02_callee.f90 @@ -0,0 +1,12 @@ +! A part of the test provided in tbaa_multimod_02_caller.f90 +! Empty RUN and CHECK to prevent error +! RUN: echo "NoCheck" | FileCheck %s +! CHECK: NoCheck +subroutine to_load(arr) + implicit none + real, intent(inout) :: arr(:) + real :: var + var = arr(0) + var = var * 2 + print var +end subroutine to_load diff --git a/test/llvm_ir_correct/tbaa_multimod_02_caller.f90 b/test/llvm_ir_correct/tbaa_multimod_02_caller.f90 new file mode 100644 index 00000000000..ff880ab9fcc --- /dev/null +++ b/test/llvm_ir_correct/tbaa_multimod_02_caller.f90 @@ -0,0 +1,14 @@ +! This test contians two files, tbaa_multimod_02_caller.f90 and tbaa_multimod_02_callee.f90 +! RUN: %flang -Wl,-mllvm,-aa-trace -fuse-ld=llvm-lto -flto=full -O3 %s %S/tbaa_multimod_02_callee.f90 -o - 2>&1 1>- | FileCheck %s +! CHECK: End ptr getelementptr inbounds (%struct.BSS1, ptr @.BSS1, i64 0, i32 0, i64 16) @ LocationSize::precise(4), ptr inttoptr (i64 56 to ptr) @ LocationSize::precise(8) = MayAlias + +program main + implicit none + integer, parameter :: n = 5 + real :: arr(n) + integer :: i + arr = 1 + call to_load(arr) + arr(0) = 4 + call to_load(arr) +end program main diff --git a/tools/flang2/flang2exe/cgmain.cpp b/tools/flang2/flang2exe/cgmain.cpp index 9b102aca3c1..0f39a221750 100644 --- a/tools/flang2/flang2exe/cgmain.cpp +++ b/tools/flang2/flang2exe/cgmain.cpp @@ -15,6 +15,10 @@ #include "ll_ftn.h" #include "exp_rte.h" #include "error.h" +#include +#include +#include +#include #include "machreg.h" #include "dinit.h" #include "cg.h" @@ -25,9 +29,6 @@ #include "lldebug.h" #include "go.h" #include "sharedefs.h" -#include -#include -#include #include "llassem.h" #include "ll_write.h" #include "expand.h" @@ -2643,7 +2644,8 @@ get_omnipotent_pointer(LL_Module *module) const char *baseName = "Flang FAA"; const char *const omniName = "unlimited ptr"; const char *const unObjName = "unref ptr"; - snprintf(baseBuff, 32, "%s %x", baseName, funcId); + snprintf(baseBuff, 32, "%s %zx %x", baseName, + std::hash{}(current_module->module_name), funcId); s0 = ll_get_md_string(module, baseBuff); r0 = ll_get_md_node(module, LL_PlainMDNode, &s0, 1); a[0] = ll_get_md_string(module, unObjName);