1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=slp-vectorizer -S -slp-schedule-budget=3 -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s -check-prefix VECTOR_DBG 3; RUN: opt < %s -strip-debug -passes=slp-vectorizer -S -slp-schedule-budget=3 -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s -check-prefix VECTOR_NODBG 4 5target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 6target triple = "x86_64-apple-macosx10.9.0" 7 8; Verify that we get vectorization with -slp-schedule-budget=3. We should 9; get vectorization even if there happens to be some dbg.value calls since they 10; should be ignored, to not let debug information affect the code we get. 11 12declare void @unknown() 13 14define void @test(ptr %a, ptr %b, ptr %c, ptr %d) { 15; VECTOR_DBG-LABEL: @test( 16; VECTOR_DBG-NEXT: entry: 17; VECTOR_DBG-NEXT: [[L0:%.*]] = load float, ptr [[A:%.*]], align 4 18; VECTOR_DBG-NEXT: [[A1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 1 19; VECTOR_DBG-NEXT: [[L1:%.*]] = load float, ptr [[A1]], align 4 20; VECTOR_DBG-NEXT: [[A2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 2 21; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3:![0-9]+]], !DIExpression(), [[META5:![0-9]+]]) 22; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3]], !DIExpression(), [[META5]]) 23; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3]], !DIExpression(), [[META5]]) 24; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3]], !DIExpression(), [[META5]]) 25; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3]], !DIExpression(), [[META5]]) 26; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3]], !DIExpression(), [[META5]]) 27; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3]], !DIExpression(), [[META5]]) 28; VECTOR_DBG-NEXT: #dbg_value(i16 1, [[META3]], !DIExpression(), [[META5]]) 29; VECTOR_DBG-NEXT: [[B1:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i64 1 30; VECTOR_DBG-NEXT: [[B2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 2 31; VECTOR_DBG-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[A2]], align 4 32; VECTOR_DBG-NEXT: call void @unknown() 33; VECTOR_DBG-NEXT: call void @unknown() 34; VECTOR_DBG-NEXT: call void @unknown() 35; VECTOR_DBG-NEXT: call void @unknown() 36; VECTOR_DBG-NEXT: call void @unknown() 37; VECTOR_DBG-NEXT: call void @unknown() 38; VECTOR_DBG-NEXT: call void @unknown() 39; VECTOR_DBG-NEXT: call void @unknown() 40; VECTOR_DBG-NEXT: call void @unknown() 41; VECTOR_DBG-NEXT: call void @unknown() 42; VECTOR_DBG-NEXT: call void @unknown() 43; VECTOR_DBG-NEXT: call void @unknown() 44; VECTOR_DBG-NEXT: call void @unknown() 45; VECTOR_DBG-NEXT: call void @unknown() 46; VECTOR_DBG-NEXT: call void @unknown() 47; VECTOR_DBG-NEXT: call void @unknown() 48; VECTOR_DBG-NEXT: call void @unknown() 49; VECTOR_DBG-NEXT: call void @unknown() 50; VECTOR_DBG-NEXT: call void @unknown() 51; VECTOR_DBG-NEXT: call void @unknown() 52; VECTOR_DBG-NEXT: call void @unknown() 53; VECTOR_DBG-NEXT: call void @unknown() 54; VECTOR_DBG-NEXT: call void @unknown() 55; VECTOR_DBG-NEXT: call void @unknown() 56; VECTOR_DBG-NEXT: call void @unknown() 57; VECTOR_DBG-NEXT: call void @unknown() 58; VECTOR_DBG-NEXT: call void @unknown() 59; VECTOR_DBG-NEXT: call void @unknown() 60; VECTOR_DBG-NEXT: store float [[L0]], ptr [[B]], align 4 61; VECTOR_DBG-NEXT: store float [[L1]], ptr [[B1]], align 4 62; VECTOR_DBG-NEXT: store <2 x float> [[TMP0]], ptr [[B2]], align 4 63; VECTOR_DBG-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr [[C:%.*]], align 4 64; VECTOR_DBG-NEXT: store <4 x float> [[TMP1]], ptr [[D:%.*]], align 4 65; VECTOR_DBG-NEXT: ret void 66; 67; VECTOR_NODBG-LABEL: @test( 68; VECTOR_NODBG-NEXT: entry: 69; VECTOR_NODBG-NEXT: [[L0:%.*]] = load float, ptr [[A:%.*]], align 4 70; VECTOR_NODBG-NEXT: [[A1:%.*]] = getelementptr inbounds float, ptr [[A]], i64 1 71; VECTOR_NODBG-NEXT: [[L1:%.*]] = load float, ptr [[A1]], align 4 72; VECTOR_NODBG-NEXT: [[A2:%.*]] = getelementptr inbounds float, ptr [[A]], i64 2 73; VECTOR_NODBG-NEXT: [[B1:%.*]] = getelementptr inbounds float, ptr [[B:%.*]], i64 1 74; VECTOR_NODBG-NEXT: [[B2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 2 75; VECTOR_NODBG-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[A2]], align 4 76; VECTOR_NODBG-NEXT: call void @unknown() 77; VECTOR_NODBG-NEXT: call void @unknown() 78; VECTOR_NODBG-NEXT: call void @unknown() 79; VECTOR_NODBG-NEXT: call void @unknown() 80; VECTOR_NODBG-NEXT: call void @unknown() 81; VECTOR_NODBG-NEXT: call void @unknown() 82; VECTOR_NODBG-NEXT: call void @unknown() 83; VECTOR_NODBG-NEXT: call void @unknown() 84; VECTOR_NODBG-NEXT: call void @unknown() 85; VECTOR_NODBG-NEXT: call void @unknown() 86; VECTOR_NODBG-NEXT: call void @unknown() 87; VECTOR_NODBG-NEXT: call void @unknown() 88; VECTOR_NODBG-NEXT: call void @unknown() 89; VECTOR_NODBG-NEXT: call void @unknown() 90; VECTOR_NODBG-NEXT: call void @unknown() 91; VECTOR_NODBG-NEXT: call void @unknown() 92; VECTOR_NODBG-NEXT: call void @unknown() 93; VECTOR_NODBG-NEXT: call void @unknown() 94; VECTOR_NODBG-NEXT: call void @unknown() 95; VECTOR_NODBG-NEXT: call void @unknown() 96; VECTOR_NODBG-NEXT: call void @unknown() 97; VECTOR_NODBG-NEXT: call void @unknown() 98; VECTOR_NODBG-NEXT: call void @unknown() 99; VECTOR_NODBG-NEXT: call void @unknown() 100; VECTOR_NODBG-NEXT: call void @unknown() 101; VECTOR_NODBG-NEXT: call void @unknown() 102; VECTOR_NODBG-NEXT: call void @unknown() 103; VECTOR_NODBG-NEXT: call void @unknown() 104; VECTOR_NODBG-NEXT: store float [[L0]], ptr [[B]], align 4 105; VECTOR_NODBG-NEXT: store float [[L1]], ptr [[B1]], align 4 106; VECTOR_NODBG-NEXT: store <2 x float> [[TMP0]], ptr [[B2]], align 4 107; VECTOR_NODBG-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr [[C:%.*]], align 4 108; VECTOR_NODBG-NEXT: store <4 x float> [[TMP1]], ptr [[D:%.*]], align 4 109; VECTOR_NODBG-NEXT: ret void 110; 111entry: 112 %l0 = load float, ptr %a 113 %a1 = getelementptr inbounds float, ptr %a, i64 1 114 %l1 = load float, ptr %a1 115 %a2 = getelementptr inbounds float, ptr %a, i64 2 116 %l2 = load float, ptr %a2 117 %a3 = getelementptr inbounds float, ptr %a, i64 3 118 %l3 = load float, ptr %a3 119 120 ; some unrelated instructions inbetween to enlarge the scheduling region 121 call void @unknown() 122 call void @unknown() 123 call void @unknown() 124 call void @unknown() 125 call void @unknown() 126 call void @unknown() 127 call void @unknown() 128 call void @unknown() 129 call void @unknown() 130 call void @unknown() 131 call void @unknown() 132 call void @unknown() 133 call void @unknown() 134 call void @unknown() 135 call void @unknown() 136 call void @unknown() 137 call void @unknown() 138 call void @unknown() 139 call void @unknown() 140 call void @unknown() 141 call void @unknown() 142 call void @unknown() 143 call void @unknown() 144 call void @unknown() 145 call void @unknown() 146 call void @unknown() 147 call void @unknown() 148 call void @unknown() 149 150 ; The dbg.values should not affect vectorization. 151 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 152 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 153 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 154 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 155 156 store float %l0, ptr %b 157 158 ; The dbg.values should not affect vectorization. 159 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 160 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 161 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 162 call void @llvm.dbg.value(metadata i16 1, metadata !3, metadata !DIExpression()), !dbg !5 163 %b1 = getelementptr inbounds float, ptr %b, i64 1 164 store float %l1, ptr %b1 165 %b2 = getelementptr inbounds float, ptr %b, i64 2 166 store float %l2, ptr %b2 167 %b3 = getelementptr inbounds float, ptr %b, i64 3 168 store float %l3, ptr %b3 169 170 %l4 = load float, ptr %c 171 %c1 = getelementptr inbounds float, ptr %c, i64 1 172 %l5 = load float, ptr %c1 173 %c2 = getelementptr inbounds float, ptr %c, i64 2 174 %l6 = load float, ptr %c2 175 %c3 = getelementptr inbounds float, ptr %c, i64 3 176 %l7 = load float, ptr %c3 177 178 store float %l4, ptr %d 179 %d1 = getelementptr inbounds float, ptr %d, i64 1 180 store float %l5, ptr %d1 181 %d2 = getelementptr inbounds float, ptr %d, i64 2 182 store float %l6, ptr %d2 183 %d3 = getelementptr inbounds float, ptr %d, i64 3 184 store float %l7, ptr %d3 185 186 ret void 187} 188 189declare void @llvm.dbg.value(metadata, metadata, metadata) 190 191!llvm.dbg.cu = !{!0} 192!llvm.module.flags = !{!2} 193 194!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1) 195!1 = !DIFile(filename: "foo.c", directory: "/") 196!2 = !{i32 2, !"Debug Info Version", i32 3} 197!3 = !DILocalVariable(scope: !4) 198!4 = distinct !DISubprogram(unit: !0) 199!5 = !DILocation(scope: !4) 200