xref: /aosp_15_r20/external/llvm/test/Transforms/FunctionAttrs/optnone-simple.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -O3 -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Show 'optnone' suppresses optimizations.
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Two attribute groups that differ only by 'optnone'.
5*9880d681SAndroid Build Coastguard Worker; 'optnone' requires 'noinline' so #0 is 'noinline' by itself,
6*9880d681SAndroid Build Coastguard Worker; even though it would otherwise be irrelevant to this example.
7*9880d681SAndroid Build Coastguard Workerattributes #0 = { noinline }
8*9880d681SAndroid Build Coastguard Workerattributes #1 = { noinline optnone }
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; int iadd(int a, int b){ return a + b; }
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine i32 @iadd_optimize(i32 %a, i32 %b) #0 {
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca i32, align 4
15*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca i32, align 4
16*9880d681SAndroid Build Coastguard Worker  store i32 %a, i32* %a.addr, align 4
17*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32* %b.addr, align 4
18*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %a.addr, align 4
19*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %b.addr, align 4
20*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %0, %1
21*9880d681SAndroid Build Coastguard Worker  ret i32 %add
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @iadd_optimize
25*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: alloca
26*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
28*9880d681SAndroid Build Coastguard Worker; CHECK: ret
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine i32 @iadd_optnone(i32 %a, i32 %b) #1 {
31*9880d681SAndroid Build Coastguard Workerentry:
32*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca i32, align 4
33*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca i32, align 4
34*9880d681SAndroid Build Coastguard Worker  store i32 %a, i32* %a.addr, align 4
35*9880d681SAndroid Build Coastguard Worker  store i32 %b, i32* %b.addr, align 4
36*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %a.addr, align 4
37*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %b.addr, align 4
38*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %0, %1
39*9880d681SAndroid Build Coastguard Worker  ret i32 %add
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @iadd_optnone
43*9880d681SAndroid Build Coastguard Worker; CHECK: alloca i32
44*9880d681SAndroid Build Coastguard Worker; CHECK: alloca i32
45*9880d681SAndroid Build Coastguard Worker; CHECK: store i32
46*9880d681SAndroid Build Coastguard Worker; CHECK: store i32
47*9880d681SAndroid Build Coastguard Worker; CHECK: load i32
48*9880d681SAndroid Build Coastguard Worker; CHECK: load i32
49*9880d681SAndroid Build Coastguard Worker; CHECK: add nsw i32
50*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; float fsub(float a, float b){ return a - b; }
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine float @fsub_optimize(float %a, float %b) #0 {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca float, align 4
57*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
58*9880d681SAndroid Build Coastguard Worker  store float %a, float* %a.addr, align 4
59*9880d681SAndroid Build Coastguard Worker  store float %b, float* %b.addr, align 4
60*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* %a.addr, align 4
61*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* %b.addr, align 4
62*9880d681SAndroid Build Coastguard Worker  %sub = fsub float %0, %1
63*9880d681SAndroid Build Coastguard Worker  ret float %sub
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fsub_optimize
67*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: alloca
68*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
70*9880d681SAndroid Build Coastguard Worker; CHECK: ret
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine float @fsub_optnone(float %a, float %b) #1 {
73*9880d681SAndroid Build Coastguard Workerentry:
74*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca float, align 4
75*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca float, align 4
76*9880d681SAndroid Build Coastguard Worker  store float %a, float* %a.addr, align 4
77*9880d681SAndroid Build Coastguard Worker  store float %b, float* %b.addr, align 4
78*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* %a.addr, align 4
79*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* %b.addr, align 4
80*9880d681SAndroid Build Coastguard Worker  %sub = fsub float %0, %1
81*9880d681SAndroid Build Coastguard Worker  ret float %sub
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fsub_optnone
85*9880d681SAndroid Build Coastguard Worker; CHECK: alloca float
86*9880d681SAndroid Build Coastguard Worker; CHECK: alloca float
87*9880d681SAndroid Build Coastguard Worker; CHECK: store float
88*9880d681SAndroid Build Coastguard Worker; CHECK: store float
89*9880d681SAndroid Build Coastguard Worker; CHECK: load float
90*9880d681SAndroid Build Coastguard Worker; CHECK: load float
91*9880d681SAndroid Build Coastguard Worker; CHECK: fsub float
92*9880d681SAndroid Build Coastguard Worker; CHECK: ret float
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; typedef float __attribute__((ext_vector_type(4))) float4;
95*9880d681SAndroid Build Coastguard Worker; float4 vmul(float4 a, float4 b){ return a * b; }
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vmul_optimize(<4 x float> %a, <4 x float> %b) #0 {
98*9880d681SAndroid Build Coastguard Workerentry:
99*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca <4 x float>, align 16
100*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca <4 x float>, align 16
101*9880d681SAndroid Build Coastguard Worker  store <4 x float> %a, <4 x float>* %a.addr, align 16
102*9880d681SAndroid Build Coastguard Worker  store <4 x float> %b, <4 x float>* %b.addr, align 16
103*9880d681SAndroid Build Coastguard Worker  %0 = load <4 x float>, <4 x float>* %a.addr, align 16
104*9880d681SAndroid Build Coastguard Worker  %1 = load <4 x float>, <4 x float>* %b.addr, align 16
105*9880d681SAndroid Build Coastguard Worker  %mul = fmul <4 x float> %0, %1
106*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %mul
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vmul_optimize
110*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: alloca
111*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
112*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
113*9880d681SAndroid Build Coastguard Worker; CHECK: ret
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vmul_optnone(<4 x float> %a, <4 x float> %b) #1 {
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker  %a.addr = alloca <4 x float>, align 16
118*9880d681SAndroid Build Coastguard Worker  %b.addr = alloca <4 x float>, align 16
119*9880d681SAndroid Build Coastguard Worker  store <4 x float> %a, <4 x float>* %a.addr, align 16
120*9880d681SAndroid Build Coastguard Worker  store <4 x float> %b, <4 x float>* %b.addr, align 16
121*9880d681SAndroid Build Coastguard Worker  %0 = load <4 x float>, <4 x float>* %a.addr, align 16
122*9880d681SAndroid Build Coastguard Worker  %1 = load <4 x float>, <4 x float>* %b.addr, align 16
123*9880d681SAndroid Build Coastguard Worker  %mul = fmul <4 x float> %0, %1
124*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %mul
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vmul_optnone
128*9880d681SAndroid Build Coastguard Worker; CHECK: alloca <4 x float>
129*9880d681SAndroid Build Coastguard Worker; CHECK: alloca <4 x float>
130*9880d681SAndroid Build Coastguard Worker; CHECK: store <4 x float>
131*9880d681SAndroid Build Coastguard Worker; CHECK: store <4 x float>
132*9880d681SAndroid Build Coastguard Worker; CHECK: load <4 x float>
133*9880d681SAndroid Build Coastguard Worker; CHECK: load <4 x float>
134*9880d681SAndroid Build Coastguard Worker; CHECK: fmul <4 x float>
135*9880d681SAndroid Build Coastguard Worker; CHECK: ret
136