1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals 2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT 3; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC 4; PR14710 5 6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 7 8%pair = type { i32, i32 } 9 10declare ptr @foo(ptr) 11 12define internal void @bar(ptr byval(%pair) %Data) { 13; TUNIT: Function Attrs: memory(readwrite, argmem: none) 14; TUNIT-LABEL: define {{[^@]+}}@bar 15; TUNIT-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] { 16; TUNIT-NEXT: [[DATA_PRIV:%.*]] = alloca [[PAIR:%.*]], align 8 17; TUNIT-NEXT: store i32 [[TMP0]], ptr [[DATA_PRIV]], align 4 18; TUNIT-NEXT: [[DATA_PRIV_B4:%.*]] = getelementptr i8, ptr [[DATA_PRIV]], i64 4 19; TUNIT-NEXT: store i32 [[TMP1]], ptr [[DATA_PRIV_B4]], align 4 20; TUNIT-NEXT: [[TMP3:%.*]] = call ptr @foo(ptr nonnull dereferenceable(8) [[DATA_PRIV]]) 21; TUNIT-NEXT: ret void 22; 23; CGSCC: Function Attrs: memory(readwrite, argmem: none) 24; CGSCC-LABEL: define {{[^@]+}}@bar 25; CGSCC-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] { 26; CGSCC-NEXT: [[DATA_PRIV:%.*]] = alloca [[PAIR:%.*]], align 8 27; CGSCC-NEXT: store i32 [[TMP0]], ptr [[DATA_PRIV]], align 4 28; CGSCC-NEXT: [[DATA_PRIV_B4:%.*]] = getelementptr i8, ptr [[DATA_PRIV]], i64 4 29; CGSCC-NEXT: store i32 [[TMP1]], ptr [[DATA_PRIV_B4]], align 4 30; CGSCC-NEXT: [[TMP3:%.*]] = call ptr @foo(ptr noundef nonnull dereferenceable(8) [[DATA_PRIV]]) 31; CGSCC-NEXT: ret void 32; 33 tail call ptr @foo(ptr %Data) 34 ret void 35} 36 37define void @zed(ptr byval(%pair) %Data) { 38; TUNIT-LABEL: define {{[^@]+}}@zed 39; TUNIT-SAME: (ptr noalias nonnull readonly byval([[PAIR:%.*]]) captures(none) dereferenceable(8) [[DATA:%.*]]) { 40; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[DATA]], align 1 41; TUNIT-NEXT: [[DATA_B4:%.*]] = getelementptr i8, ptr [[DATA]], i64 4 42; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DATA_B4]], align 1 43; TUNIT-NEXT: call void @bar(i32 [[TMP1]], i32 [[TMP2]]) 44; TUNIT-NEXT: ret void 45; 46; CGSCC-LABEL: define {{[^@]+}}@zed 47; CGSCC-SAME: (ptr noalias nofree noundef nonnull readonly byval([[PAIR:%.*]]) captures(none) dereferenceable(8) [[DATA:%.*]]) { 48; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr [[DATA]], align 1 49; CGSCC-NEXT: [[DATA_B4:%.*]] = getelementptr i8, ptr [[DATA]], i64 4 50; CGSCC-NEXT: [[TMP2:%.*]] = load i32, ptr [[DATA_B4]], align 1 51; CGSCC-NEXT: call void @bar(i32 [[TMP1]], i32 [[TMP2]]) 52; CGSCC-NEXT: ret void 53; 54 call void @bar(ptr byval(%pair) %Data) 55 ret void 56} 57;. 58; TUNIT: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) } 59;. 60; CGSCC: attributes #[[ATTR0]] = { memory(readwrite, argmem: none) } 61;. 62;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 63; CHECK: {{.*}} 64