forked from OSchip/llvm-project
136 lines
3.6 KiB
LLVM
136 lines
3.6 KiB
LLVM
|
; RUN: opt -O3 -S < %s | FileCheck %s
|
||
|
; Show 'optnone' suppresses optimizations.
|
||
|
|
||
|
; Two attribute groups that differ only by 'optnone'.
|
||
|
; 'optnone' requires 'noinline' so #0 is 'noinline' by itself,
|
||
|
; even though it would otherwise be irrelevant to this example.
|
||
|
attributes #0 = { noinline }
|
||
|
attributes #1 = { noinline optnone }
|
||
|
|
||
|
; int iadd(int a, int b){ return a + b; }
|
||
|
|
||
|
define i32 @iadd_optimize(i32 %a, i32 %b) #0 {
|
||
|
entry:
|
||
|
%a.addr = alloca i32, align 4
|
||
|
%b.addr = alloca i32, align 4
|
||
|
store i32 %a, i32* %a.addr, align 4
|
||
|
store i32 %b, i32* %b.addr, align 4
|
||
|
%0 = load i32, i32* %a.addr, align 4
|
||
|
%1 = load i32, i32* %b.addr, align 4
|
||
|
%add = add nsw i32 %0, %1
|
||
|
ret i32 %add
|
||
|
}
|
||
|
|
||
|
; CHECK-LABEL: @iadd_optimize
|
||
|
; CHECK-NOT: alloca
|
||
|
; CHECK-NOT: store
|
||
|
; CHECK-NOT: load
|
||
|
; CHECK: ret
|
||
|
|
||
|
define i32 @iadd_optnone(i32 %a, i32 %b) #1 {
|
||
|
entry:
|
||
|
%a.addr = alloca i32, align 4
|
||
|
%b.addr = alloca i32, align 4
|
||
|
store i32 %a, i32* %a.addr, align 4
|
||
|
store i32 %b, i32* %b.addr, align 4
|
||
|
%0 = load i32, i32* %a.addr, align 4
|
||
|
%1 = load i32, i32* %b.addr, align 4
|
||
|
%add = add nsw i32 %0, %1
|
||
|
ret i32 %add
|
||
|
}
|
||
|
|
||
|
; CHECK-LABEL: @iadd_optnone
|
||
|
; CHECK: alloca i32
|
||
|
; CHECK: alloca i32
|
||
|
; CHECK: store i32
|
||
|
; CHECK: store i32
|
||
|
; CHECK: load i32
|
||
|
; CHECK: load i32
|
||
|
; CHECK: add nsw i32
|
||
|
; CHECK: ret i32
|
||
|
|
||
|
; float fsub(float a, float b){ return a - b; }
|
||
|
|
||
|
define float @fsub_optimize(float %a, float %b) #0 {
|
||
|
entry:
|
||
|
%a.addr = alloca float, align 4
|
||
|
%b.addr = alloca float, align 4
|
||
|
store float %a, float* %a.addr, align 4
|
||
|
store float %b, float* %b.addr, align 4
|
||
|
%0 = load float, float* %a.addr, align 4
|
||
|
%1 = load float, float* %b.addr, align 4
|
||
|
%sub = fsub float %0, %1
|
||
|
ret float %sub
|
||
|
}
|
||
|
|
||
|
; CHECK-LABEL: @fsub_optimize
|
||
|
; CHECK-NOT: alloca
|
||
|
; CHECK-NOT: store
|
||
|
; CHECK-NOT: load
|
||
|
; CHECK: ret
|
||
|
|
||
|
define float @fsub_optnone(float %a, float %b) #1 {
|
||
|
entry:
|
||
|
%a.addr = alloca float, align 4
|
||
|
%b.addr = alloca float, align 4
|
||
|
store float %a, float* %a.addr, align 4
|
||
|
store float %b, float* %b.addr, align 4
|
||
|
%0 = load float, float* %a.addr, align 4
|
||
|
%1 = load float, float* %b.addr, align 4
|
||
|
%sub = fsub float %0, %1
|
||
|
ret float %sub
|
||
|
}
|
||
|
|
||
|
; CHECK-LABEL: @fsub_optnone
|
||
|
; CHECK: alloca float
|
||
|
; CHECK: alloca float
|
||
|
; CHECK: store float
|
||
|
; CHECK: store float
|
||
|
; CHECK: load float
|
||
|
; CHECK: load float
|
||
|
; CHECK: fsub float
|
||
|
; CHECK: ret float
|
||
|
|
||
|
; typedef float __attribute__((ext_vector_type(4))) float4;
|
||
|
; float4 vmul(float4 a, float4 b){ return a * b; }
|
||
|
|
||
|
define <4 x float> @vmul_optimize(<4 x float> %a, <4 x float> %b) #0 {
|
||
|
entry:
|
||
|
%a.addr = alloca <4 x float>, align 16
|
||
|
%b.addr = alloca <4 x float>, align 16
|
||
|
store <4 x float> %a, <4 x float>* %a.addr, align 16
|
||
|
store <4 x float> %b, <4 x float>* %b.addr, align 16
|
||
|
%0 = load <4 x float>, <4 x float>* %a.addr, align 16
|
||
|
%1 = load <4 x float>, <4 x float>* %b.addr, align 16
|
||
|
%mul = fmul <4 x float> %0, %1
|
||
|
ret <4 x float> %mul
|
||
|
}
|
||
|
|
||
|
; CHECK-LABEL: @vmul_optimize
|
||
|
; CHECK-NOT: alloca
|
||
|
; CHECK-NOT: store
|
||
|
; CHECK-NOT: load
|
||
|
; CHECK: ret
|
||
|
|
||
|
define <4 x float> @vmul_optnone(<4 x float> %a, <4 x float> %b) #1 {
|
||
|
entry:
|
||
|
%a.addr = alloca <4 x float>, align 16
|
||
|
%b.addr = alloca <4 x float>, align 16
|
||
|
store <4 x float> %a, <4 x float>* %a.addr, align 16
|
||
|
store <4 x float> %b, <4 x float>* %b.addr, align 16
|
||
|
%0 = load <4 x float>, <4 x float>* %a.addr, align 16
|
||
|
%1 = load <4 x float>, <4 x float>* %b.addr, align 16
|
||
|
%mul = fmul <4 x float> %0, %1
|
||
|
ret <4 x float> %mul
|
||
|
}
|
||
|
|
||
|
; CHECK-LABEL: @vmul_optnone
|
||
|
; CHECK: alloca <4 x float>
|
||
|
; CHECK: alloca <4 x float>
|
||
|
; CHECK: store <4 x float>
|
||
|
; CHECK: store <4 x float>
|
||
|
; CHECK: load <4 x float>
|
||
|
; CHECK: load <4 x float>
|
||
|
; CHECK: fmul <4 x float>
|
||
|
; CHECK: ret
|