blob: 9a9ec05dc0e8f2eb4ef5301b8d6fac8e334f1e06 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -passes=attributor -S < %s | FileCheck %s --check-prefixes=CHECK,MODULE
; RUN: opt -passes=attributor-cgscc -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC
; A callback argument number is not necessarily the corresponding broker
; operand number. Make sure the alias comparison skips the actual call-site
; operand, rather than an unrelated mapped argument.
define void @caller(i64 %value) {
; CHECK-LABEL: define void @caller(
; CHECK-SAME: i64 [[VALUE:%.*]]) {
; CHECK-NEXT: [[SLOT:%.*]] = alloca i64, align 8
; CHECK-NEXT: store i64 [[VALUE]], ptr [[SLOT]], align 8
; CHECK-NEXT: call void @broker(ptr noundef nonnull @callback, ptr nofree noundef nonnull writeonly align 8 captures(none) dereferenceable(8) [[SLOT]], ptr nofree noundef nonnull readonly align 8 captures(none) dereferenceable(8) [[SLOT]])
; CHECK-NEXT: ret void
;
%slot = alloca i64, align 8
store i64 %value, ptr %slot, align 8
call void @broker(ptr @callback, ptr %slot, ptr %slot)
ret void
}
define internal void @callback(ptr align 8 dereferenceable(8) %a,
; MODULE-LABEL: define internal void @callback(
; MODULE-SAME: ptr nofree noundef nonnull writeonly align 8 captures(none) dereferenceable(8) [[A:%.*]], ptr nofree noundef nonnull readonly align 8 captures(none) dereferenceable(8) [[B:%.*]]) {
; MODULE-NEXT: store i64 0, ptr [[A]], align 8
; MODULE-NEXT: call void @sync()
; MODULE-NEXT: [[VALUE:%.*]] = load i64, ptr [[B]], align 8
; MODULE-NEXT: call void @use(i64 [[VALUE]])
; MODULE-NEXT: ret void
;
; CGSCC-LABEL: define internal void @callback(
; CGSCC-SAME: ptr nofree noundef nonnull writeonly align 8 captures(none) dereferenceable(8) [[A:%.*]], ptr nofree noundef nonnull readonly align 8 captures(none) dereferenceable(8) [[B:%.*]]) {
; CGSCC-NEXT: store i64 0, ptr [[A]], align 8
; CGSCC-NEXT: call void @sync()
; CGSCC-NEXT: [[VALUE:%.*]] = load i64, ptr [[B]], align 8, !invariant.load [[META0:![0-9]+]]
; CGSCC-NEXT: call void @use(i64 [[VALUE]])
; CGSCC-NEXT: ret void
;
ptr align 8 dereferenceable(8) %b) {
store i64 0, ptr %a, align 8
call void @sync()
%value = load i64, ptr %b, align 8
call void @use(i64 %value)
ret void
}
declare !callback !0 void @broker(ptr, ptr, ptr)
declare void @sync()
declare void @use(i64) memory(none)
!0 = !{!1}
!1 = !{i64 0, i64 1, i64 2, i1 false}
;.
; CGSCC: [[META0]] = !{}
;.