// RUN: fir-opt --function-attr="set-noalias=true" %s | FileCheck %s // Test the annotation of function arguments with llvm.noalias. // Test !fir.ref arguments. // CHECK-LABEL: func.func private @test_ref( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref {llvm.noalias}) { func.func private @test_ref(%arg0: !fir.ref) { return } // CHECK-LABEL: func.func private @test_ref_target( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.target}) { func.func private @test_ref_target(%arg0: !fir.ref {fir.target}) { return } // CHECK-LABEL: func.func private @test_ref_volatile( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.volatile}) { func.func private @test_ref_volatile(%arg0: !fir.ref {fir.volatile}) { return } // CHECK-LABEL: func.func private @test_ref_asynchronous( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.asynchronous}) { func.func private @test_ref_asynchronous(%arg0: !fir.ref {fir.asynchronous}) { return } // CHECK-LABEL: func.func private @test_ref_box( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref> {llvm.noalias}) { // Test !fir.ref> arguments: func.func private @test_ref_box(%arg0: !fir.ref>) { return } // CHECK-LABEL: func.func private @test_ref_box_target( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref> {fir.target}) { func.func private @test_ref_box_target(%arg0: !fir.ref> {fir.target}) { return } // CHECK-LABEL: func.func private @test_ref_box_volatile( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref> {fir.volatile}) { func.func private @test_ref_box_volatile(%arg0: !fir.ref> {fir.volatile}) { return } // CHECK-LABEL: func.func private @test_ref_box_asynchronous( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref> {fir.asynchronous}) { func.func private @test_ref_box_asynchronous(%arg0: !fir.ref> {fir.asynchronous}) { return } // Test POINTER arguments. // CHECK-LABEL: func.func private @test_ref_box_ptr( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref>>) { func.func private @test_ref_box_ptr(%arg0: !fir.ref>>) { return } // Test ALLOCATABLE arguments. // CHECK-LABEL: func.func private @test_ref_box_heap( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref>> {llvm.noalias}) { func.func private @test_ref_box_heap(%arg0: !fir.ref>>) { return } // BIND(C) functions are not annotated. // CHECK-LABEL: func.func private @test_ref_bindc( // CHECK-SAME: %[[ARG0:.*]]: !fir.ref) func.func private @test_ref_bindc(%arg0: !fir.ref) attributes {fir.bindc_name = "test_ref_bindc", fir.proc_attrs = #fir.proc_attrs} { return } // Test function declaration from a module. // CHECK-LABEL: func.func private @_QMtest_modPcheck_module( // CHECK-SAME: !fir.ref {llvm.noalias}) func.func private @_QMtest_modPcheck_module(!fir.ref) // Test !fir.box arguments: // CHECK-LABEL: func.func private @test_box( // CHECK-SAME: %[[ARG0:.*]]: !fir.box {llvm.noalias}) { func.func private @test_box(%arg0: !fir.box) { return } // CHECK-LABEL: func.func private @test_box_target( // CHECK-SAME: %[[ARG0:.*]]: !fir.box {fir.target, llvm.noalias}) { func.func private @test_box_target(%arg0: !fir.box {fir.target}) { return } // CHECK-LABEL: func.func private @test_box_volatile( // CHECK-SAME: %[[ARG0:.*]]: !fir.box {fir.volatile, llvm.noalias}) { func.func private @test_box_volatile(%arg0: !fir.box {fir.volatile}) { return } // CHECK-LABEL: func.func private @test_box_asynchronous( // CHECK-SAME: %[[ARG0:.*]]: !fir.box {fir.asynchronous, llvm.noalias}) { func.func private @test_box_asynchronous(%arg0: !fir.box {fir.asynchronous}) { return } // !fir.boxchar<> is lowered before FunctionAttrPass, but let's // make sure we do not annotate it. // CHECK-LABEL: func.func private @test_boxchar( // CHECK-SAME: %[[ARG0:.*]]: !fir.boxchar<1>) { func.func private @test_boxchar(%arg0: !fir.boxchar<1>) { return }