Changes between Version 7 and Version 8 of SIMDVectorExampleInLLVM


Ignore:
Timestamp:
Oct 25, 2011 8:04:20 PM (2 years ago)
Author:
pmonday
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SIMDVectorExampleInLLVM

    v7 v8  
    223223}}} 
    224224 
    225 The resulting non-optimized LLVM code is as follows: 
    226 {{{ 
    227 ; ModuleID = '/tmp/webcompile/_718_0.bc' 
     225In this case, the LLVM code is more compact and easier to work with if we use the optimized version of it.  You will note in the LLVM code that this optimizer does not automatically vectorize and, instead, still has 4 "fadd" instructions at the heart of the addition loop. 
     226 
     227The resulting optimized LLVM code is as follows: 
     228{{{ 
     229; ModuleID = '/tmp/webcompile/_2358_0.bc' 
    228230target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 
    229231target triple = "x86_64-unknown-linux-gnu" 
    230232 
    231 @.str = private unnamed_addr constant [13 x i8] c"%f %f %f %f\0A\00" 
     233@.str = private constant [13 x i8] c"%f %f %f %f\0A\00" 
    232234 
    233235define i32 @main() nounwind { 
    234   %1 = alloca i32, align 4 
    235   %sz = alloca i32, align 4 
    236   %2 = alloca i8* 
    237   %i = alloca i32, align 4 
    238   store i32 0, i32* %1 
    239   store i32 40000, i32* %sz, align 4 
    240   %3 = call i8* @llvm.stacksave() 
    241   store i8* %3, i8** %2 
    242   %4 = load i32* %sz, align 4 
    243   %5 = zext i32 %4 to i64 
    244   %6 = mul i64 4, %5 
    245   %7 = alloca i8, i64 %6, align 16 
    246   %8 = bitcast i8* %7 to float* 
    247   %9 = load i32* %sz, align 4 
    248   %10 = zext i32 %9 to i64 
    249   %11 = mul i64 4, %10 
    250   %12 = alloca i8, i64 %11, align 16 
    251   %13 = bitcast i8* %12 to float* 
    252   %14 = load i32* %sz, align 4 
    253   %15 = zext i32 %14 to i64 
    254   %16 = mul i64 4, %15 
    255   %17 = alloca i8, i64 %16, align 16 
    256   %18 = bitcast i8* %17 to float* 
    257   store i32 0, i32* %i, align 4 
    258   br label %19 
    259  
    260 ; <label>:19                                      ; preds = %36, %0 
    261   %20 = load i32* %i, align 4 
    262   %21 = load i32* %sz, align 4 
    263   %22 = icmp slt i32 %20, %21 
    264   br i1 %22, label %23, label %39 
    265  
    266 ; <label>:23                                      ; preds = %19 
    267   %24 = load i32* %i, align 4 
    268   %25 = sitofp i32 %24 to float 
    269   %26 = load i32* %i, align 4 
    270   %27 = sext i32 %26 to i64 
    271   %28 = getelementptr inbounds float* %8, i64 %27 
    272   store float %25, float* %28 
    273   %29 = load i32* %i, align 4 
    274   %30 = load i32* %sz, align 4 
    275   %31 = add nsw i32 %29, %30 
    276   %32 = sitofp i32 %31 to float 
    277   %33 = load i32* %i, align 4 
    278   %34 = sext i32 %33 to i64 
    279   %35 = getelementptr inbounds float* %13, i64 %34 
    280   store float %32, float* %35 
    281   br label %36 
    282  
    283 ; <label>:36                                      ; preds = %23 
    284   %37 = load i32* %i, align 4 
    285   %38 = add nsw i32 %37, 1 
    286   store i32 %38, i32* %i, align 4 
    287   br label %19 
    288  
    289 ; <label>:39                                      ; preds = %19 
    290   store i32 0, i32* %i, align 4 
    291   br label %40 
    292  
    293 ; <label>:40                                      ; preds = %102, %39 
    294   %41 = load i32* %i, align 4 
    295   %42 = load i32* %sz, align 4 
    296   %43 = icmp slt i32 %41, %42 
    297   br i1 %43, label %44, label %105 
    298  
    299 ; <label>:44                                      ; preds = %40 
    300   %45 = load i32* %i, align 4 
    301   %46 = sext i32 %45 to i64 
    302   %47 = getelementptr inbounds float* %8, i64 %46 
    303   %48 = load float* %47 
    304   %49 = load i32* %i, align 4 
    305   %50 = sext i32 %49 to i64 
    306   %51 = getelementptr inbounds float* %13, i64 %50 
    307   %52 = load float* %51 
    308   %53 = fadd float %48, %52 
    309   %54 = load i32* %i, align 4 
    310   %55 = sext i32 %54 to i64 
    311   %56 = getelementptr inbounds float* %18, i64 %55 
    312   store float %53, float* %56 
    313   %57 = load i32* %i, align 4 
    314   %58 = add nsw i32 %57, 1 
    315   %59 = sext i32 %58 to i64 
    316   %60 = getelementptr inbounds float* %8, i64 %59 
    317   %61 = load float* %60 
    318   %62 = load i32* %i, align 4 
    319   %63 = add nsw i32 %62, 1 
    320   %64 = sext i32 %63 to i64 
    321   %65 = getelementptr inbounds float* %13, i64 %64 
    322   %66 = load float* %65 
    323   %67 = fadd float %61, %66 
    324   %68 = load i32* %i, align 4 
    325   %69 = add nsw i32 %68, 1 
    326   %70 = sext i32 %69 to i64 
    327   %71 = getelementptr inbounds float* %18, i64 %70 
    328   store float %67, float* %71 
    329   %72 = load i32* %i, align 4 
    330   %73 = add nsw i32 %72, 2 
    331   %74 = sext i32 %73 to i64 
    332   %75 = getelementptr inbounds float* %8, i64 %74 
    333   %76 = load float* %75 
    334   %77 = load i32* %i, align 4 
    335   %78 = add nsw i32 %77, 2 
    336   %79 = sext i32 %78 to i64 
    337   %80 = getelementptr inbounds float* %13, i64 %79 
    338   %81 = load float* %80 
    339   %82 = fadd float %76, %81 
    340   %83 = load i32* %i, align 4 
    341   %84 = add nsw i32 %83, 2 
    342   %85 = sext i32 %84 to i64 
    343   %86 = getelementptr inbounds float* %18, i64 %85 
    344   store float %82, float* %86 
    345   %87 = load i32* %i, align 4 
    346   %88 = add nsw i32 %87, 3 
    347   %89 = sext i32 %88 to i64 
    348   %90 = getelementptr inbounds float* %8, i64 %89 
    349   %91 = load float* %90 
    350   %92 = load i32* %i, align 4 
    351   %93 = add nsw i32 %92, 3 
    352   %94 = sext i32 %93 to i64 
    353   %95 = getelementptr inbounds float* %13, i64 %94 
    354   %96 = load float* %95 
    355   %97 = fadd float %91, %96 
    356   %98 = load i32* %i, align 4 
    357   %99 = add nsw i32 %98, 3 
    358   %100 = sext i32 %99 to i64 
    359   %101 = getelementptr inbounds float* %18, i64 %100 
    360   store float %97, float* %101 
    361   br label %102 
    362  
    363 ; <label>:102                                     ; preds = %44 
    364   %103 = load i32* %i, align 4 
    365   %104 = add nsw i32 %103, 4 
    366   store i32 %104, i32* %i, align 4 
    367   br label %40 
    368  
    369 ; <label>:105                                     ; preds = %40 
    370   %106 = getelementptr inbounds float* %18, i64 0 
    371   %107 = load float* %106 
    372   %108 = fpext float %107 to double 
    373   %109 = getelementptr inbounds float* %18, i64 1 
    374   %110 = load float* %109 
    375   %111 = fpext float %110 to double 
    376   %112 = getelementptr inbounds float* %18, i64 2 
    377   %113 = load float* %112 
    378   %114 = fpext float %113 to double 
    379   %115 = getelementptr inbounds float* %18, i64 3 
    380   %116 = load float* %115 
    381   %117 = fpext float %116 to double 
    382   %118 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0), double %108, double %111, double %114, double %117) 
    383   %119 = load i8** %2 
    384   call void @llvm.stackrestore(i8* %119) 
    385   %120 = load i32* %1 
    386   ret i32 %120 
    387 } 
    388  
    389 declare i8* @llvm.stacksave() nounwind 
    390  
    391 declare i32 @printf(i8*, ...) 
    392  
    393 declare void @llvm.stackrestore(i8*) nounwind 
     236; <label>:0 
     237  %1 = alloca [40000 x float], align 16 
     238  %2 = alloca [40000 x float], align 16 
     239  %3 = alloca [40000 x float], align 16 
     240  br label %4 
     241 
     242.preheader:                                       ; preds = %4 
     243  %.sub3 = getelementptr inbounds [40000 x float]* %3, i64 0, i64 0 
     244  br label %7 
     245 
     246; <label>:4                                       ; preds = %4, %0 
     247  %indvar20 = phi i64 [ 0, %0 ], [ %indvar.next21, %4 ] 
     248  %i.05 = trunc i64 %indvar20 to i32 
     249  %scevgep24 = getelementptr [40000 x float]* %2, i64 0, i64 %indvar20 
     250  %scevgep25 = getelementptr [40000 x float]* %1, i64 0, i64 %indvar20 
     251  %tmp26 = add i64 %indvar20, 40000 
     252  %tmp27 = trunc i64 %tmp26 to i32 
     253  %5 = sitofp i32 %i.05 to float 
     254  store float %5, float* %scevgep25, align 4, !tbaa !0 
     255  %6 = sitofp i32 %tmp27 to float 
     256  store float %6, float* %scevgep24, align 4, !tbaa !0 
     257  %indvar.next21 = add i64 %indvar20, 1 
     258  %exitcond22 = icmp eq i64 %indvar.next21, 40000 
     259  br i1 %exitcond22, label %.preheader, label %4 
     260 
     261; <label>:7                                       ; preds = %7, %.preheader 
     262  %indvar = phi i64 [ 0, %.preheader ], [ %indvar.next, %7 ] 
     263  %tmp = shl i64 %indvar, 2 
     264  %scevgep = getelementptr [40000 x float]* %3, i64 0, i64 %tmp 
     265  %scevgep6 = getelementptr [40000 x float]* %2, i64 0, i64 %tmp 
     266  %scevgep7 = getelementptr [40000 x float]* %1, i64 0, i64 %tmp 
     267  %tmp828 = or i64 %tmp, 1 
     268  %scevgep9 = getelementptr [40000 x float]* %3, i64 0, i64 %tmp828 
     269  %scevgep10 = getelementptr [40000 x float]* %2, i64 0, i64 %tmp828 
     270  %scevgep11 = getelementptr [40000 x float]* %1, i64 0, i64 %tmp828 
     271  %tmp1229 = or i64 %tmp, 2 
     272  %scevgep13 = getelementptr [40000 x float]* %3, i64 0, i64 %tmp1229 
     273  %scevgep14 = getelementptr [40000 x float]* %2, i64 0, i64 %tmp1229 
     274  %scevgep15 = getelementptr [40000 x float]* %1, i64 0, i64 %tmp1229 
     275  %tmp1630 = or i64 %tmp, 3 
     276  %scevgep17 = getelementptr [40000 x float]* %3, i64 0, i64 %tmp1630 
     277  %scevgep18 = getelementptr [40000 x float]* %2, i64 0, i64 %tmp1630 
     278  %scevgep19 = getelementptr [40000 x float]* %1, i64 0, i64 %tmp1630 
     279  %8 = load float* %scevgep7, align 16, !tbaa !0 
     280  %9 = load float* %scevgep6, align 16, !tbaa !0 
     281  %10 = fadd float %8, %9 
     282  store float %10, float* %scevgep, align 16, !tbaa !0 
     283  %11 = load float* %scevgep11, align 4, !tbaa !0 
     284  %12 = load float* %scevgep10, align 4, !tbaa !0 
     285  %13 = fadd float %11, %12 
     286  store float %13, float* %scevgep9, align 4, !tbaa !0 
     287  %14 = load float* %scevgep15, align 8, !tbaa !0 
     288  %15 = load float* %scevgep14, align 8, !tbaa !0 
     289  %16 = fadd float %14, %15 
     290  store float %16, float* %scevgep13, align 8, !tbaa !0 
     291  %17 = load float* %scevgep19, align 4, !tbaa !0 
     292  %18 = load float* %scevgep18, align 4, !tbaa !0 
     293  %19 = fadd float %17, %18 
     294  store float %19, float* %scevgep17, align 4, !tbaa !0 
     295  %indvar.next = add i64 %indvar, 1 
     296  %exitcond = icmp eq i64 %indvar.next, 10000 
     297  br i1 %exitcond, label %20, label %7 
     298 
     299; <label>:20                                      ; preds = %7 
     300  %21 = load float* %.sub3, align 16, !tbaa !0 
     301  %22 = fpext float %21 to double 
     302  %23 = getelementptr inbounds [40000 x float]* %3, i64 0, i64 1 
     303  %24 = load float* %23, align 4, !tbaa !0 
     304  %25 = fpext float %24 to double 
     305  %26 = getelementptr inbounds [40000 x float]* %3, i64 0, i64 2 
     306  %27 = load float* %26, align 8, !tbaa !0 
     307  %28 = fpext float %27 to double 
     308  %29 = getelementptr inbounds [40000 x float]* %3, i64 0, i64 3 
     309  %30 = load float* %29, align 4, !tbaa !0 
     310  %31 = fpext float %30 to double 
     311  %32 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0), double %22, double %25, double %28, double %31) nounwind 
     312  ret i32 0 
     313} 
     314 
     315declare i32 @printf(i8* nocapture, ...) nounwind 
     316 
     317!0 = metadata !{metadata !"float", metadata !1} 
     318!1 = metadata !{metadata !"omnipotent char", metadata !2} 
     319!2 = metadata !{metadata !"Simple C/C++ TBAA", null} 
    394320}}} 
    395321