如何创建变量快捷方式 [英] how to create variable shortcut

查看:156
本文介绍了如何创建变量快捷方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我需要创建复杂的数学公式,例如

  double f(double array1 [100],double array2 [ 100])
{
double z = array1 [21] * array2 [3] + array [10];
double q = array1 [21] * array1 [30] / array1 [10];
return array1 [1] * z * q;
}

或更复杂。我的解决方案是创建中间变量,如:

  double f(double array1 [100],double array2 [100])
{
double energy = array1 [21];
double mass = array2 [3];
double speed = array [10];
double z = energy * mass + speed;
double q = energy * array [30] / speed;
return array1 [1] * z * q;
}

问题是我真的不需要这些新的变量,不想浪费内存或增加调用函数的时间。所以现在我对每个中间变量使用 const ,所以也许编译器更容易优化它。但是也许最好使用引用。

解决方案

gcc-llvm与标准优化:忽略指令重新排序结果相同

  define double @ _Z1fPdS_(double * nocapture%array1,double * nocapture%array2)nounwind readonly {
entry:
%0 = getelementptr inbounds double *%array1,i64 21; < double *> [#uses = 1]
%1 =加载double *%0,align 8; < double> [#uses = 2]
%2 = getelementptr inbounds double *%array2,i64 3; < double *> [#uses = 1]
%3 = load double *%2,align 8; < double> [#uses = 1]
%4 = fmul double%1,%3; < double> [#uses = 1]
%5 = getelementptr inbounds double *%array1,i64 10; < double *> [#uses = 1]
%6 = load double *%5,align 8; < double> [#uses = 2]
%7 = fadd double%4,%6; < double> [#uses = 1]
%8 = getelementptr inbounds double *%array1,i64 30; < double *> [#uses = 1]
%9 = load double *%8,align 8; < double> [#uses = 1]
%10 = fmul double%1,%9; < double> [#uses = 1]
%11 = fdiv double%10,%6; < double> [#uses = 1]
%12 = getelementptr inbounds double *%array1,i64 1; < double *> [#uses = 1]
%13 = load double *%12,align 8; < double> [#uses = 1]
%14 = fmul double%13,%7; < double> [#uses = 1]
%15 = fmul double%14,%11; < double> [#uses = 1]
ret double%15
}

define double @ _Z2f2PdS_(double * nocapture%array1,double * nocapture%array2)nounwind readonly {
entry:
%0 = getelementptr inbounds double *%array1,i64 21; < double *> [#uses = 1]
%1 =加载double *%0,align 8; < double> [#uses = 2]
%2 = getelementptr inbounds double *%array2,i64 3; < double *> [#uses = 1]
%3 = load double *%2,align 8; < double> [#uses = 1]
%4 = getelementptr inbounds double *%array1,i64 10; < double *> [#uses = 1]
%5 = load double *%4,align 8; < double> [#uses = 2]
%6 = fmul double%1,%3; < double> [#uses = 1]
%7 = fadd double%6,%5; < double> [#uses = 1]
%8 = getelementptr inbounds double *%array1,i64 30; < double *> [#uses = 1]
%9 =加载double *%8,align 8; < double> [#uses = 1]
%10 = fmul double%9,%1; < double> [#uses = 1]
%11 = fdiv double%10,%5; < double> [#uses = 1]
%12 = getelementptr inbounds double *%array1,i64 1; < double *> [#uses = 1]
%13 = load double *%12,align 8; < double> [#uses = 1]
%14 = fmul double%13,%7; < double> [#uses = 1]
%15 = fmul double%14,%11; < double> [#uses = 1]
ret double%15
}


Suppose I need to create complex math formula, for example

double f(double array1[100], double array2[100])
{
    double z = array1[21] * array2[3] + array[10];
    double q = array1[21] * array1[30] / array1[10];
    return array1[1] * z * q;
}

or more complex. My solution is to create intermediate variables like:

double f(double array1[100], double array2[100])
{
    double energy = array1[21];
    double mass   = array2[3];
    double speed = array[10];
    double z = energy * mass + speed;
    double q = energy * array[30] / speed;
    return array1[1] * z * q;
}

the problem is that I don't really need these new variable and I don't want to waste memory or increase time to call the function. So now I'm using const for every intermediate variable so maybe the compilator is more prone to optimize it. But maybe is it better to use references?

解决方案

gcc-llvm with standard optimization: Results are identical ignoring instruction reordering

define double @_Z1fPdS_(double* nocapture %array1, double* nocapture %array2) nounwind readonly {
entry:
  %0 = getelementptr inbounds double* %array1, i64 21 ; <double*> [#uses=1]
  %1 = load double* %0, align 8                   ; <double> [#uses=2]
  %2 = getelementptr inbounds double* %array2, i64 3 ; <double*> [#uses=1]
  %3 = load double* %2, align 8                   ; <double> [#uses=1]
  %4 = fmul double %1, %3                         ; <double> [#uses=1]
  %5 = getelementptr inbounds double* %array1, i64 10 ; <double*> [#uses=1]
  %6 = load double* %5, align 8                   ; <double> [#uses=2]
  %7 = fadd double %4, %6                         ; <double> [#uses=1]
  %8 = getelementptr inbounds double* %array1, i64 30 ; <double*> [#uses=1]
  %9 = load double* %8, align 8                   ; <double> [#uses=1]
  %10 = fmul double %1, %9                        ; <double> [#uses=1]
  %11 = fdiv double %10, %6                       ; <double> [#uses=1]
  %12 = getelementptr inbounds double* %array1, i64 1 ; <double*> [#uses=1]
  %13 = load double* %12, align 8                 ; <double> [#uses=1]
  %14 = fmul double %13, %7                       ; <double> [#uses=1]
  %15 = fmul double %14, %11                      ; <double> [#uses=1]
  ret double %15
}

define double @_Z2f2PdS_(double* nocapture %array1, double* nocapture %array2) nounwind readonly {
entry:
  %0 = getelementptr inbounds double* %array1, i64 21 ; <double*> [#uses=1]
  %1 = load double* %0, align 8                   ; <double> [#uses=2]
  %2 = getelementptr inbounds double* %array2, i64 3 ; <double*> [#uses=1]
  %3 = load double* %2, align 8                   ; <double> [#uses=1]
  %4 = getelementptr inbounds double* %array1, i64 10 ; <double*> [#uses=1]
  %5 = load double* %4, align 8                   ; <double> [#uses=2]
  %6 = fmul double %1, %3                         ; <double> [#uses=1]
  %7 = fadd double %6, %5                         ; <double> [#uses=1]
  %8 = getelementptr inbounds double* %array1, i64 30 ; <double*> [#uses=1]
  %9 = load double* %8, align 8                   ; <double> [#uses=1]
  %10 = fmul double %9, %1                        ; <double> [#uses=1]
  %11 = fdiv double %10, %5                       ; <double> [#uses=1]
  %12 = getelementptr inbounds double* %array1, i64 1 ; <double*> [#uses=1]
  %13 = load double* %12, align 8                 ; <double> [#uses=1]
  %14 = fmul double %13, %7                       ; <double> [#uses=1]
  %15 = fmul double %14, %11                      ; <double> [#uses=1]
  ret double %15
}

这篇关于如何创建变量快捷方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆