On Fri, 18 Mar 2011 14:42:04 -0400
Matthew Mondor <[email protected]> wrote:

> When I can, I'll then redo these tests on both SBCL and ECL using
> various safety levels to ensure that at level three boundary checks
> always be performed, and to list where at level 0 optimization could be
> improved.

Attached is the test CL code and the resulting C code with ECL.
So for the SVREF case indeed 0-1 safety levels allow better
optimization, and ecl_aref1() is used at higher levels.

I'm not sure if all levels for all functions yield ideal results,
but this allows to easily compare them...
-- 
Matt
(defmacro gen (function)
  `(progn
     ,@(loop
          for i from 0 to 3
          collect
            `(defun ,(intern (format nil "~A-~A" function i)) ()
               (declare (optimize (safety ,i) (speed 3) (debug 0)))
               (,function #(#\A #\B #\C) 4)))))

(gen aref)
(gen svref)
(gen char)
(gen schar)
(gen elt)

/* Compiler: ECL 11.1.1                                          */
/* Date: 2011/3/18 15:17 (yyyy/mm/dd)                            */
/* Machine: NetBSD 5.1_STABLE i386                               */
/* Source: /tmp/index.lisp                                       */
#include <ecl/ecl-cmp.h>
#include "index.h"
/* local function GEN                                            */
/* optimize speed 3, debug 1, space 0, safety 1                  */
static cl_object 
LC1gen(cl_object V1, cl_object V2)
{
        VT2 VLEX2 CLSR2 STCK2
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        {
TTL:
                {
                        cl_object       V3;     /* FUNCTION        */
                        if ((CDR(V1)) == Cnil) {
                                goto L3;
                        }
                        V3 = CADR(V1);
                        goto L1;
        L3:             ;
                        V3 = si_dm_too_few_arguments(0) /* DM-TOO-FEW-ARGUMENTS 
*/ ;
                        goto L1;
        L1:             ;
                        (void) si_check_arg_length(2, V1, MAKE_FIXNUM(2)) /* 
CHECK-ARG-LENGTH */ ;
                        {
                                cl_fixnum       V4;     /* I               */
                                V4 = 0;
                                {
                                        cl_object       V5;
                                        cl_object       V6;
                                        V5 = ecl_list1(Cnil);
                                        V6 = V5;
                        L11:            ;
                                        T1 = V6;
                                        T2 = cl_format(4, Cnil, VV[0], V3, 
MAKE_FIXNUM(V4)) /* FORMAT     */ ;
                                        T3 = cl_intern(1, T2) /* INTERN         
 */ ;
                                        T4 = cl_list(2, ECL_SYM("SAFETY", 732), 
MAKE_FIXNUM(V4)) /* LIST */ ;
                                        T5 = cl_listX(3, ECL_SYM("OPTIMIZE", 
611), T4, VV[1]) /* LIST*    */ ;
                                        T6 = cl_list(2, ECL_SYM("DECLARE", 
272), T5) /* LIST            */ ;
                                        T7 = CONS(V3, VV[2]);
                                        T8 = cl_list(5, ECL_SYM("DEFUN", 287), 
T3, Cnil, T6, T7) /* LIST    */ ;
                                        V6 = ecl_list1(T8);
                                        ECL_CONS_CDR(T1) = V6;
                                        V4 = (V4) + 1;
                                        if (!((V4) > (3))) {
                                                goto L19;
                                        }
                                        goto L12;
                        L19:            ;
                                        goto L17;
                        L17:            ;
                                        goto L11;
                        L12:            ;
                                        T0 = CDR(V5);
                                        goto L6;
                                }
                        }
        L6:             ;
                        value0 = CONS(ECL_SYM("PROGN", 669), T0);
                        cl_env_copy->nvalues = 1;
                        return value0;
                }
        }
}
/* function definition for AREF-0                                */
/* optimize speed 3, debug 0, space 0, safety 0                  */
static cl_object 
L2aref_0()
{
        VT3 VLEX3 CLSR3 STCK3
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
TTL:
        value0 = ecl_aref_unsafe(VV[4], 4);
        cl_env_copy->nvalues = 1;
        return value0;
}
/* function definition for AREF-1                                */
/* optimize speed 3, debug 0, space 0, safety 1                  */
static cl_object 
L3aref_1()
{
        VT4 VLEX4 CLSR4 STCK4
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        {
TTL:
                if (ecl_unlikely(!ECL_VECTORP(VV[4])))
                        FEtype_error_vector(VV[4]);
                if (ecl_unlikely((4) >= (VV[4])->vector.dim))
                        FEwrong_index(Cnil, VV[4], -1, MAKE_FIXNUM(4), 
(VV[4])->vector.dim);
                value0 = ecl_aref_unsafe(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for AREF-2                                */
/* optimize speed 3, debug 0, space 0, safety 2                  */
static cl_object 
L4aref_2()
{
        VT5 VLEX5 CLSR5 STCK5
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                if (ecl_unlikely(!ECL_VECTORP(VV[4])))
                        FEtype_error_vector(VV[4]);
                if (ecl_unlikely((4) >= (VV[4])->vector.dim))
                        FEwrong_index(Cnil, VV[4], -1, MAKE_FIXNUM(4), 
(VV[4])->vector.dim);
                value0 = ecl_aref_unsafe(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for AREF-3                                */
/* optimize speed 3, debug 0, space 0, safety 3                  */
static cl_object 
L5aref_3()
{
        VT6 VLEX6 CLSR6 STCK6
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                if (ecl_unlikely(!ECL_VECTORP(VV[4])))
                        FEtype_error_vector(VV[4]);
                if (ecl_unlikely((4) >= (VV[4])->vector.dim))
                        FEwrong_index(Cnil, VV[4], -1, MAKE_FIXNUM(4), 
(VV[4])->vector.dim);
                value0 = ecl_aref_unsafe(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for SVREF-0                               */
/* optimize speed 3, debug 0, space 0, safety 0                  */
static cl_object 
L6svref_0()
{
        VT7 VLEX7 CLSR7 STCK7
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
TTL:
        value0 = (VV[4])->vector.self.t[4];
        cl_env_copy->nvalues = 1;
        return value0;
}
/* function definition for SVREF-1                               */
/* optimize speed 3, debug 0, space 0, safety 1                  */
static cl_object 
L7svref_1()
{
        VT8 VLEX8 CLSR8 STCK8
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        {
TTL:
                value0 = (VV[4])->vector.self.t[4];
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for SVREF-2                               */
/* optimize speed 3, debug 0, space 0, safety 2                  */
static cl_object 
L8svref_2()
{
        VT9 VLEX9 CLSR9 STCK9
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = ecl_aref1(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for SVREF-3                               */
/* optimize speed 3, debug 0, space 0, safety 3                  */
static cl_object 
L9svref_3()
{
        VT10 VLEX10 CLSR10 STCK10
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = ecl_aref1(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for CHAR-0                                */
/* optimize speed 3, debug 0, space 0, safety 0                  */
static cl_object 
L10char_0()
{
        VT11 VLEX11 CLSR11 STCK11
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
TTL:
        value0 = CODE_CHAR(ecl_char(VV[4], 4));
        cl_env_copy->nvalues = 1;
        return value0;
}
/* function definition for CHAR-1                                */
/* optimize speed 3, debug 0, space 0, safety 1                  */
static cl_object 
L11char_1()
{
        VT12 VLEX12 CLSR12 STCK12
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        {
TTL:
                value0 = CODE_CHAR(ecl_char(VV[4], 4));
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for CHAR-2                                */
/* optimize speed 3, debug 0, space 0, safety 2                  */
static cl_object 
L12char_2()
{
        VT13 VLEX13 CLSR13 STCK13
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = CODE_CHAR(ecl_char(VV[4], 4));
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for CHAR-3                                */
/* optimize speed 3, debug 0, space 0, safety 3                  */
static cl_object 
L13char_3()
{
        VT14 VLEX14 CLSR14 STCK14
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = CODE_CHAR(ecl_char(VV[4], 4));
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for SCHAR-0                               */
/* optimize speed 3, debug 0, space 0, safety 0                  */
static cl_object 
L14schar_0()
{
        VT15 VLEX15 CLSR15 STCK15
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
TTL:
        value0 = CODE_CHAR(ecl_char(VV[4], 4));
        cl_env_copy->nvalues = 1;
        return value0;
}
/* function definition for SCHAR-1                               */
/* optimize speed 3, debug 0, space 0, safety 1                  */
static cl_object 
L15schar_1()
{
        VT16 VLEX16 CLSR16 STCK16
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        {
TTL:
                value0 = CODE_CHAR(ecl_char(VV[4], 4));
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for SCHAR-2                               */
/* optimize speed 3, debug 0, space 0, safety 2                  */
static cl_object 
L16schar_2()
{
        VT17 VLEX17 CLSR17 STCK17
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = CODE_CHAR(ecl_char(VV[4], 4));
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for SCHAR-3                               */
/* optimize speed 3, debug 0, space 0, safety 3                  */
static cl_object 
L17schar_3()
{
        VT18 VLEX18 CLSR18 STCK18
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = CODE_CHAR(ecl_char(VV[4], 4));
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for ELT-0                                 */
/* optimize speed 3, debug 0, space 0, safety 0                  */
static cl_object 
L18elt_0()
{
        VT19 VLEX19 CLSR19 STCK19
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
TTL:
        value0 = ecl_elt(VV[4], 4);
        cl_env_copy->nvalues = 1;
        return value0;
}
/* function definition for ELT-1                                 */
/* optimize speed 3, debug 0, space 0, safety 1                  */
static cl_object 
L19elt_1()
{
        VT20 VLEX20 CLSR20 STCK20
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        {
TTL:
                value0 = ecl_elt(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for ELT-2                                 */
/* optimize speed 3, debug 0, space 0, safety 2                  */
static cl_object 
L20elt_2()
{
        VT21 VLEX21 CLSR21 STCK21
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = ecl_elt(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}
/* function definition for ELT-3                                 */
/* optimize speed 3, debug 0, space 0, safety 3                  */
static cl_object 
L21elt_3()
{
        VT22 VLEX22 CLSR22 STCK22
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        ecl_cs_check(cl_env_copy, value0);
        {
TTL:
                value0 = ecl_elt(VV[4], 4);
                cl_env_copy->nvalues = 1;
                return value0;
        }
}

#include "index.data"
#ifdef __cplusplus
extern          "C"
#endif
                ECL_DLLEXPORT void 
init_fas_CODE(cl_object flag)
{
        VT1 VLEX1 CLSR1 STCK1
                        const cl_env_ptr cl_env_copy = ecl_process_env();
        cl_object       value0;
        cl_object      *VVtemp;
        if (!FIXNUMP(flag)) {
                Cblock = flag;
#ifndef ECL_DYNAMIC_VV
                flag->cblock.data = VV;
#endif
                flag->cblock.data_size = VM;
                flag->cblock.temp_data_size = VMtemp;
                flag->cblock.data_text = compiler_data_text;
                flag->cblock.data_text_size = compiler_data_text_size;
                flag->cblock.cfuns_size = compiler_cfuns_size;
                flag->cblock.cfuns = compiler_cfuns;
                flag->cblock.source = 
make_constant_base_string("/tmp/index.lisp");
                return;
        }
#ifdef ECL_DYNAMIC_VV
        VV = Cblock->cblock.data;
#endif
        Cblock->cblock.data_text = "@EcLtAg:init_fas_CODE@";
        VVtemp = Cblock->cblock.temp_data;
        ecl_cmp_defmacro(VV[25]);
        ecl_cmp_defun(VV[26]);
        ecl_cmp_defun(VV[27]);
        ecl_cmp_defun(VV[28]);
        ecl_cmp_defun(VV[29]);
        ecl_cmp_defun(VV[30]);
        ecl_cmp_defun(VV[31]);
        ecl_cmp_defun(VV[32]);
        ecl_cmp_defun(VV[33]);
        ecl_cmp_defun(VV[34]);
        ecl_cmp_defun(VV[35]);
        ecl_cmp_defun(VV[36]);
        ecl_cmp_defun(VV[37]);
        ecl_cmp_defun(VV[38]);
        ecl_cmp_defun(VV[39]);
        ecl_cmp_defun(VV[40]);
        ecl_cmp_defun(VV[41]);
        ecl_cmp_defun(VV[42]);
        ecl_cmp_defun(VV[43]);
        ecl_cmp_defun(VV[44]);
        ecl_cmp_defun(VV[45]);
}
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Ecls-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ecls-list

Reply via email to