[Mesa-stable] [Mesa-dev] [PATCH 1/2] swr/rast: don't create wrapper for every Create LLVM call

Hota, Alok alok.hota at intel.com
Mon Feb 4 17:04:47 UTC 2019


> -----Original Message-----
> From: mesa-dev [mailto:mesa-dev-bounces at lists.freedesktop.org] On
> Behalf Of Emil Velikov
> Sent: Monday, February 4, 2019 3:21 AM
> To: mesa-dev at lists.freedesktop.org
> Cc: mesa-stable at lists.freedesktop.org; emil.l.velikov at gmail.com; Hota, Alok
> <alok.hota at intel.com>
> Subject: [Mesa-dev] [PATCH 1/2] swr/rast: don't create wrapper for every
> Create LLVM call
> 
> We user only a fraction (approximatelly 1/4) of the API - generate only those.
> 
> This way, we spend less time processing and generate smaller file. This also
> removes the need for hacks needed for compiling files bootstrapped with
> another LLVM version.

Thanks for the patch!
I had to add one function, CreateNeg, to used_functions for it to compile for me.

> 
> Cc: Alok Hota <alok.hota at intel.com>
> Cc: Bruce Cherniak <bruce.cherniak at intel.com>
> Cc: mesa-stable at lists.freedesktop.org
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
>  .../rasterizer/codegen/gen_llvm_ir_macros.py  | 226 +++++++++++-------
>  1 file changed, 136 insertions(+), 90 deletions(-)
> 
> diff --git
> a/src/gallium/drivers/swr/rasterizer/codegen/gen_llvm_ir_macros.py
> b/src/gallium/drivers/swr/rasterizer/codegen/gen_llvm_ir_macros.py
> index 485403ae1ec..16872411408 100644
> --- a/src/gallium/drivers/swr/rasterizer/codegen/gen_llvm_ir_macros.py
> +++ b/src/gallium/drivers/swr/rasterizer/codegen/gen_llvm_ir_macros.py
> @@ -41,6 +41,72 @@ inst_aliases = {
>      'BIN_OP': 'BINOP',
>  }
> 
> +used_functions = [
> +    'CreateAdd',
> +    'CreateAlloca',
> +    'CreateAnd',
> +    'CreateAShr',
> +    'CreateBitCast',
> +    'CreateBr',
> +    'CreateCall',
> +    'CreateCast',
> +    'CreateCondBr',
> +    'CreateExtractElement',
> +    'CreateFAdd',
> +    'CreateFCmpOEQ',
> +    'CreateFCmpOGE',
> +    'CreateFCmpOGT',
> +    'CreateFCmpOLE',
> +    'CreateFCmpOLT',
> +    'CreateFCmpONE',
> +    'CreateFDiv',
> +    'CreateFMul',
> +    'CreateFPExt',
> +    'CreateFPToSI',
> +    'CreateFPToUI',
> +    'CreateFPTrunc',
> +    'CreateFSub',
> +    'CreateICmpEQ',
> +    'CreateICmpNE',
> +    'CreateICmpSGT',
> +    'CreateICmpSLE',
> +    'CreateICmpSLT',
> +    'CreateICmpUGE',
> +    'CreateICmpUGT',
> +    'CreateICmpULE',
> +    'CreateICmpULT',
> +    'CreateInBoundsGEP',
> +    'CreateInsertElement',
> +    'CreateInsertElement',
> +    'CreateIntToPtr',
> +    'CreateLShr',
> +    'CreateMaskedGather',
> +    'CreateMaskedStore',
> +    'CreateMemSet',
> +    'CreateMul',
> +    'CreateNot',
> +    'CreateOr',
> +    'CreatePHI',
> +    'CreatePointerCast',
> +    'CreatePtrToInt',
> +    'CreateRetVoid',
> +    'CreateSDiv',
> +    'CreateSelect',
> +    'CreateSExt',
> +    'CreateShl',
> +    'CreateShuffleVector',
> +    'CreateSIToFP',
> +    'CreateStore',
> +    'CreateSub',
> +    'CreateTrunc',
> +    'CreateUDiv',
> +    'CreateUIToFP',
> +    'CreateURem',
> +    'CreateVectorSplat',
> +    'CreateXor',
> +    'CreateZExt',
> +]
> +
>  intrinsics = [
>      ['VGATHERPD',   ['src', 'pBase', 'indices', 'mask', 'scale'], 'src'],
>      ['VGATHERPS',   ['src', 'pBase', 'indices', 'mask', 'scale'], 'src'],
> @@ -100,97 +166,77 @@ def parse_ir_builder(input_file):
>          line = lines[idx].rstrip()
>          idx += 1
> 
> -        #match = re.search(r'\*Create', line)
>          match = re.search(r'[\*\s]Create(\w*)\(', line)
> -        if match is not None:
> -            #print('Line: %s' % match.group(1))
> -
> -            if re.search(r'^\s*Create', line) is not None:
> -                func_sig = lines[idx-2].rstrip() + line
> -            else:
> -                func_sig = line
> -
> -            end_of_args = False
> -            while not end_of_args:
> -                end_paren = re.search(r'\)', line)
> -                if end_paren is not None:
> -                    end_of_args = True
> -                else:
> -                    line = lines[idx].rstrip()
> -                    func_sig += line
> -                    idx += 1
> -
> -            delfunc = re.search(r'LLVM_DELETED_FUNCTION|= delete;', func_sig)
> -
> -            if not delfunc:
> -                func = re.search(r'(.*?)\*[\n\s]*(Create\w*)\((.*?)\)', func_sig)
> -                if func is not None:
> -
> -                    return_type = func.group(1).strip() + '*'
> -                    func_name = func.group(2)
> -                    arguments = func.group(3)
> -
> -                    func_args = []
> -                    arg_names = []
> -                    args = arguments.split(',')
> -                    for arg in args:
> -                        arg = arg.strip()
> -                        if arg:
> -                            func_args.append(arg)
> -
> -                            split_args = arg.split('=')
> -                            arg_name = split_args[0].rsplit(None, 1)[-1]
> -
> -                            reg_arg = re.search(r'[\&\*]*(\w*)', arg_name)
> -                            if reg_arg:
> -                                arg_names += [reg_arg.group(1)]
> -
> -                    ignore = False
> -
> -                    # The following functions need to be ignored in openswr.
> -                    # API change in llvm-5.0 breaks baked autogen files
> -                    if (
> -                        (func_name == 'CreateFence' or
> -                         func_name == 'CreateAtomicCmpXchg' or
> -                         func_name == 'CreateAtomicRMW')):
> -                        ignore = True
> -
> -                    # The following functions need to be ignored.
> -                    if (func_name == 'CreateInsertNUWNSWBinOp' or
> -                        func_name == 'CreateMaskedIntrinsic' or
> -                        func_name == 'CreateAlignmentAssumptionHelper' or
> -                        func_name == 'CreateGEP' or
> -                        func_name == 'CreateLoad' or
> -                        func_name == 'CreateMaskedLoad' or
> -                        func_name == 'CreateElementUnorderedAtomicMemCpy'):
> -                        ignore = True
> -
> -                    # Convert CamelCase to CAMEL_CASE
> -                    func_mod = re.search(r'Create(\w*)', func_name)
> -                    if func_mod:
> -                        func_mod = func_mod.group(1)
> -                        func_mod = convert_uppercamel(func_mod)
> -                        if func_mod[0:2] == 'F_' or func_mod[0:2] == 'I_':
> -                            func_mod = func_mod[0] + func_mod[2:]
> -
> -                    # Substitute alias based on CAMEL_CASE name.
> -                    func_alias = inst_aliases.get(func_mod)
> -                    if not func_alias:
> -                        func_alias = func_mod
> -
> -                        if func_name == 'CreateCall' or func_name == 'CreateGEP':
> -                            arglist = re.search(r'ArrayRef', ', '.join(func_args))
> -                            if arglist:
> -                                func_alias = func_alias + 'A'
> -
> -                    if not ignore:
> -                        functions.append({
> -                                'name'      : func_name,
> -                                'alias'     : func_alias,
> -                                'return'    : return_type,
> -                                'args'      : ', '.join(func_args),
> -                                'arg_names' : arg_names,
> -                            })
> +        if match is None:
> +            continue
> +
> +        if re.search(r'^\s*Create', line) is not None:
> +            func_sig = lines[idx-2].rstrip() + line
> +        else:
> +            func_sig = line
> +
> +        while True:
> +            end_paren = re.search(r'\)', line)
> +            if end_paren is not None:
> +                break
> +            line = lines[idx].rstrip()
> +            func_sig += line
> +            idx += 1
> +
> +        delfunc = re.search(r'LLVM_DELETED_FUNCTION|= delete;',
> + func_sig)
> +
> +        if delfunc:
> +            continue
> +
> +        func = re.search(r'(.*?)\*[\n\s]*(Create\w*)\((.*?)\)', func_sig)
> +        if func is None:
> +            continue
> +
> +        return_type = func.group(1).strip() + '*'
> +        func_name = func.group(2)
> +        arguments = func.group(3)
> +
> +        # Skip functions we don't care about
> +        if func_name not in used_functions:
> +            continue
> +
> +        func_args = []
> +        arg_names = []
> +        args = arguments.split(',')
> +        for arg in args:
> +            arg = arg.strip()
> +            if arg:
> +                func_args.append(arg)
> +
> +                split_args = arg.split('=')
> +                arg_name = split_args[0].rsplit(None, 1)[-1]
> +
> +                reg_arg = re.search(r'[\&\*]*(\w*)', arg_name)
> +                if reg_arg:
> +                    arg_names += [reg_arg.group(1)]
> +
> +        # Convert CamelCase to CAMEL_CASE
> +        func_mod = convert_uppercamel(func_name.replace('Create', ''))
> +        if func_mod[0:2] == 'F_' or func_mod[0:2] == 'I_':
> +            func_mod = func_mod[0] + func_mod[2:]
> +
> +        # Substitute alias based on CAMEL_CASE name.
> +        func_alias = inst_aliases.get(func_mod)
> +        if not func_alias:
> +            func_alias = func_mod
> +
> +            if func_name == 'CreateCall':
> +                arglist = re.search(r'ArrayRef', ', '.join(func_args))
> +                if arglist:
> +                    func_alias = func_alias + 'A'
> +
> +        functions.append({
> +                            'name'      : func_name,
> +                            'alias'     : func_alias,
> +                            'return'    : return_type,
> +                            'args'      : ', '.join(func_args),
> +                            'arg_names' : arg_names,
> +                        })
> 
>      return functions
> 
> --
> 2.20.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-stable mailing list