; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals ; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" ; Test cases specifically designed for "align" attribute. ; We use FIXME's to indicate problems and missing attributes. ; TEST 1 ;; ;. ; CHECK: @[[A1:[a-zA-Z0-9_$"\\.-]+]] = common global i8 0, align 8 ; CHECK: @[[A2:[a-zA-Z0-9_$"\\.-]+]] = common global i8 0, align 16 ; CHECK: @[[CND:[a-zA-Z0-9_$"\\.-]+]] = external global i1 ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = global i8 0, align 32 ;. define ptr @test1(ptr align 8 %0) #0 { ; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test1 ; CHECK-SAME: (ptr nofree readnone returned align 8 "no-capture-maybe-returned" [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret ptr [[TMP0]] ; ret ptr %0 } ; TEST 2 define ptr @test2(ptr %0) #0 { ; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test2 ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[TMP0:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret ptr [[TMP0]] ; ret ptr %0 } ; TEST 3 define ptr @test3(ptr align 8 %0, ptr align 4 %1, i1 %2) #0 { ; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test3 ; CHECK-SAME: (ptr nofree readnone align 8 "no-capture-maybe-returned" [[TMP0:%.*]], ptr nofree readnone align 4 "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TMP2]], ptr [[TMP0]], ptr [[TMP1]] ; CHECK-NEXT: ret ptr [[RET]] ; %ret = select i1 %2, ptr %0, ptr %1 ret ptr %ret } ; TEST 4 define ptr @test4(ptr align 32 %0, ptr align 32 %1, i1 %2) #0 { ; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test4 ; CHECK-SAME: (ptr nofree readnone align 32 "no-capture-maybe-returned" [[TMP0:%.*]], ptr nofree readnone align 32 "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TMP2]], ptr [[TMP0]], ptr [[TMP1]] ; CHECK-NEXT: ret ptr [[RET]] ; %ret = select i1 %2, ptr %0, ptr %1 ret ptr %ret } ; TEST 5 declare ptr @unknown() declare align 8 ptr @align8() define ptr @test5_1() { ; CHECK-LABEL: define {{[^@]+}}@test5_1() { ; CHECK-NEXT: [[RET:%.*]] = tail call align 8 ptr @unknown() ; CHECK-NEXT: ret ptr [[RET]] ; %ret = tail call align 8 ptr @unknown() ret ptr %ret } define ptr @test5_2() { ; CHECK-LABEL: define {{[^@]+}}@test5_2() { ; CHECK-NEXT: [[RET:%.*]] = tail call align 8 ptr @align8() ; CHECK-NEXT: ret ptr [[RET]] ; %ret = tail call ptr @align8() ret ptr %ret } ; TEST 6 ; SCC define ptr @test6_1() #0 { ; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test6_1 ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: ret ptr undef ; ; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test6_1 ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret ptr undef ; %ret = tail call ptr @test6_2() ret ptr %ret } define ptr @test6_2() #0 { ; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test6_2 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret ptr undef ; ; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test6_2 ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret ptr undef ; %ret = tail call ptr @test6_1() ret ptr %ret } ; char a1 __attribute__((aligned(8))); ; char a2 __attribute__((aligned(16))); ; ; char* f1(char* a ){ ; return a?a:f2(&a1); ; } ; char* f2(char* a){ ; return a?f1(a):f3(&a2); ; } ; ; char* f3(char* a){ ; return a?&a1: f1(&a2); ; } @a1 = common global i8 0, align 8 @a2 = common global i8 0, align 16 ; Function Attrs: nounwind readnone ssp uwtable define internal ptr @f1(ptr readnone %0) local_unnamed_addr #0 { ; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@f1 ; CGSCC-SAME: () local_unnamed_addr #[[ATTR0]] { ; CGSCC-NEXT: br label [[TMP2:%.*]] ; CGSCC: 1: ; CGSCC-NEXT: unreachable ; CGSCC: 2: ; CGSCC-NEXT: ret ptr @a1 ; %2 = icmp eq ptr %0, null br i1 %2, label %3, label %5 ;