[LLVMdev] instcombine adds alignment info

Frank Winter fwinter at jlab.org
Thu Jun 18 07:21:41 PDT 2015


Is it correct behavior that 'instcombine' not only combines instructions but also adds alignment information, and why. (In my case I wished it wouldn't do that). Attached the input and output module.


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(float* noalias %arg0, float* noalias %arg1, float* noalias %arg2) {

entrypoint:

   %0 = bitcast float* %arg1 to <2 x float>*

   %1 = bitcast float* %arg2 to <2 x float>*

   %2 = bitcast <2 x float>* %0 to <4 x float>*

   %3 = bitcast <2 x float>* %1 to <4 x float>*

   %4 = bitcast float* %arg0 to <2 x float>*

   %5 = load <4 x float>* %2

   %6 = load <4 x float>* %3

   %7 = fadd <4 x float> %6, %5

   %8 = bitcast <2 x float>* %4 to <4 x float>*

   store <4 x float> %7, <4 x float>* %8

   %9 = getelementptr float* %arg1, i32 4

   %10 = bitcast float* %9 to <2 x float>*

   %11 = getelementptr float* %arg2, i32 4

   %12 = bitcast float* %11 to <2 x float>*

   %13 = getelementptr float* %arg0, i32 4

   %14 = bitcast <2 x float>* %10 to <4 x float>*

   %15 = bitcast <2 x float>* %12 to <4 x float>*

   %16 = bitcast float* %13 to <2 x float>*

   %17 = load <4 x float>* %14

   %18 = load <4 x float>* %15

   %19 = fadd <4 x float> %18, %17

   %20 = bitcast <2 x float>* %16 to <4 x float>*

   store <4 x float> %19, <4 x float>* %20

   %21 = getelementptr float* %arg1, i32 8

   %22 = bitcast float* %21 to <2 x float>*

   %23 = getelementptr float* %arg2, i32 8

   %24 = bitcast float* %23 to <2 x float>*

   %25 = getelementptr float* %arg0, i32 8

   %26 = bitcast <2 x float>* %22 to <4 x float>*

   %27 = bitcast <2 x float>* %24 to <4 x float>*

   %28 = bitcast float* %25 to <2 x float>*

   %29 = load <4 x float>* %26

   %30 = load <4 x float>* %27

   %31 = fadd <4 x float> %30, %29

   %32 = bitcast <2 x float>* %28 to <4 x float>*

   store <4 x float> %31, <4 x float>* %32

   %33 = getelementptr float* %arg1, i32 12

   %34 = bitcast float* %33 to <2 x float>*

   %35 = getelementptr float* %arg2, i32 12

   %36 = bitcast float* %35 to <2 x float>*

   %37 = getelementptr float* %arg0, i32 12

   %38 = bitcast <2 x float>* %34 to <4 x float>*

   %39 = bitcast <2 x float>* %36 to <4 x float>*

   %40 = bitcast float* %37 to <2 x float>*

   %41 = load <4 x float>* %38

   %42 = load <4 x float>* %39

   %43 = fadd <4 x float> %42, %41

   %44 = bitcast <2 x float>* %40 to <4 x float>*

   store <4 x float> %43, <4 x float>* %44

   ret void

}


Output after llvm-3.6/bin/opt -instcombine -S < vec_add.ll


; 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(float* noalias %arg0, float* noalias %arg1, float* noalias %arg2) {

entrypoint:

   %0 = bitcast float* %arg1 to <4 x float>*

   %1 = bitcast float* %arg2 to <4 x float>*

   %2 = load <4 x float>* %0, align 16

   %3 = load <4 x float>* %1, align 16

   %4 = fadd <4 x float> %3, %2

   %5 = bitcast float* %arg0 to <4 x float>*

   store <4 x float> %4, <4 x float>* %5, align 16

   %6 = getelementptr float* %arg1, i64 4

   %7 = getelementptr float* %arg2, i64 4

   %8 = getelementptr float* %arg0, i64 4

   %9 = bitcast float* %6 to <4 x float>*

   %10 = bitcast float* %7 to <4 x float>*

   %11 = load <4 x float>* %9, align 16

   %12 = load <4 x float>* %10, align 16

   %13 = fadd <4 x float> %12, %11

   %14 = bitcast float* %8 to <4 x float>*

   store <4 x float> %13, <4 x float>* %14, align 16

   %15 = getelementptr float* %arg1, i64 8

   %16 = getelementptr float* %arg2, i64 8

   %17 = getelementptr float* %arg0, i64 8

   %18 = bitcast float* %15 to <4 x float>*

   %19 = bitcast float* %16 to <4 x float>*

   %20 = load <4 x float>* %18, align 16

   %21 = load <4 x float>* %19, align 16

   %22 = fadd <4 x float> %21, %20

   %23 = bitcast float* %17 to <4 x float>*

   store <4 x float> %22, <4 x float>* %23, align 16

   %24 = getelementptr float* %arg1, i64 12

   %25 = getelementptr float* %arg2, i64 12

   %26 = getelementptr float* %arg0, i64 12

   %27 = bitcast float* %24 to <4 x float>*

   %28 = bitcast float* %25 to <4 x float>*

   %29 = load <4 x float>* %27, align 16

   %30 = load <4 x float>* %28, align 16

   %31 = fadd <4 x float> %30, %29

   %32 = bitcast float* %26 to <4 x float>*

   store <4 x float> %31, <4 x float>* %32, align 16

   ret void

}





More information about the llvm-dev mailing list