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