Frank Winter
2015-Jun-22 19:50 UTC
[LLVMdev] bb-vectorizer transforms only part of the block
The loads, stores and float arithmetic in attached function should be completely vectorizable. The bb-vectorizer does a good job at first, but from instruction %96 on it messes up by adding unnecessary vectorshuffles. (The function was designed so that no shuffle would be needed in order to vectorize it). I tested this with llvm 3.6 with the following command: ~/toolchain/install/llvm-3.6/bin/opt -basicaa -bb-vectorize -instcombine -S < func_vec_8x8_complex_mul.ll See below for the output which I truncated after a few vectorshuffles. Is there a general limitation to bb-vectorize in terms of a maximum number of instructions that can be vectorized? Are there any 'magic' numbers in the pass that can be tweaked? Thanks, Frank ; ModuleID = '<stdin>' target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define void @main(i64 %lo, i64 %hi, float* noalias %arg0, float* noalias %arg1, float* noalias %arg2) { entrypoint: %0 = getelementptr float* %arg1, i64 64 %1 = getelementptr float* %arg2, i64 64 %2 = getelementptr float* %arg0, i64 64 %3 = bitcast float* %arg1 to <4 x float>* %4 = bitcast float* %0 to <4 x float>* %5 = bitcast float* %arg2 to <4 x float>* %6 = bitcast float* %1 to <4 x float>* %7 = load <4 x float>* %3, align 16 %8 = load <4 x float>* %4, align 16 %9 = load <4 x float>* %5, align 16 %10 = load <4 x float>* %6, align 16 %11 = fmul <4 x float> %10, %7 %12 = fmul <4 x float> %9, %8 %13 = fadd <4 x float> %12, %11 %14 = bitcast float* %2 to <4 x float>* %15 = fmul <4 x float> %10, %8 %16 = fmul <4 x float> %9, %7 %17 = fsub <4 x float> %16, %15 %18 = bitcast float* %arg0 to <4 x float>* store <4 x float> %17, <4 x float>* %18, align 16 store <4 x float> %13, <4 x float>* %14, align 16 %19 = getelementptr float* %arg1, i64 4 %20 = getelementptr float* %arg1, i64 68 %21 = getelementptr float* %arg2, i64 4 %22 = getelementptr float* %arg2, i64 68 %23 = getelementptr float* %arg0, i64 4 %24 = getelementptr float* %arg0, i64 68 %25 = bitcast float* %19 to <4 x float>* %26 = bitcast float* %20 to <4 x float>* %27 = bitcast float* %21 to <4 x float>* %28 = bitcast float* %22 to <4 x float>* %29 = load <4 x float>* %25, align 16 %30 = load <4 x float>* %26, align 16 %31 = load <4 x float>* %27, align 16 %32 = load <4 x float>* %28, align 16 %33 = fmul <4 x float> %32, %29 %34 = fmul <4 x float> %31, %30 %35 = fadd <4 x float> %34, %33 %36 = bitcast float* %24 to <4 x float>* %37 = fmul <4 x float> %32, %30 %38 = fmul <4 x float> %31, %29 %39 = fsub <4 x float> %38, %37 %40 = bitcast float* %23 to <4 x float>* store <4 x float> %39, <4 x float>* %40, align 16 store <4 x float> %35, <4 x float>* %36, align 16 %41 = getelementptr float* %arg1, i64 8 %42 = getelementptr float* %arg1, i64 72 %43 = getelementptr float* %arg2, i64 8 %44 = getelementptr float* %arg2, i64 72 %45 = getelementptr float* %arg0, i64 8 %46 = getelementptr float* %arg0, i64 72 %47 = bitcast float* %41 to <4 x float>* %48 = bitcast float* %42 to <4 x float>* %49 = bitcast float* %43 to <4 x float>* %50 = bitcast float* %44 to <4 x float>* %51 = load <4 x float>* %47, align 16 %52 = load <4 x float>* %48, align 16 %53 = load <4 x float>* %49, align 16 %54 = load <4 x float>* %50, align 16 %55 = fmul <4 x float> %54, %51 %56 = fmul <4 x float> %53, %52 %57 = fadd <4 x float> %56, %55 %58 = bitcast float* %46 to <4 x float>* %59 = fmul <4 x float> %54, %52 %60 = fmul <4 x float> %53, %51 %61 = fsub <4 x float> %60, %59 %62 = bitcast float* %45 to <4 x float>* store <4 x float> %61, <4 x float>* %62, align 16 store <4 x float> %57, <4 x float>* %58, align 16 %63 = getelementptr float* %arg1, i64 12 %64 = getelementptr float* %arg1, i64 76 %65 = getelementptr float* %arg2, i64 12 %66 = getelementptr float* %arg2, i64 76 %67 = getelementptr float* %arg0, i64 12 %68 = getelementptr float* %arg0, i64 76 %69 = bitcast float* %63 to <4 x float>* %70 = bitcast float* %64 to <4 x float>* %71 = bitcast float* %65 to <4 x float>* %72 = bitcast float* %66 to <4 x float>* %73 = load <4 x float>* %69, align 16 %74 = load <4 x float>* %70, align 16 %75 = load <4 x float>* %71, align 16 %76 = load <4 x float>* %72, align 16 %77 = fmul <4 x float> %76, %73 %78 = fmul <4 x float> %75, %74 %79 = fadd <4 x float> %78, %77 %80 = bitcast float* %68 to <4 x float>* %81 = fmul <4 x float> %76, %74 %82 = fmul <4 x float> %75, %73 %83 = fsub <4 x float> %82, %81 %84 = bitcast float* %67 to <4 x float>* store <4 x float> %83, <4 x float>* %84, align 16 store <4 x float> %79, <4 x float>* %80, align 16 %85 = getelementptr float* %arg1, i64 16 %86 = getelementptr float* %arg1, i64 80 %87 = getelementptr float* %arg2, i64 16 %88 = getelementptr float* %arg2, i64 80 %89 = getelementptr float* %arg0, i64 16 %90 = getelementptr float* %arg0, i64 80 %91 = bitcast float* %85 to <4 x float>* %92 = bitcast float* %86 to <4 x float>* %93 = bitcast float* %87 to <4 x float>* %94 = bitcast float* %88 to <4 x float>* %95 = load <4 x float>* %91, align 16 %96 = shufflevector <4 x float> %95, <4 x float> undef, <2 x i32> <i32 0, i32 1> %97 = load <4 x float>* %92, align 16 %98 = shufflevector <4 x float> %97, <4 x float> undef, <2 x i32> <i32 0, i32 1> %99 = shufflevector <2 x float> %98, <2 x float> %96, <4 x i32> <i32 0, i32 1, i32 2, i32 3> %100 = load <4 x float>* %93, align 16 %101 = shufflevector <4 x float> %100, <4 x float> undef, <2 x i32> <i32 0, i32 1> .... -------------- next part -------------- ; ModuleID = 'module' target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define void @main(i64 %lo, i64 %hi, float* noalias %arg0, float* noalias %arg1, float* noalias %arg2) { entrypoint: %0 = getelementptr float* %arg1, i32 0 %1 = load float* %0 %2 = getelementptr float* %arg1, i32 64 %3 = load float* %2 %4 = getelementptr float* %arg2, i32 0 %5 = load float* %4 %6 = getelementptr float* %arg2, i32 64 %7 = load float* %6 %8 = fmul float %7, %1 %9 = fmul float %5, %3 %10 = fadd float %9, %8 %11 = fmul float %7, %3 %12 = fmul float %5, %1 %13 = fsub float %12, %11 %14 = getelementptr float* %arg0, i32 0 store float %13, float* %14 %15 = getelementptr float* %arg0, i32 64 store float %10, float* %15 %16 = getelementptr float* %arg1, i32 1 %17 = load float* %16 %18 = getelementptr float* %arg1, i32 65 %19 = load float* %18 %20 = getelementptr float* %arg2, i32 1 %21 = load float* %20 %22 = getelementptr float* %arg2, i32 65 %23 = load float* %22 %24 = fmul float %23, %17 %25 = fmul float %21, %19 %26 = fadd float %25, %24 %27 = fmul float %23, %19 %28 = fmul float %21, %17 %29 = fsub float %28, %27 %30 = getelementptr float* %arg0, i32 1 store float %29, float* %30 %31 = getelementptr float* %arg0, i32 65 store float %26, float* %31 %32 = getelementptr float* %arg1, i32 2 %33 = load float* %32 %34 = getelementptr float* %arg1, i32 66 %35 = load float* %34 %36 = getelementptr float* %arg2, i32 2 %37 = load float* %36 %38 = getelementptr float* %arg2, i32 66 %39 = load float* %38 %40 = fmul float %39, %33 %41 = fmul float %37, %35 %42 = fadd float %41, %40 %43 = fmul float %39, %35 %44 = fmul float %37, %33 %45 = fsub float %44, %43 %46 = getelementptr float* %arg0, i32 2 store float %45, float* %46 %47 = getelementptr float* %arg0, i32 66 store float %42, float* %47 %48 = getelementptr float* %arg1, i32 3 %49 = load float* %48 %50 = getelementptr float* %arg1, i32 67 %51 = load float* %50 %52 = getelementptr float* %arg2, i32 3 %53 = load float* %52 %54 = getelementptr float* %arg2, i32 67 %55 = load float* %54 %56 = fmul float %55, %49 %57 = fmul float %53, %51 %58 = fadd float %57, %56 %59 = fmul float %55, %51 %60 = fmul float %53, %49 %61 = fsub float %60, %59 %62 = getelementptr float* %arg0, i32 3 store float %61, float* %62 %63 = getelementptr float* %arg0, i32 67 store float %58, float* %63 %64 = getelementptr float* %arg1, i32 4 %65 = load float* %64 %66 = getelementptr float* %arg1, i32 68 %67 = load float* %66 %68 = getelementptr float* %arg2, i32 4 %69 = load float* %68 %70 = getelementptr float* %arg2, i32 68 %71 = load float* %70 %72 = fmul float %71, %65 %73 = fmul float %69, %67 %74 = fadd float %73, %72 %75 = fmul float %71, %67 %76 = fmul float %69, %65 %77 = fsub float %76, %75 %78 = getelementptr float* %arg0, i32 4 store float %77, float* %78 %79 = getelementptr float* %arg0, i32 68 store float %74, float* %79 %80 = getelementptr float* %arg1, i32 5 %81 = load float* %80 %82 = getelementptr float* %arg1, i32 69 %83 = load float* %82 %84 = getelementptr float* %arg2, i32 5 %85 = load float* %84 %86 = getelementptr float* %arg2, i32 69 %87 = load float* %86 %88 = fmul float %87, %81 %89 = fmul float %85, %83 %90 = fadd float %89, %88 %91 = fmul float %87, %83 %92 = fmul float %85, %81 %93 = fsub float %92, %91 %94 = getelementptr float* %arg0, i32 5 store float %93, float* %94 %95 = getelementptr float* %arg0, i32 69 store float %90, float* %95 %96 = getelementptr float* %arg1, i32 6 %97 = load float* %96 %98 = getelementptr float* %arg1, i32 70 %99 = load float* %98 %100 = getelementptr float* %arg2, i32 6 %101 = load float* %100 %102 = getelementptr float* %arg2, i32 70 %103 = load float* %102 %104 = fmul float %103, %97 %105 = fmul float %101, %99 %106 = fadd float %105, %104 %107 = fmul float %103, %99 %108 = fmul float %101, %97 %109 = fsub float %108, %107 %110 = getelementptr float* %arg0, i32 6 store float %109, float* %110 %111 = getelementptr float* %arg0, i32 70 store float %106, float* %111 %112 = getelementptr float* %arg1, i32 7 %113 = load float* %112 %114 = getelementptr float* %arg1, i32 71 %115 = load float* %114 %116 = getelementptr float* %arg2, i32 7 %117 = load float* %116 %118 = getelementptr float* %arg2, i32 71 %119 = load float* %118 %120 = fmul float %119, %113 %121 = fmul float %117, %115 %122 = fadd float %121, %120 %123 = fmul float %119, %115 %124 = fmul float %117, %113 %125 = fsub float %124, %123 %126 = getelementptr float* %arg0, i32 7 store float %125, float* %126 %127 = getelementptr float* %arg0, i32 71 store float %122, float* %127 %128 = getelementptr float* %arg1, i32 8 %129 = load float* %128 %130 = getelementptr float* %arg1, i32 72 %131 = load float* %130 %132 = getelementptr float* %arg2, i32 8 %133 = load float* %132 %134 = getelementptr float* %arg2, i32 72 %135 = load float* %134 %136 = fmul float %135, %129 %137 = fmul float %133, %131 %138 = fadd float %137, %136 %139 = fmul float %135, %131 %140 = fmul float %133, %129 %141 = fsub float %140, %139 %142 = getelementptr float* %arg0, i32 8 store float %141, float* %142 %143 = getelementptr float* %arg0, i32 72 store float %138, float* %143 %144 = getelementptr float* %arg1, i32 9 %145 = load float* %144 %146 = getelementptr float* %arg1, i32 73 %147 = load float* %146 %148 = getelementptr float* %arg2, i32 9 %149 = load float* %148 %150 = getelementptr float* %arg2, i32 73 %151 = load float* %150 %152 = fmul float %151, %145 %153 = fmul float %149, %147 %154 = fadd float %153, %152 %155 = fmul float %151, %147 %156 = fmul float %149, %145 %157 = fsub float %156, %155 %158 = getelementptr float* %arg0, i32 9 store float %157, float* %158 %159 = getelementptr float* %arg0, i32 73 store float %154, float* %159 %160 = getelementptr float* %arg1, i32 10 %161 = load float* %160 %162 = getelementptr float* %arg1, i32 74 %163 = load float* %162 %164 = getelementptr float* %arg2, i32 10 %165 = load float* %164 %166 = getelementptr float* %arg2, i32 74 %167 = load float* %166 %168 = fmul float %167, %161 %169 = fmul float %165, %163 %170 = fadd float %169, %168 %171 = fmul float %167, %163 %172 = fmul float %165, %161 %173 = fsub float %172, %171 %174 = getelementptr float* %arg0, i32 10 store float %173, float* %174 %175 = getelementptr float* %arg0, i32 74 store float %170, float* %175 %176 = getelementptr float* %arg1, i32 11 %177 = load float* %176 %178 = getelementptr float* %arg1, i32 75 %179 = load float* %178 %180 = getelementptr float* %arg2, i32 11 %181 = load float* %180 %182 = getelementptr float* %arg2, i32 75 %183 = load float* %182 %184 = fmul float %183, %177 %185 = fmul float %181, %179 %186 = fadd float %185, %184 %187 = fmul float %183, %179 %188 = fmul float %181, %177 %189 = fsub float %188, %187 %190 = getelementptr float* %arg0, i32 11 store float %189, float* %190 %191 = getelementptr float* %arg0, i32 75 store float %186, float* %191 %192 = getelementptr float* %arg1, i32 12 %193 = load float* %192 %194 = getelementptr float* %arg1, i32 76 %195 = load float* %194 %196 = getelementptr float* %arg2, i32 12 %197 = load float* %196 %198 = getelementptr float* %arg2, i32 76 %199 = load float* %198 %200 = fmul float %199, %193 %201 = fmul float %197, %195 %202 = fadd float %201, %200 %203 = fmul float %199, %195 %204 = fmul float %197, %193 %205 = fsub float %204, %203 %206 = getelementptr float* %arg0, i32 12 store float %205, float* %206 %207 = getelementptr float* %arg0, i32 76 store float %202, float* %207 %208 = getelementptr float* %arg1, i32 13 %209 = load float* %208 %210 = getelementptr float* %arg1, i32 77 %211 = load float* %210 %212 = getelementptr float* %arg2, i32 13 %213 = load float* %212 %214 = getelementptr float* %arg2, i32 77 %215 = load float* %214 %216 = fmul float %215, %209 %217 = fmul float %213, %211 %218 = fadd float %217, %216 %219 = fmul float %215, %211 %220 = fmul float %213, %209 %221 = fsub float %220, %219 %222 = getelementptr float* %arg0, i32 13 store float %221, float* %222 %223 = getelementptr float* %arg0, i32 77 store float %218, float* %223 %224 = getelementptr float* %arg1, i32 14 %225 = load float* %224 %226 = getelementptr float* %arg1, i32 78 %227 = load float* %226 %228 = getelementptr float* %arg2, i32 14 %229 = load float* %228 %230 = getelementptr float* %arg2, i32 78 %231 = load float* %230 %232 = fmul float %231, %225 %233 = fmul float %229, %227 %234 = fadd float %233, %232 %235 = fmul float %231, %227 %236 = fmul float %229, %225 %237 = fsub float %236, %235 %238 = getelementptr float* %arg0, i32 14 store float %237, float* %238 %239 = getelementptr float* %arg0, i32 78 store float %234, float* %239 %240 = getelementptr float* %arg1, i32 15 %241 = load float* %240 %242 = getelementptr float* %arg1, i32 79 %243 = load float* %242 %244 = getelementptr float* %arg2, i32 15 %245 = load float* %244 %246 = getelementptr float* %arg2, i32 79 %247 = load float* %246 %248 = fmul float %247, %241 %249 = fmul float %245, %243 %250 = fadd float %249, %248 %251 = fmul float %247, %243 %252 = fmul float %245, %241 %253 = fsub float %252, %251 %254 = getelementptr float* %arg0, i32 15 store float %253, float* %254 %255 = getelementptr float* %arg0, i32 79 store float %250, float* %255 %256 = getelementptr float* %arg1, i32 16 %257 = load float* %256 %258 = getelementptr float* %arg1, i32 80 %259 = load float* %258 %260 = getelementptr float* %arg2, i32 16 %261 = load float* %260 %262 = getelementptr float* %arg2, i32 80 %263 = load float* %262 %264 = fmul float %263, %257 %265 = fmul float %261, %259 %266 = fadd float %265, %264 %267 = fmul float %263, %259 %268 = fmul float %261, %257 %269 = fsub float %268, %267 %270 = getelementptr float* %arg0, i32 16 store float %269, float* %270 %271 = getelementptr float* %arg0, i32 80 store float %266, float* %271 %272 = getelementptr float* %arg1, i32 17 %273 = load float* %272 %274 = getelementptr float* %arg1, i32 81 %275 = load float* %274 %276 = getelementptr float* %arg2, i32 17 %277 = load float* %276 %278 = getelementptr float* %arg2, i32 81 %279 = load float* %278 %280 = fmul float %279, %273 %281 = fmul float %277, %275 %282 = fadd float %281, %280 %283 = fmul float %279, %275 %284 = fmul float %277, %273 %285 = fsub float %284, %283 %286 = getelementptr float* %arg0, i32 17 store float %285, float* %286 %287 = getelementptr float* %arg0, i32 81 store float %282, float* %287 %288 = getelementptr float* %arg1, i32 18 %289 = load float* %288 %290 = getelementptr float* %arg1, i32 82 %291 = load float* %290 %292 = getelementptr float* %arg2, i32 18 %293 = load float* %292 %294 = getelementptr float* %arg2, i32 82 %295 = load float* %294 %296 = fmul float %295, %289 %297 = fmul float %293, %291 %298 = fadd float %297, %296 %299 = fmul float %295, %291 %300 = fmul float %293, %289 %301 = fsub float %300, %299 %302 = getelementptr float* %arg0, i32 18 store float %301, float* %302 %303 = getelementptr float* %arg0, i32 82 store float %298, float* %303 %304 = getelementptr float* %arg1, i32 19 %305 = load float* %304 %306 = getelementptr float* %arg1, i32 83 %307 = load float* %306 %308 = getelementptr float* %arg2, i32 19 %309 = load float* %308 %310 = getelementptr float* %arg2, i32 83 %311 = load float* %310 %312 = fmul float %311, %305 %313 = fmul float %309, %307 %314 = fadd float %313, %312 %315 = fmul float %311, %307 %316 = fmul float %309, %305 %317 = fsub float %316, %315 %318 = getelementptr float* %arg0, i32 19 store float %317, float* %318 %319 = getelementptr float* %arg0, i32 83 store float %314, float* %319 %320 = getelementptr float* %arg1, i32 20 %321 = load float* %320 %322 = getelementptr float* %arg1, i32 84 %323 = load float* %322 %324 = getelementptr float* %arg2, i32 20 %325 = load float* %324 %326 = getelementptr float* %arg2, i32 84 %327 = load float* %326 %328 = fmul float %327, %321 %329 = fmul float %325, %323 %330 = fadd float %329, %328 %331 = fmul float %327, %323 %332 = fmul float %325, %321 %333 = fsub float %332, %331 %334 = getelementptr float* %arg0, i32 20 store float %333, float* %334 %335 = getelementptr float* %arg0, i32 84 store float %330, float* %335 %336 = getelementptr float* %arg1, i32 21 %337 = load float* %336 %338 = getelementptr float* %arg1, i32 85 %339 = load float* %338 %340 = getelementptr float* %arg2, i32 21 %341 = load float* %340 %342 = getelementptr float* %arg2, i32 85 %343 = load float* %342 %344 = fmul float %343, %337 %345 = fmul float %341, %339 %346 = fadd float %345, %344 %347 = fmul float %343, %339 %348 = fmul float %341, %337 %349 = fsub float %348, %347 %350 = getelementptr float* %arg0, i32 21 store float %349, float* %350 %351 = getelementptr float* %arg0, i32 85 store float %346, float* %351 %352 = getelementptr float* %arg1, i32 22 %353 = load float* %352 %354 = getelementptr float* %arg1, i32 86 %355 = load float* %354 %356 = getelementptr float* %arg2, i32 22 %357 = load float* %356 %358 = getelementptr float* %arg2, i32 86 %359 = load float* %358 %360 = fmul float %359, %353 %361 = fmul float %357, %355 %362 = fadd float %361, %360 %363 = fmul float %359, %355 %364 = fmul float %357, %353 %365 = fsub float %364, %363 %366 = getelementptr float* %arg0, i32 22 store float %365, float* %366 %367 = getelementptr float* %arg0, i32 86 store float %362, float* %367 %368 = getelementptr float* %arg1, i32 23 %369 = load float* %368 %370 = getelementptr float* %arg1, i32 87 %371 = load float* %370 %372 = getelementptr float* %arg2, i32 23 %373 = load float* %372 %374 = getelementptr float* %arg2, i32 87 %375 = load float* %374 %376 = fmul float %375, %369 %377 = fmul float %373, %371 %378 = fadd float %377, %376 %379 = fmul float %375, %371 %380 = fmul float %373, %369 %381 = fsub float %380, %379 %382 = getelementptr float* %arg0, i32 23 store float %381, float* %382 %383 = getelementptr float* %arg0, i32 87 store float %378, float* %383 %384 = getelementptr float* %arg1, i32 24 %385 = load float* %384 %386 = getelementptr float* %arg1, i32 88 %387 = load float* %386 %388 = getelementptr float* %arg2, i32 24 %389 = load float* %388 %390 = getelementptr float* %arg2, i32 88 %391 = load float* %390 %392 = fmul float %391, %385 %393 = fmul float %389, %387 %394 = fadd float %393, %392 %395 = fmul float %391, %387 %396 = fmul float %389, %385 %397 = fsub float %396, %395 %398 = getelementptr float* %arg0, i32 24 store float %397, float* %398 %399 = getelementptr float* %arg0, i32 88 store float %394, float* %399 %400 = getelementptr float* %arg1, i32 25 %401 = load float* %400 %402 = getelementptr float* %arg1, i32 89 %403 = load float* %402 %404 = getelementptr float* %arg2, i32 25 %405 = load float* %404 %406 = getelementptr float* %arg2, i32 89 %407 = load float* %406 %408 = fmul float %407, %401 %409 = fmul float %405, %403 %410 = fadd float %409, %408 %411 = fmul float %407, %403 %412 = fmul float %405, %401 %413 = fsub float %412, %411 %414 = getelementptr float* %arg0, i32 25 store float %413, float* %414 %415 = getelementptr float* %arg0, i32 89 store float %410, float* %415 %416 = getelementptr float* %arg1, i32 26 %417 = load float* %416 %418 = getelementptr float* %arg1, i32 90 %419 = load float* %418 %420 = getelementptr float* %arg2, i32 26 %421 = load float* %420 %422 = getelementptr float* %arg2, i32 90 %423 = load float* %422 %424 = fmul float %423, %417 %425 = fmul float %421, %419 %426 = fadd float %425, %424 %427 = fmul float %423, %419 %428 = fmul float %421, %417 %429 = fsub float %428, %427 %430 = getelementptr float* %arg0, i32 26 store float %429, float* %430 %431 = getelementptr float* %arg0, i32 90 store float %426, float* %431 %432 = getelementptr float* %arg1, i32 27 %433 = load float* %432 %434 = getelementptr float* %arg1, i32 91 %435 = load float* %434 %436 = getelementptr float* %arg2, i32 27 %437 = load float* %436 %438 = getelementptr float* %arg2, i32 91 %439 = load float* %438 %440 = fmul float %439, %433 %441 = fmul float %437, %435 %442 = fadd float %441, %440 %443 = fmul float %439, %435 %444 = fmul float %437, %433 %445 = fsub float %444, %443 %446 = getelementptr float* %arg0, i32 27 store float %445, float* %446 %447 = getelementptr float* %arg0, i32 91 store float %442, float* %447 %448 = getelementptr float* %arg1, i32 28 %449 = load float* %448 %450 = getelementptr float* %arg1, i32 92 %451 = load float* %450 %452 = getelementptr float* %arg2, i32 28 %453 = load float* %452 %454 = getelementptr float* %arg2, i32 92 %455 = load float* %454 %456 = fmul float %455, %449 %457 = fmul float %453, %451 %458 = fadd float %457, %456 %459 = fmul float %455, %451 %460 = fmul float %453, %449 %461 = fsub float %460, %459 %462 = getelementptr float* %arg0, i32 28 store float %461, float* %462 %463 = getelementptr float* %arg0, i32 92 store float %458, float* %463 %464 = getelementptr float* %arg1, i32 29 %465 = load float* %464 %466 = getelementptr float* %arg1, i32 93 %467 = load float* %466 %468 = getelementptr float* %arg2, i32 29 %469 = load float* %468 %470 = getelementptr float* %arg2, i32 93 %471 = load float* %470 %472 = fmul float %471, %465 %473 = fmul float %469, %467 %474 = fadd float %473, %472 %475 = fmul float %471, %467 %476 = fmul float %469, %465 %477 = fsub float %476, %475 %478 = getelementptr float* %arg0, i32 29 store float %477, float* %478 %479 = getelementptr float* %arg0, i32 93 store float %474, float* %479 %480 = getelementptr float* %arg1, i32 30 %481 = load float* %480 %482 = getelementptr float* %arg1, i32 94 %483 = load float* %482 %484 = getelementptr float* %arg2, i32 30 %485 = load float* %484 %486 = getelementptr float* %arg2, i32 94 %487 = load float* %486 %488 = fmul float %487, %481 %489 = fmul float %485, %483 %490 = fadd float %489, %488 %491 = fmul float %487, %483 %492 = fmul float %485, %481 %493 = fsub float %492, %491 %494 = getelementptr float* %arg0, i32 30 store float %493, float* %494 %495 = getelementptr float* %arg0, i32 94 store float %490, float* %495 %496 = getelementptr float* %arg1, i32 31 %497 = load float* %496 %498 = getelementptr float* %arg1, i32 95 %499 = load float* %498 %500 = getelementptr float* %arg2, i32 31 %501 = load float* %500 %502 = getelementptr float* %arg2, i32 95 %503 = load float* %502 %504 = fmul float %503, %497 %505 = fmul float %501, %499 %506 = fadd float %505, %504 %507 = fmul float %503, %499 %508 = fmul float %501, %497 %509 = fsub float %508, %507 %510 = getelementptr float* %arg0, i32 31 store float %509, float* %510 %511 = getelementptr float* %arg0, i32 95 store float %506, float* %511 %512 = getelementptr float* %arg1, i32 32 %513 = load float* %512 %514 = getelementptr float* %arg1, i32 96 %515 = load float* %514 %516 = getelementptr float* %arg2, i32 32 %517 = load float* %516 %518 = getelementptr float* %arg2, i32 96 %519 = load float* %518 %520 = fmul float %519, %513 %521 = fmul float %517, %515 %522 = fadd float %521, %520 %523 = fmul float %519, %515 %524 = fmul float %517, %513 %525 = fsub float %524, %523 %526 = getelementptr float* %arg0, i32 32 store float %525, float* %526 %527 = getelementptr float* %arg0, i32 96 store float %522, float* %527 %528 = getelementptr float* %arg1, i32 33 %529 = load float* %528 %530 = getelementptr float* %arg1, i32 97 %531 = load float* %530 %532 = getelementptr float* %arg2, i32 33 %533 = load float* %532 %534 = getelementptr float* %arg2, i32 97 %535 = load float* %534 %536 = fmul float %535, %529 %537 = fmul float %533, %531 %538 = fadd float %537, %536 %539 = fmul float %535, %531 %540 = fmul float %533, %529 %541 = fsub float %540, %539 %542 = getelementptr float* %arg0, i32 33 store float %541, float* %542 %543 = getelementptr float* %arg0, i32 97 store float %538, float* %543 %544 = getelementptr float* %arg1, i32 34 %545 = load float* %544 %546 = getelementptr float* %arg1, i32 98 %547 = load float* %546 %548 = getelementptr float* %arg2, i32 34 %549 = load float* %548 %550 = getelementptr float* %arg2, i32 98 %551 = load float* %550 %552 = fmul float %551, %545 %553 = fmul float %549, %547 %554 = fadd float %553, %552 %555 = fmul float %551, %547 %556 = fmul float %549, %545 %557 = fsub float %556, %555 %558 = getelementptr float* %arg0, i32 34 store float %557, float* %558 %559 = getelementptr float* %arg0, i32 98 store float %554, float* %559 %560 = getelementptr float* %arg1, i32 35 %561 = load float* %560 %562 = getelementptr float* %arg1, i32 99 %563 = load float* %562 %564 = getelementptr float* %arg2, i32 35 %565 = load float* %564 %566 = getelementptr float* %arg2, i32 99 %567 = load float* %566 %568 = fmul float %567, %561 %569 = fmul float %565, %563 %570 = fadd float %569, %568 %571 = fmul float %567, %563 %572 = fmul float %565, %561 %573 = fsub float %572, %571 %574 = getelementptr float* %arg0, i32 35 store float %573, float* %574 %575 = getelementptr float* %arg0, i32 99 store float %570, float* %575 %576 = getelementptr float* %arg1, i32 36 %577 = load float* %576 %578 = getelementptr float* %arg1, i32 100 %579 = load float* %578 %580 = getelementptr float* %arg2, i32 36 %581 = load float* %580 %582 = getelementptr float* %arg2, i32 100 %583 = load float* %582 %584 = fmul float %583, %577 %585 = fmul float %581, %579 %586 = fadd float %585, %584 %587 = fmul float %583, %579 %588 = fmul float %581, %577 %589 = fsub float %588, %587 %590 = getelementptr float* %arg0, i32 36 store float %589, float* %590 %591 = getelementptr float* %arg0, i32 100 store float %586, float* %591 %592 = getelementptr float* %arg1, i32 37 %593 = load float* %592 %594 = getelementptr float* %arg1, i32 101 %595 = load float* %594 %596 = getelementptr float* %arg2, i32 37 %597 = load float* %596 %598 = getelementptr float* %arg2, i32 101 %599 = load float* %598 %600 = fmul float %599, %593 %601 = fmul float %597, %595 %602 = fadd float %601, %600 %603 = fmul float %599, %595 %604 = fmul float %597, %593 %605 = fsub float %604, %603 %606 = getelementptr float* %arg0, i32 37 store float %605, float* %606 %607 = getelementptr float* %arg0, i32 101 store float %602, float* %607 %608 = getelementptr float* %arg1, i32 38 %609 = load float* %608 %610 = getelementptr float* %arg1, i32 102 %611 = load float* %610 %612 = getelementptr float* %arg2, i32 38 %613 = load float* %612 %614 = getelementptr float* %arg2, i32 102 %615 = load float* %614 %616 = fmul float %615, %609 %617 = fmul float %613, %611 %618 = fadd float %617, %616 %619 = fmul float %615, %611 %620 = fmul float %613, %609 %621 = fsub float %620, %619 %622 = getelementptr float* %arg0, i32 38 store float %621, float* %622 %623 = getelementptr float* %arg0, i32 102 store float %618, float* %623 %624 = getelementptr float* %arg1, i32 39 %625 = load float* %624 %626 = getelementptr float* %arg1, i32 103 %627 = load float* %626 %628 = getelementptr float* %arg2, i32 39 %629 = load float* %628 %630 = getelementptr float* %arg2, i32 103 %631 = load float* %630 %632 = fmul float %631, %625 %633 = fmul float %629, %627 %634 = fadd float %633, %632 %635 = fmul float %631, %627 %636 = fmul float %629, %625 %637 = fsub float %636, %635 %638 = getelementptr float* %arg0, i32 39 store float %637, float* %638 %639 = getelementptr float* %arg0, i32 103 store float %634, float* %639 %640 = getelementptr float* %arg1, i32 40 %641 = load float* %640 %642 = getelementptr float* %arg1, i32 104 %643 = load float* %642 %644 = getelementptr float* %arg2, i32 40 %645 = load float* %644 %646 = getelementptr float* %arg2, i32 104 %647 = load float* %646 %648 = fmul float %647, %641 %649 = fmul float %645, %643 %650 = fadd float %649, %648 %651 = fmul float %647, %643 %652 = fmul float %645, %641 %653 = fsub float %652, %651 %654 = getelementptr float* %arg0, i32 40 store float %653, float* %654 %655 = getelementptr float* %arg0, i32 104 store float %650, float* %655 %656 = getelementptr float* %arg1, i32 41 %657 = load float* %656 %658 = getelementptr float* %arg1, i32 105 %659 = load float* %658 %660 = getelementptr float* %arg2, i32 41 %661 = load float* %660 %662 = getelementptr float* %arg2, i32 105 %663 = load float* %662 %664 = fmul float %663, %657 %665 = fmul float %661, %659 %666 = fadd float %665, %664 %667 = fmul float %663, %659 %668 = fmul float %661, %657 %669 = fsub float %668, %667 %670 = getelementptr float* %arg0, i32 41 store float %669, float* %670 %671 = getelementptr float* %arg0, i32 105 store float %666, float* %671 %672 = getelementptr float* %arg1, i32 42 %673 = load float* %672 %674 = getelementptr float* %arg1, i32 106 %675 = load float* %674 %676 = getelementptr float* %arg2, i32 42 %677 = load float* %676 %678 = getelementptr float* %arg2, i32 106 %679 = load float* %678 %680 = fmul float %679, %673 %681 = fmul float %677, %675 %682 = fadd float %681, %680 %683 = fmul float %679, %675 %684 = fmul float %677, %673 %685 = fsub float %684, %683 %686 = getelementptr float* %arg0, i32 42 store float %685, float* %686 %687 = getelementptr float* %arg0, i32 106 store float %682, float* %687 %688 = getelementptr float* %arg1, i32 43 %689 = load float* %688 %690 = getelementptr float* %arg1, i32 107 %691 = load float* %690 %692 = getelementptr float* %arg2, i32 43 %693 = load float* %692 %694 = getelementptr float* %arg2, i32 107 %695 = load float* %694 %696 = fmul float %695, %689 %697 = fmul float %693, %691 %698 = fadd float %697, %696 %699 = fmul float %695, %691 %700 = fmul float %693, %689 %701 = fsub float %700, %699 %702 = getelementptr float* %arg0, i32 43 store float %701, float* %702 %703 = getelementptr float* %arg0, i32 107 store float %698, float* %703 %704 = getelementptr float* %arg1, i32 44 %705 = load float* %704 %706 = getelementptr float* %arg1, i32 108 %707 = load float* %706 %708 = getelementptr float* %arg2, i32 44 %709 = load float* %708 %710 = getelementptr float* %arg2, i32 108 %711 = load float* %710 %712 = fmul float %711, %705 %713 = fmul float %709, %707 %714 = fadd float %713, %712 %715 = fmul float %711, %707 %716 = fmul float %709, %705 %717 = fsub float %716, %715 %718 = getelementptr float* %arg0, i32 44 store float %717, float* %718 %719 = getelementptr float* %arg0, i32 108 store float %714, float* %719 %720 = getelementptr float* %arg1, i32 45 %721 = load float* %720 %722 = getelementptr float* %arg1, i32 109 %723 = load float* %722 %724 = getelementptr float* %arg2, i32 45 %725 = load float* %724 %726 = getelementptr float* %arg2, i32 109 %727 = load float* %726 %728 = fmul float %727, %721 %729 = fmul float %725, %723 %730 = fadd float %729, %728 %731 = fmul float %727, %723 %732 = fmul float %725, %721 %733 = fsub float %732, %731 %734 = getelementptr float* %arg0, i32 45 store float %733, float* %734 %735 = getelementptr float* %arg0, i32 109 store float %730, float* %735 %736 = getelementptr float* %arg1, i32 46 %737 = load float* %736 %738 = getelementptr float* %arg1, i32 110 %739 = load float* %738 %740 = getelementptr float* %arg2, i32 46 %741 = load float* %740 %742 = getelementptr float* %arg2, i32 110 %743 = load float* %742 %744 = fmul float %743, %737 %745 = fmul float %741, %739 %746 = fadd float %745, %744 %747 = fmul float %743, %739 %748 = fmul float %741, %737 %749 = fsub float %748, %747 %750 = getelementptr float* %arg0, i32 46 store float %749, float* %750 %751 = getelementptr float* %arg0, i32 110 store float %746, float* %751 %752 = getelementptr float* %arg1, i32 47 %753 = load float* %752 %754 = getelementptr float* %arg1, i32 111 %755 = load float* %754 %756 = getelementptr float* %arg2, i32 47 %757 = load float* %756 %758 = getelementptr float* %arg2, i32 111 %759 = load float* %758 %760 = fmul float %759, %753 %761 = fmul float %757, %755 %762 = fadd float %761, %760 %763 = fmul float %759, %755 %764 = fmul float %757, %753 %765 = fsub float %764, %763 %766 = getelementptr float* %arg0, i32 47 store float %765, float* %766 %767 = getelementptr float* %arg0, i32 111 store float %762, float* %767 %768 = getelementptr float* %arg1, i32 48 %769 = load float* %768 %770 = getelementptr float* %arg1, i32 112 %771 = load float* %770 %772 = getelementptr float* %arg2, i32 48 %773 = load float* %772 %774 = getelementptr float* %arg2, i32 112 %775 = load float* %774 %776 = fmul float %775, %769 %777 = fmul float %773, %771 %778 = fadd float %777, %776 %779 = fmul float %775, %771 %780 = fmul float %773, %769 %781 = fsub float %780, %779 %782 = getelementptr float* %arg0, i32 48 store float %781, float* %782 %783 = getelementptr float* %arg0, i32 112 store float %778, float* %783 %784 = getelementptr float* %arg1, i32 49 %785 = load float* %784 %786 = getelementptr float* %arg1, i32 113 %787 = load float* %786 %788 = getelementptr float* %arg2, i32 49 %789 = load float* %788 %790 = getelementptr float* %arg2, i32 113 %791 = load float* %790 %792 = fmul float %791, %785 %793 = fmul float %789, %787 %794 = fadd float %793, %792 %795 = fmul float %791, %787 %796 = fmul float %789, %785 %797 = fsub float %796, %795 %798 = getelementptr float* %arg0, i32 49 store float %797, float* %798 %799 = getelementptr float* %arg0, i32 113 store float %794, float* %799 %800 = getelementptr float* %arg1, i32 50 %801 = load float* %800 %802 = getelementptr float* %arg1, i32 114 %803 = load float* %802 %804 = getelementptr float* %arg2, i32 50 %805 = load float* %804 %806 = getelementptr float* %arg2, i32 114 %807 = load float* %806 %808 = fmul float %807, %801 %809 = fmul float %805, %803 %810 = fadd float %809, %808 %811 = fmul float %807, %803 %812 = fmul float %805, %801 %813 = fsub float %812, %811 %814 = getelementptr float* %arg0, i32 50 store float %813, float* %814 %815 = getelementptr float* %arg0, i32 114 store float %810, float* %815 %816 = getelementptr float* %arg1, i32 51 %817 = load float* %816 %818 = getelementptr float* %arg1, i32 115 %819 = load float* %818 %820 = getelementptr float* %arg2, i32 51 %821 = load float* %820 %822 = getelementptr float* %arg2, i32 115 %823 = load float* %822 %824 = fmul float %823, %817 %825 = fmul float %821, %819 %826 = fadd float %825, %824 %827 = fmul float %823, %819 %828 = fmul float %821, %817 %829 = fsub float %828, %827 %830 = getelementptr float* %arg0, i32 51 store float %829, float* %830 %831 = getelementptr float* %arg0, i32 115 store float %826, float* %831 %832 = getelementptr float* %arg1, i32 52 %833 = load float* %832 %834 = getelementptr float* %arg1, i32 116 %835 = load float* %834 %836 = getelementptr float* %arg2, i32 52 %837 = load float* %836 %838 = getelementptr float* %arg2, i32 116 %839 = load float* %838 %840 = fmul float %839, %833 %841 = fmul float %837, %835 %842 = fadd float %841, %840 %843 = fmul float %839, %835 %844 = fmul float %837, %833 %845 = fsub float %844, %843 %846 = getelementptr float* %arg0, i32 52 store float %845, float* %846 %847 = getelementptr float* %arg0, i32 116 store float %842, float* %847 %848 = getelementptr float* %arg1, i32 53 %849 = load float* %848 %850 = getelementptr float* %arg1, i32 117 %851 = load float* %850 %852 = getelementptr float* %arg2, i32 53 %853 = load float* %852 %854 = getelementptr float* %arg2, i32 117 %855 = load float* %854 %856 = fmul float %855, %849 %857 = fmul float %853, %851 %858 = fadd float %857, %856 %859 = fmul float %855, %851 %860 = fmul float %853, %849 %861 = fsub float %860, %859 %862 = getelementptr float* %arg0, i32 53 store float %861, float* %862 %863 = getelementptr float* %arg0, i32 117 store float %858, float* %863 %864 = getelementptr float* %arg1, i32 54 %865 = load float* %864 %866 = getelementptr float* %arg1, i32 118 %867 = load float* %866 %868 = getelementptr float* %arg2, i32 54 %869 = load float* %868 %870 = getelementptr float* %arg2, i32 118 %871 = load float* %870 %872 = fmul float %871, %865 %873 = fmul float %869, %867 %874 = fadd float %873, %872 %875 = fmul float %871, %867 %876 = fmul float %869, %865 %877 = fsub float %876, %875 %878 = getelementptr float* %arg0, i32 54 store float %877, float* %878 %879 = getelementptr float* %arg0, i32 118 store float %874, float* %879 %880 = getelementptr float* %arg1, i32 55 %881 = load float* %880 %882 = getelementptr float* %arg1, i32 119 %883 = load float* %882 %884 = getelementptr float* %arg2, i32 55 %885 = load float* %884 %886 = getelementptr float* %arg2, i32 119 %887 = load float* %886 %888 = fmul float %887, %881 %889 = fmul float %885, %883 %890 = fadd float %889, %888 %891 = fmul float %887, %883 %892 = fmul float %885, %881 %893 = fsub float %892, %891 %894 = getelementptr float* %arg0, i32 55 store float %893, float* %894 %895 = getelementptr float* %arg0, i32 119 store float %890, float* %895 %896 = getelementptr float* %arg1, i32 56 %897 = load float* %896 %898 = getelementptr float* %arg1, i32 120 %899 = load float* %898 %900 = getelementptr float* %arg2, i32 56 %901 = load float* %900 %902 = getelementptr float* %arg2, i32 120 %903 = load float* %902 %904 = fmul float %903, %897 %905 = fmul float %901, %899 %906 = fadd float %905, %904 %907 = fmul float %903, %899 %908 = fmul float %901, %897 %909 = fsub float %908, %907 %910 = getelementptr float* %arg0, i32 56 store float %909, float* %910 %911 = getelementptr float* %arg0, i32 120 store float %906, float* %911 %912 = getelementptr float* %arg1, i32 57 %913 = load float* %912 %914 = getelementptr float* %arg1, i32 121 %915 = load float* %914 %916 = getelementptr float* %arg2, i32 57 %917 = load float* %916 %918 = getelementptr float* %arg2, i32 121 %919 = load float* %918 %920 = fmul float %919, %913 %921 = fmul float %917, %915 %922 = fadd float %921, %920 %923 = fmul float %919, %915 %924 = fmul float %917, %913 %925 = fsub float %924, %923 %926 = getelementptr float* %arg0, i32 57 store float %925, float* %926 %927 = getelementptr float* %arg0, i32 121 store float %922, float* %927 %928 = getelementptr float* %arg1, i32 58 %929 = load float* %928 %930 = getelementptr float* %arg1, i32 122 %931 = load float* %930 %932 = getelementptr float* %arg2, i32 58 %933 = load float* %932 %934 = getelementptr float* %arg2, i32 122 %935 = load float* %934 %936 = fmul float %935, %929 %937 = fmul float %933, %931 %938 = fadd float %937, %936 %939 = fmul float %935, %931 %940 = fmul float %933, %929 %941 = fsub float %940, %939 %942 = getelementptr float* %arg0, i32 58 store float %941, float* %942 %943 = getelementptr float* %arg0, i32 122 store float %938, float* %943 %944 = getelementptr float* %arg1, i32 59 %945 = load float* %944 %946 = getelementptr float* %arg1, i32 123 %947 = load float* %946 %948 = getelementptr float* %arg2, i32 59 %949 = load float* %948 %950 = getelementptr float* %arg2, i32 123 %951 = load float* %950 %952 = fmul float %951, %945 %953 = fmul float %949, %947 %954 = fadd float %953, %952 %955 = fmul float %951, %947 %956 = fmul float %949, %945 %957 = fsub float %956, %955 %958 = getelementptr float* %arg0, i32 59 store float %957, float* %958 %959 = getelementptr float* %arg0, i32 123 store float %954, float* %959 %960 = getelementptr float* %arg1, i32 60 %961 = load float* %960 %962 = getelementptr float* %arg1, i32 124 %963 = load float* %962 %964 = getelementptr float* %arg2, i32 60 %965 = load float* %964 %966 = getelementptr float* %arg2, i32 124 %967 = load float* %966 %968 = fmul float %967, %961 %969 = fmul float %965, %963 %970 = fadd float %969, %968 %971 = fmul float %967, %963 %972 = fmul float %965, %961 %973 = fsub float %972, %971 %974 = getelementptr float* %arg0, i32 60 store float %973, float* %974 %975 = getelementptr float* %arg0, i32 124 store float %970, float* %975 %976 = getelementptr float* %arg1, i32 61 %977 = load float* %976 %978 = getelementptr float* %arg1, i32 125 %979 = load float* %978 %980 = getelementptr float* %arg2, i32 61 %981 = load float* %980 %982 = getelementptr float* %arg2, i32 125 %983 = load float* %982 %984 = fmul float %983, %977 %985 = fmul float %981, %979 %986 = fadd float %985, %984 %987 = fmul float %983, %979 %988 = fmul float %981, %977 %989 = fsub float %988, %987 %990 = getelementptr float* %arg0, i32 61 store float %989, float* %990 %991 = getelementptr float* %arg0, i32 125 store float %986, float* %991 %992 = getelementptr float* %arg1, i32 62 %993 = load float* %992 %994 = getelementptr float* %arg1, i32 126 %995 = load float* %994 %996 = getelementptr float* %arg2, i32 62 %997 = load float* %996 %998 = getelementptr float* %arg2, i32 126 %999 = load float* %998 %1000 = fmul float %999, %993 %1001 = fmul float %997, %995 %1002 = fadd float %1001, %1000 %1003 = fmul float %999, %995 %1004 = fmul float %997, %993 %1005 = fsub float %1004, %1003 %1006 = getelementptr float* %arg0, i32 62 store float %1005, float* %1006 %1007 = getelementptr float* %arg0, i32 126 store float %1002, float* %1007 %1008 = getelementptr float* %arg1, i32 63 %1009 = load float* %1008 %1010 = getelementptr float* %arg1, i32 127 %1011 = load float* %1010 %1012 = getelementptr float* %arg2, i32 63 %1013 = load float* %1012 %1014 = getelementptr float* %arg2, i32 127 %1015 = load float* %1014 %1016 = fmul float %1015, %1009 %1017 = fmul float %1013, %1011 %1018 = fadd float %1017, %1016 %1019 = fmul float %1015, %1011 %1020 = fmul float %1013, %1009 %1021 = fsub float %1020, %1019 %1022 = getelementptr float* %arg0, i32 63 store float %1021, float* %1022 %1023 = getelementptr float* %arg0, i32 127 store float %1018, float* %1023 ret void }
Hal Finkel
2015-Jun-22 19:56 UTC
[LLVMdev] bb-vectorizer transforms only part of the block
----- Original Message -----> From: "Frank Winter" <fwinter at jlab.org> > To: llvmdev at cs.uiuc.edu > Sent: Monday, June 22, 2015 2:50:32 PM > Subject: [LLVMdev] bb-vectorizer transforms only part of the block > > The loads, stores and float arithmetic in attached function should be > completely vectorizable. The bb-vectorizer does a good job at first, > but > from instruction %96 on it messes up by adding unnecessary > vectorshuffles. (The function was designed so that no shuffle would > be > needed in order to vectorize it). > > I tested this with llvm 3.6 with the following command: > > ~/toolchain/install/llvm-3.6/bin/opt -basicaa -bb-vectorize > -instcombine > -S < func_vec_8x8_complex_mul.ll > > See below for the output which I truncated after a few > vectorshuffles. > > Is there a general limitation to bb-vectorize in terms of a maximum > number of instructions that can be vectorized? Are there any 'magic' > numbers in the pass that can be tweaked?There are several such magic numbers, but first, why are you using bb-vectorize instead of the SLP vectorizer? -Hal> > Thanks, > Frank > > > ; ModuleID = '<stdin>' > target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" > target triple = "x86_64-unknown-linux-gnu" > > define void @main(i64 %lo, i64 %hi, float* noalias %arg0, float* > noalias > %arg1, float* noalias %arg2) { > entrypoint: > %0 = getelementptr float* %arg1, i64 64 > %1 = getelementptr float* %arg2, i64 64 > %2 = getelementptr float* %arg0, i64 64 > %3 = bitcast float* %arg1 to <4 x float>* > %4 = bitcast float* %0 to <4 x float>* > %5 = bitcast float* %arg2 to <4 x float>* > %6 = bitcast float* %1 to <4 x float>* > %7 = load <4 x float>* %3, align 16 > %8 = load <4 x float>* %4, align 16 > %9 = load <4 x float>* %5, align 16 > %10 = load <4 x float>* %6, align 16 > %11 = fmul <4 x float> %10, %7 > %12 = fmul <4 x float> %9, %8 > %13 = fadd <4 x float> %12, %11 > %14 = bitcast float* %2 to <4 x float>* > %15 = fmul <4 x float> %10, %8 > %16 = fmul <4 x float> %9, %7 > %17 = fsub <4 x float> %16, %15 > %18 = bitcast float* %arg0 to <4 x float>* > store <4 x float> %17, <4 x float>* %18, align 16 > store <4 x float> %13, <4 x float>* %14, align 16 > %19 = getelementptr float* %arg1, i64 4 > %20 = getelementptr float* %arg1, i64 68 > %21 = getelementptr float* %arg2, i64 4 > %22 = getelementptr float* %arg2, i64 68 > %23 = getelementptr float* %arg0, i64 4 > %24 = getelementptr float* %arg0, i64 68 > %25 = bitcast float* %19 to <4 x float>* > %26 = bitcast float* %20 to <4 x float>* > %27 = bitcast float* %21 to <4 x float>* > %28 = bitcast float* %22 to <4 x float>* > %29 = load <4 x float>* %25, align 16 > %30 = load <4 x float>* %26, align 16 > %31 = load <4 x float>* %27, align 16 > %32 = load <4 x float>* %28, align 16 > %33 = fmul <4 x float> %32, %29 > %34 = fmul <4 x float> %31, %30 > %35 = fadd <4 x float> %34, %33 > %36 = bitcast float* %24 to <4 x float>* > %37 = fmul <4 x float> %32, %30 > %38 = fmul <4 x float> %31, %29 > %39 = fsub <4 x float> %38, %37 > %40 = bitcast float* %23 to <4 x float>* > store <4 x float> %39, <4 x float>* %40, align 16 > store <4 x float> %35, <4 x float>* %36, align 16 > %41 = getelementptr float* %arg1, i64 8 > %42 = getelementptr float* %arg1, i64 72 > %43 = getelementptr float* %arg2, i64 8 > %44 = getelementptr float* %arg2, i64 72 > %45 = getelementptr float* %arg0, i64 8 > %46 = getelementptr float* %arg0, i64 72 > %47 = bitcast float* %41 to <4 x float>* > %48 = bitcast float* %42 to <4 x float>* > %49 = bitcast float* %43 to <4 x float>* > %50 = bitcast float* %44 to <4 x float>* > %51 = load <4 x float>* %47, align 16 > %52 = load <4 x float>* %48, align 16 > %53 = load <4 x float>* %49, align 16 > %54 = load <4 x float>* %50, align 16 > %55 = fmul <4 x float> %54, %51 > %56 = fmul <4 x float> %53, %52 > %57 = fadd <4 x float> %56, %55 > %58 = bitcast float* %46 to <4 x float>* > %59 = fmul <4 x float> %54, %52 > %60 = fmul <4 x float> %53, %51 > %61 = fsub <4 x float> %60, %59 > %62 = bitcast float* %45 to <4 x float>* > store <4 x float> %61, <4 x float>* %62, align 16 > store <4 x float> %57, <4 x float>* %58, align 16 > %63 = getelementptr float* %arg1, i64 12 > %64 = getelementptr float* %arg1, i64 76 > %65 = getelementptr float* %arg2, i64 12 > %66 = getelementptr float* %arg2, i64 76 > %67 = getelementptr float* %arg0, i64 12 > %68 = getelementptr float* %arg0, i64 76 > %69 = bitcast float* %63 to <4 x float>* > %70 = bitcast float* %64 to <4 x float>* > %71 = bitcast float* %65 to <4 x float>* > %72 = bitcast float* %66 to <4 x float>* > %73 = load <4 x float>* %69, align 16 > %74 = load <4 x float>* %70, align 16 > %75 = load <4 x float>* %71, align 16 > %76 = load <4 x float>* %72, align 16 > %77 = fmul <4 x float> %76, %73 > %78 = fmul <4 x float> %75, %74 > %79 = fadd <4 x float> %78, %77 > %80 = bitcast float* %68 to <4 x float>* > %81 = fmul <4 x float> %76, %74 > %82 = fmul <4 x float> %75, %73 > %83 = fsub <4 x float> %82, %81 > %84 = bitcast float* %67 to <4 x float>* > store <4 x float> %83, <4 x float>* %84, align 16 > store <4 x float> %79, <4 x float>* %80, align 16 > %85 = getelementptr float* %arg1, i64 16 > %86 = getelementptr float* %arg1, i64 80 > %87 = getelementptr float* %arg2, i64 16 > %88 = getelementptr float* %arg2, i64 80 > %89 = getelementptr float* %arg0, i64 16 > %90 = getelementptr float* %arg0, i64 80 > %91 = bitcast float* %85 to <4 x float>* > %92 = bitcast float* %86 to <4 x float>* > %93 = bitcast float* %87 to <4 x float>* > %94 = bitcast float* %88 to <4 x float>* > %95 = load <4 x float>* %91, align 16 > %96 = shufflevector <4 x float> %95, <4 x float> undef, <2 x i32> > <i32 0, i32 1> > %97 = load <4 x float>* %92, align 16 > %98 = shufflevector <4 x float> %97, <4 x float> undef, <2 x i32> > <i32 0, i32 1> > %99 = shufflevector <2 x float> %98, <2 x float> %96, <4 x i32> > <i32 > 0, i32 1, i32 2, i32 3> > %100 = load <4 x float>* %93, align 16 > %101 = shufflevector <4 x float> %100, <4 x float> undef, <2 x > i32> > <i32 0, i32 1> > .... > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-- Hal Finkel Assistant Computational Scientist Leadership Computing Facility Argonne National Laboratory
Frank Winter
2015-Jun-22 19:58 UTC
[LLVMdev] bb-vectorizer transforms only part of the block
On 06/22/2015 03:56 PM, Hal Finkel wrote:> ----- Original Message ----- >> From: "Frank Winter" <fwinter at jlab.org> >> To: llvmdev at cs.uiuc.edu >> Sent: Monday, June 22, 2015 2:50:32 PM >> Subject: [LLVMdev] bb-vectorizer transforms only part of the block >> >> The loads, stores and float arithmetic in attached function should be >> completely vectorizable. The bb-vectorizer does a good job at first, >> but >> from instruction %96 on it messes up by adding unnecessary >> vectorshuffles. (The function was designed so that no shuffle would >> be >> needed in order to vectorize it). >> >> I tested this with llvm 3.6 with the following command: >> >> ~/toolchain/install/llvm-3.6/bin/opt -basicaa -bb-vectorize >> -instcombine >> -S < func_vec_8x8_complex_mul.ll >> >> See below for the output which I truncated after a few >> vectorshuffles. >> >> Is there a general limitation to bb-vectorize in terms of a maximum >> number of instructions that can be vectorized? Are there any 'magic' >> numbers in the pass that can be tweaked?> There are several such magic numbers, but first, why are you using bb-vectorize instead of the SLP vectorizer?Oh, good catch! Using the SLP vectorizer fixed this. All vectorized now :-) Frank> -Hal > >> Thanks, >> Frank >> >> >> ; ModuleID = '<stdin>' >> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" >> target triple = "x86_64-unknown-linux-gnu" >> >> define void @main(i64 %lo, i64 %hi, float* noalias %arg0, float* >> noalias >> %arg1, float* noalias %arg2) { >> entrypoint: >> %0 = getelementptr float* %arg1, i64 64 >> %1 = getelementptr float* %arg2, i64 64 >> %2 = getelementptr float* %arg0, i64 64 >> %3 = bitcast float* %arg1 to <4 x float>* >> %4 = bitcast float* %0 to <4 x float>* >> %5 = bitcast float* %arg2 to <4 x float>* >> %6 = bitcast float* %1 to <4 x float>* >> %7 = load <4 x float>* %3, align 16 >> %8 = load <4 x float>* %4, align 16 >> %9 = load <4 x float>* %5, align 16 >> %10 = load <4 x float>* %6, align 16 >> %11 = fmul <4 x float> %10, %7 >> %12 = fmul <4 x float> %9, %8 >> %13 = fadd <4 x float> %12, %11 >> %14 = bitcast float* %2 to <4 x float>* >> %15 = fmul <4 x float> %10, %8 >> %16 = fmul <4 x float> %9, %7 >> %17 = fsub <4 x float> %16, %15 >> %18 = bitcast float* %arg0 to <4 x float>* >> store <4 x float> %17, <4 x float>* %18, align 16 >> store <4 x float> %13, <4 x float>* %14, align 16 >> %19 = getelementptr float* %arg1, i64 4 >> %20 = getelementptr float* %arg1, i64 68 >> %21 = getelementptr float* %arg2, i64 4 >> %22 = getelementptr float* %arg2, i64 68 >> %23 = getelementptr float* %arg0, i64 4 >> %24 = getelementptr float* %arg0, i64 68 >> %25 = bitcast float* %19 to <4 x float>* >> %26 = bitcast float* %20 to <4 x float>* >> %27 = bitcast float* %21 to <4 x float>* >> %28 = bitcast float* %22 to <4 x float>* >> %29 = load <4 x float>* %25, align 16 >> %30 = load <4 x float>* %26, align 16 >> %31 = load <4 x float>* %27, align 16 >> %32 = load <4 x float>* %28, align 16 >> %33 = fmul <4 x float> %32, %29 >> %34 = fmul <4 x float> %31, %30 >> %35 = fadd <4 x float> %34, %33 >> %36 = bitcast float* %24 to <4 x float>* >> %37 = fmul <4 x float> %32, %30 >> %38 = fmul <4 x float> %31, %29 >> %39 = fsub <4 x float> %38, %37 >> %40 = bitcast float* %23 to <4 x float>* >> store <4 x float> %39, <4 x float>* %40, align 16 >> store <4 x float> %35, <4 x float>* %36, align 16 >> %41 = getelementptr float* %arg1, i64 8 >> %42 = getelementptr float* %arg1, i64 72 >> %43 = getelementptr float* %arg2, i64 8 >> %44 = getelementptr float* %arg2, i64 72 >> %45 = getelementptr float* %arg0, i64 8 >> %46 = getelementptr float* %arg0, i64 72 >> %47 = bitcast float* %41 to <4 x float>* >> %48 = bitcast float* %42 to <4 x float>* >> %49 = bitcast float* %43 to <4 x float>* >> %50 = bitcast float* %44 to <4 x float>* >> %51 = load <4 x float>* %47, align 16 >> %52 = load <4 x float>* %48, align 16 >> %53 = load <4 x float>* %49, align 16 >> %54 = load <4 x float>* %50, align 16 >> %55 = fmul <4 x float> %54, %51 >> %56 = fmul <4 x float> %53, %52 >> %57 = fadd <4 x float> %56, %55 >> %58 = bitcast float* %46 to <4 x float>* >> %59 = fmul <4 x float> %54, %52 >> %60 = fmul <4 x float> %53, %51 >> %61 = fsub <4 x float> %60, %59 >> %62 = bitcast float* %45 to <4 x float>* >> store <4 x float> %61, <4 x float>* %62, align 16 >> store <4 x float> %57, <4 x float>* %58, align 16 >> %63 = getelementptr float* %arg1, i64 12 >> %64 = getelementptr float* %arg1, i64 76 >> %65 = getelementptr float* %arg2, i64 12 >> %66 = getelementptr float* %arg2, i64 76 >> %67 = getelementptr float* %arg0, i64 12 >> %68 = getelementptr float* %arg0, i64 76 >> %69 = bitcast float* %63 to <4 x float>* >> %70 = bitcast float* %64 to <4 x float>* >> %71 = bitcast float* %65 to <4 x float>* >> %72 = bitcast float* %66 to <4 x float>* >> %73 = load <4 x float>* %69, align 16 >> %74 = load <4 x float>* %70, align 16 >> %75 = load <4 x float>* %71, align 16 >> %76 = load <4 x float>* %72, align 16 >> %77 = fmul <4 x float> %76, %73 >> %78 = fmul <4 x float> %75, %74 >> %79 = fadd <4 x float> %78, %77 >> %80 = bitcast float* %68 to <4 x float>* >> %81 = fmul <4 x float> %76, %74 >> %82 = fmul <4 x float> %75, %73 >> %83 = fsub <4 x float> %82, %81 >> %84 = bitcast float* %67 to <4 x float>* >> store <4 x float> %83, <4 x float>* %84, align 16 >> store <4 x float> %79, <4 x float>* %80, align 16 >> %85 = getelementptr float* %arg1, i64 16 >> %86 = getelementptr float* %arg1, i64 80 >> %87 = getelementptr float* %arg2, i64 16 >> %88 = getelementptr float* %arg2, i64 80 >> %89 = getelementptr float* %arg0, i64 16 >> %90 = getelementptr float* %arg0, i64 80 >> %91 = bitcast float* %85 to <4 x float>* >> %92 = bitcast float* %86 to <4 x float>* >> %93 = bitcast float* %87 to <4 x float>* >> %94 = bitcast float* %88 to <4 x float>* >> %95 = load <4 x float>* %91, align 16 >> %96 = shufflevector <4 x float> %95, <4 x float> undef, <2 x i32> >> <i32 0, i32 1> >> %97 = load <4 x float>* %92, align 16 >> %98 = shufflevector <4 x float> %97, <4 x float> undef, <2 x i32> >> <i32 0, i32 1> >> %99 = shufflevector <2 x float> %98, <2 x float> %96, <4 x i32> >> <i32 >> 0, i32 1, i32 2, i32 3> >> %100 = load <4 x float>* %93, align 16 >> %101 = shufflevector <4 x float> %100, <4 x float> undef, <2 x >> i32> >> <i32 0, i32 1> >> .... >> >> >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>