1 ; RUN: opt -attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR
3 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5 ; Test cases specifically designed for "align" attribute.
6 ; We use FIXME's to indicate problems and missing attributes.
10 ; ATTRIBUTOR: define align 8 i32* @test1(i32* returned align 8 %0)
11 define i32* @test1(i32* align 8 %0) #0 {
16 ; ATTRIBUTOR: define i32* @test2(i32* returned %0)
17 define i32* @test2(i32* %0) #0 {
22 ; ATTRIBUTOR: define align 4 i32* @test3(i32* align 8 %0, i32* align 4 %1, i1 %2)
23 define i32* @test3(i32* align 8 %0, i32* align 4 %1, i1 %2) #0 {
24 %ret = select i1 %2, i32* %0, i32* %1
29 ; ATTRIBUTOR: define align 32 i32* @test4(i32* align 32 %0, i32* align 32 %1, i1 %2)
30 define i32* @test4(i32* align 32 %0, i32* align 32 %1, i1 %2) #0 {
31 %ret = select i1 %2, i32* %0, i32* %1
36 declare i32* @unknown()
37 declare align 8 i32* @align8()
40 ; ATTRIBUTOR: define align 8 i32* @test5_1()
41 define i32* @test5_1() {
42 %ret = tail call align 8 i32* @unknown()
46 ; ATTRIBUTOR: define align 8 i32* @test5_2()
47 define i32* @test5_2() {
48 %ret = tail call i32* @align8()
54 ; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i32* @test6_1()
55 define i32* @test6_1() #0 {
56 %ret = tail call i32* @test6_2()
60 ; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i32* @test6_2()
61 define i32* @test6_2() #0 {
62 %ret = tail call i32* @test6_1()
67 ; char a1 __attribute__((aligned(8)));
68 ; char a2 __attribute__((aligned(16)));
74 ; return a?f1(a):f3(&a2);
78 ; return a?&a1: f1(&a2);
81 @a1 = common global i8 0, align 8
82 @a2 = common global i8 0, align 16
84 ; Function Attrs: nounwind readnone ssp uwtable
85 define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {
86 ; ATTRIBUTOR: define internal nonnull align 8 i8* @f1(i8* nonnull readnone align 8 %0)
87 %2 = icmp eq i8* %0, null
88 br i1 %2, label %3, label %5
90 ; <label>:3: ; preds = %1
91 ; ATTRIBUTOR: %4 = tail call i8* @f2(i8* nonnull align 8 @a1)
92 %4 = tail call i8* @f2(i8* nonnull @a1)
95 ; <label>:5: ; preds = %1, %3
96 %6 = phi i8* [ %4, %3 ], [ %0, %1 ]
100 ; Function Attrs: nounwind readnone ssp uwtable
101 define internal i8* @f2(i8* readnone %0) local_unnamed_addr #0 {
102 ; ATTRIBUTOR: define internal nonnull align 8 i8* @f2(i8* nonnull readnone align 8 %0)
103 %2 = icmp eq i8* %0, null
104 br i1 %2, label %5, label %3
106 ; <label>:3: ; preds = %1
108 ; ATTRIBUTOR: %4 = tail call i8* @f1(i8* nonnull align 8 %0)
109 %4 = tail call i8* @f1(i8* nonnull %0)
112 ; <label>:5: ; preds = %1
113 ; ATTRIBUTOR: %6 = tail call i8* @f3(i8* nonnull align 16 @a2)
114 %6 = tail call i8* @f3(i8* nonnull @a2)
117 ; <label>:7: ; preds = %5, %3
118 %8 = phi i8* [ %4, %3 ], [ %6, %5 ]
122 ; Function Attrs: nounwind readnone ssp uwtable
123 define internal i8* @f3(i8* readnone %0) local_unnamed_addr #0 {
124 ; ATTRIBUTOR: define internal nonnull align 8 i8* @f3(i8* nonnull readnone align 16 %0)
125 %2 = icmp eq i8* %0, null
126 br i1 %2, label %3, label %5
128 ; <label>:3: ; preds = %1
129 ; ATTRIBUTOR: %4 = tail call i8* @f1(i8* nonnull align 16 @a2)
130 %4 = tail call i8* @f1(i8* nonnull @a2)
133 ; <label>:5: ; preds = %1, %3
134 %6 = phi i8* [ %4, %3 ], [ @a1, %1 ]
139 ; Better than IR information
140 ; ATTRIBUTOR: define align 32 i32* @test7(i32* returned align 32 %p)
141 define align 4 i32* @test7(i32* align 32 %p) #0 {
147 define void @test8_helper() {
148 %ptr0 = tail call i32* @unknown()
149 %ptr1 = tail call align 4 i32* @unknown()
150 %ptr2 = tail call align 8 i32* @unknown()
152 tail call void @test8(i32* %ptr1, i32* %ptr1, i32* %ptr0)
153 ; ATTRIBUTOR: tail call void @test8(i32* align 4 %ptr1, i32* align 4 %ptr1, i32* %ptr0)
154 tail call void @test8(i32* %ptr2, i32* %ptr1, i32* %ptr1)
155 ; ATTRIBUTOR: tail call void @test8(i32* align 8 %ptr2, i32* align 4 %ptr1, i32* align 4 %ptr1)
156 tail call void @test8(i32* %ptr2, i32* %ptr1, i32* %ptr1)
157 ; ATTRIBUTOR: tail call void @test8(i32* align 8 %ptr2, i32* align 4 %ptr1, i32* align 4 %ptr1)
161 define internal void @test8(i32* %a, i32* %b, i32* %c) {
162 ; ATTRIBUTOR: define internal void @test8(i32* align 4 %a, i32* align 4 %b, i32* %c)
167 attributes #0 = { nounwind uwtable noinline }
168 attributes #1 = { uwtable noinline }