Changes between Version 7 and Version 8 of SIMDVectorExampleInLLVM


Ignore:
Timestamp:
Oct 25, 2011 8:04:20 PM (4 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