[lib/Object] - Remove objdump-file-header.test
[llvm-complete.git] / test / Transforms / FunctionAttrs / align.ll
blobd762d516d9aad636296222a9a1eb4946b07bb6d3
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.
9 ; TEST 1
10 ; ATTRIBUTOR: define align 8 i32* @test1(i32* returned align 8 %0)
11 define i32* @test1(i32* align 8 %0) #0 {
12   ret i32* %0
15 ; TEST 2
16 ; ATTRIBUTOR: define i32* @test2(i32* returned %0)
17 define i32* @test2(i32* %0) #0 {
18   ret i32* %0
21 ; TEST 3
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
25   ret i32* %ret
28 ; TEST 4
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
32   ret i32* %ret
35 ; TEST 5
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()
43   ret i32* %ret
46 ; ATTRIBUTOR: define align 8 i32* @test5_2()
47 define i32* @test5_2() {
48   %ret = tail call i32* @align8()
49   ret i32* %ret
52 ; TEST 6
53 ; SCC
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()
57   ret i32* %ret
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()
63   ret i32* %ret
67 ; char a1 __attribute__((aligned(8)));
68 ; char a2 __attribute__((aligned(16)));
70 ; char* f1(char* a ){
71 ;     return a?a:f2(&a1);
72 ; }
73 ; char* f2(char* a){
74 ;     return a?f1(a):f3(&a2);
75 ; }
77 ; char* f3(char* a){
78 ;     return a?&a1: f1(&a2);
79 ; }
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)
93   br label %5
95 ; <label>:5:                                      ; preds = %1, %3
96   %6 = phi i8* [ %4, %3 ], [ %0, %1 ]
97   ret i8* %6
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)
110   br label %7
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)
115   br label %7
117 ; <label>:7:                                      ; preds = %5, %3
118   %8 = phi i8* [ %4, %3 ], [ %6, %5 ]
119   ret i8* %8
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)
131   br label %5
133 ; <label>:5:                                      ; preds = %1, %3
134   %6 = phi i8* [ %4, %3 ], [ @a1, %1 ]
135   ret i8* %6
138 ; TEST 7
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 {
142   ret i32* %p
146 ; TEST 8
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)
158   ret void
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)
163   ret void
167 attributes #0 = { nounwind uwtable noinline }
168 attributes #1 = { uwtable noinline }