| ; 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]] = !{} | |
| ;. |