brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · 00891cf Raw
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