[llvm-commits] [llvm-gcc-4.2] r74570 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Bill Wendling isanbard at gmail.com
Tue Jun 30 16:45:04 PDT 2009


Hi Dale,

The buildbots are getting this error message:

/Volumes/Sandbox/Buildbot/llvm/build.llvm-gcc-i386-darwin9/llvm-gcc.src/gcc/llvm-convert.cpp:
In function 'void ChooseConstraintTuple(const char**, tree_node*,
unsigned int, unsigned int, unsigned int, const char**)':
/Volumes/Sandbox/Buildbot/llvm/build.llvm-gcc-i386-darwin9/llvm-gcc.src/gcc/llvm-convert.cpp:4013:
error: ISO C++ forbids variable-size array 'Weights'
/Volumes/Sandbox/Buildbot/llvm/build.llvm-gcc-i386-darwin9/llvm-gcc.src/gcc/llvm-convert.cpp:4017:
error: ISO C++ forbids variable-size array 'RunningConstraints'

Could you take a look?

-bw

On Tue, Jun 30, 2009 at 4:18 PM, Dale Johannesen<dalej at apple.com> wrote:
> Author: johannes
> Date: Tue Jun 30 18:18:07 2009
> New Revision: 74570
>
> URL: http://llvm.org/viewvc/llvm-project?rev=74570&view=rev
> Log:
> Add high-level matching algorithm for multiple
> alternative constraints in asm.  The low-level part,
> matching one possible constraint against one operand,
> is not done (of course, this is the hard part).  For
> variety, this time alternative 0 is always matched,
> with more random variation in tests that use this.
>
>
> Modified:
>    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
>
> Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=74570&r1=74569&r2=74570&view=diff
>
> ==============================================================================
> --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
> +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Jun 30 18:18:07 2009
> @@ -3981,6 +3981,14 @@
>   return Result;
>  }
>
> +/// See if operand "exp" can use the indicated Constraint (which is
> +/// terminated by a null or a comma).
> +/// Returns:  -1=no, 0=yes but auxiliary instructions needed, 1=yes and free
> +int MatchWeight(const char *Constraint, tree exp, bool isInput) {
> +  /// TEMPORARY.  This has the effect that alternative 0 is always chosen.
> +  return 0;
> +}
> +
>  /// ChooseConstraintTuple: we know each of the NumInputs+NumOutputs strings
>  /// in Constraints[] is a comma-separated list of NumChoices different
>  /// constraints.  Look through the operands and constraint possibilities
> @@ -4000,13 +4008,67 @@
>                       unsigned NumOutputs, unsigned NumChoices,
>                       const char **ReplacementStrings)
>  {
> -  unsigned int CommasToSkip;
> -  // TEMPORARY: assume the second set of constraints is the right one.
> -  // This is totally wrong, of course, but allows the mechanics of string
> -  // handling to be tested.
> -  CommasToSkip = 1;
> -
> +  int MaxWeight = 0;
> +  unsigned int CommasToSkip = 0;
> +  int Weights[NumChoices];
> +  // RunningConstraints is pointers into the Constraints strings which
> +  // are incremented as we go to point to the beginning of each
> +  // comma-separated alternative.
> +  const char* RunningConstraints[NumInputs+NumOutputs];
> +  memcpy(RunningConstraints, Constraints,
> +         (NumInputs+NumOutputs) * sizeof(const char*));
> +  // The entire point of this loop is to compute CommasToSkip.
> +  for (unsigned int i=0; i<NumChoices; i++) {
> +    Weights[i] = 0;
> +    unsigned int j = 0;
> +    for (tree Output = ASM_OUTPUTS(exp); j<NumOutputs;
> +         j++, Output = TREE_CHAIN(Output)) {
> +      if (i==0)
> +        RunningConstraints[j]++;    // skip leading =
> +      const char* p = RunningConstraints[j];
> +      if (Weights[i] != -1) {
> +        int w = MatchWeight(p, TREE_VALUE(Output), false);
> +        // Nonmatch means the entire tuple doesn't match.  However, we
> +        // keep scanning to set up RunningConstraints correctly for the
> +        // next tuple.
> +        if (w < 0)
> +          Weights[i] = -1;
> +        else
> +          Weights[i] += w;
> +      }
> +      while (*p!=0 && *p!=',')
> +        p++;
> +      if (*p!=0)
> +        p++;
> +      RunningConstraints[j] = p;
> +    }
> +    assert(j==NumOutputs);
> +    for (tree Input = ASM_INPUTS(exp); j<NumInputs+NumOutputs;
> +         j++, Input = TREE_CHAIN(Input)) {
> +      const char* p = RunningConstraints[j];
> +      if (Weights[i] != -1) {
> +        int w = MatchWeight(p, TREE_VALUE(Input), false);
> +        if (w < 0)
> +          Weights[i] = -1;    // As above.
> +        else
> +          Weights[i] += w;
> +      }
> +      while (*p!=0 && *p!=',')
> +        p++;
> +      if (*p!=0)
> +        p++;
> +      RunningConstraints[j] = p;
> +    }
> +    if (Weights[i]>MaxWeight) {
> +      CommasToSkip = i;
> +      MaxWeight = Weights[i];
> +    }
> +  }
> +  // We have picked an alternative (the CommasToSkip'th one).
> +  // Change Constraints to point to malloc'd copies of the appropriate
> +  // constraints picked out of the original strings.
>   for (unsigned int i=0; i<NumInputs+NumOutputs; i++) {
> +    assert(*(RunningConstraints[i])==0);   // sanity check
>     const char* start = Constraints[i];
>     if (i<NumOutputs)
>       start++;          // skip '=' or '+'
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list