190 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT3; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC4 5declare void @unknown() nocallback6 7define i32 @many_writes_nosycn(i1 %c0, i1 %c1, i1 %c2) nosync {8; CHECK: Function Attrs: norecurse nosync9; CHECK-LABEL: define {{[^@]+}}@many_writes_nosycn10; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR1:[0-9]+]] {11; CHECK-NEXT: [[P:%.*]] = alloca i32, align 412; CHECK-NEXT: call void @unknown()13; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]14; CHECK: t0:15; CHECK-NEXT: call void @unknown()16; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[M1:%.*]]17; CHECK: f0:18; CHECK-NEXT: call void @unknown()19; CHECK-NEXT: br i1 [[C2]], label [[F1:%.*]], label [[M1]]20; CHECK: t1:21; CHECK-NEXT: call void @unknown()22; CHECK-NEXT: store i32 7, ptr [[P]], align 423; CHECK-NEXT: br label [[M2:%.*]]24; CHECK: f1:25; CHECK-NEXT: call void @unknown()26; CHECK-NEXT: store i32 9, ptr [[P]], align 427; CHECK-NEXT: br label [[M2]]28; CHECK: m1:29; CHECK-NEXT: call void @unknown()30; CHECK-NEXT: store i32 11, ptr [[P]], align 431; CHECK-NEXT: br label [[M2]]32; CHECK: m2:33; CHECK-NEXT: call void @unknown()34; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[P]], align 435; CHECK-NEXT: ret i32 [[L]]36;37 %p = alloca i3238 store i32 0, ptr %p39 call void @unknown()40 store i32 1, ptr %p41 br i1 %c0, label %t0, label %f042t0:43 store i32 2, ptr %p44 call void @unknown()45 store i32 3, ptr %p46 br i1 %c1, label %t1, label %m147f0:48 store i32 4, ptr %p49 call void @unknown()50 store i32 5, ptr %p51 br i1 %c2, label %f1, label %m152t1:53 store i32 6, ptr %p54 call void @unknown()55 store i32 7, ptr %p56 br label %m257f1:58 store i32 8, ptr %p59 call void @unknown()60 store i32 9, ptr %p61 br label %m262m1:63 store i32 10, ptr %p64 call void @unknown()65 store i32 11, ptr %p66 br label %m267m2:68 call void @unknown()69 %l = load i32, ptr %p70 ret i32 %l71}72 73define i32 @many_writes(i1 %c0, i1 %c1, i1 %c2) {74; CHECK: Function Attrs: norecurse75; CHECK-LABEL: define {{[^@]+}}@many_writes76; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR2:[0-9]+]] {77; CHECK-NEXT: [[P:%.*]] = alloca i32, align 478; CHECK-NEXT: call void @unknown()79; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]80; CHECK: t0:81; CHECK-NEXT: call void @unknown()82; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[M1:%.*]]83; CHECK: f0:84; CHECK-NEXT: call void @unknown()85; CHECK-NEXT: br i1 [[C2]], label [[F1:%.*]], label [[M1]]86; CHECK: t1:87; CHECK-NEXT: call void @unknown()88; CHECK-NEXT: store i32 7, ptr [[P]], align 489; CHECK-NEXT: br label [[M2:%.*]]90; CHECK: f1:91; CHECK-NEXT: call void @unknown()92; CHECK-NEXT: store i32 9, ptr [[P]], align 493; CHECK-NEXT: br label [[M2]]94; CHECK: m1:95; CHECK-NEXT: call void @unknown()96; CHECK-NEXT: store i32 11, ptr [[P]], align 497; CHECK-NEXT: br label [[M2]]98; CHECK: m2:99; CHECK-NEXT: call void @unknown()100; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[P]], align 4101; CHECK-NEXT: ret i32 [[L]]102;103 %p = alloca i32104 store i32 0, ptr %p105 call void @unknown()106 store i32 1, ptr %p107 br i1 %c0, label %t0, label %f0108t0:109 store i32 2, ptr %p110 call void @unknown()111 store i32 3, ptr %p112 br i1 %c1, label %t1, label %m1113f0:114 store i32 4, ptr %p115 call void @unknown()116 store i32 5, ptr %p117 br i1 %c2, label %f1, label %m1118t1:119 store i32 6, ptr %p120 call void @unknown()121 store i32 7, ptr %p122 br label %m2123f1:124 store i32 8, ptr %p125 call void @unknown()126 store i32 9, ptr %p127 br label %m2128m1:129 store i32 10, ptr %p130 call void @unknown()131 store i32 11, ptr %p132 br label %m2133m2:134 call void @unknown()135 %l = load i32, ptr %p136 ret i32 %l137}138 139declare void @usei32(i32) nocallback140; Ensure we use 42, not undef, for %l in the usei32 call and %r in the return.141define internal i32 @remote_write_and_read(ptr %p) norecurse {142; TUNIT: Function Attrs: norecurse143; TUNIT-LABEL: define {{[^@]+}}@remote_write_and_read144; TUNIT-SAME: (ptr noalias nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR2]] {145; TUNIT-NEXT: call void @usei32(i32 noundef 42)146; TUNIT-NEXT: ret i32 undef147;148; CGSCC: Function Attrs: norecurse149; CGSCC-LABEL: define {{[^@]+}}@remote_write_and_read150; CGSCC-SAME: (ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR2]] {151; CGSCC-NEXT: store i32 42, ptr [[P]], align 4152; CGSCC-NEXT: [[L:%.*]] = load i32, ptr [[P]], align 4153; CGSCC-NEXT: call void @usei32(i32 [[L]])154; CGSCC-NEXT: ret i32 [[L]]155;156 store i32 42, ptr %p157 %l = load i32, ptr %p158 call void @usei32(i32 %l)159 ret i32 %l160}161 162define i32 @local_stack_remote_write_and_read() norecurse {163; TUNIT: Function Attrs: norecurse164; TUNIT-LABEL: define {{[^@]+}}@local_stack_remote_write_and_read165; TUNIT-SAME: () #[[ATTR2]] {166; TUNIT-NEXT: [[A:%.*]] = alloca i32, align 4167; TUNIT-NEXT: [[R:%.*]] = call i32 @remote_write_and_read(ptr noalias nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[A]])168; TUNIT-NEXT: ret i32 42169;170; CGSCC: Function Attrs: norecurse171; CGSCC-LABEL: define {{[^@]+}}@local_stack_remote_write_and_read172; CGSCC-SAME: () #[[ATTR2]] {173; CGSCC-NEXT: [[A:%.*]] = alloca i32, align 4174; CGSCC-NEXT: [[R:%.*]] = call i32 @remote_write_and_read(ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[A]])175; CGSCC-NEXT: ret i32 [[R]]176;177 %a = alloca i32178 %r = call i32 @remote_write_and_read(ptr %a)179 ret i32 %r180}181;.182; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback }183; TUNIT: attributes #[[ATTR1]] = { norecurse nosync }184; TUNIT: attributes #[[ATTR2]] = { norecurse }185;.186; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback }187; CGSCC: attributes #[[ATTR1]] = { norecurse nosync }188; CGSCC: attributes #[[ATTR2]] = { norecurse }189;.190