[llvm-commits] [test-suite] r171745 - in /test-suite/trunk: LICENSE.TXT SingleSource/Benchmarks/Makefile SingleSource/Benchmarks/SmallPT/ SingleSource/Benchmarks/SmallPT/LICENSE.txt SingleSource/Benchmarks/SmallPT/Makefile SingleSource/Benchmarks/S...

Chad Rosier mcrosier at apple.com
Wed Mar 6 13:52:03 PST 2013


On Mar 5, 2013, at 7:14 PM, "Redmond, Paul" <paul.redmond at intel.com> wrote:

> Seems reasonable to me.

Committed r176561.  Thanks, Paul.

> 
> From: Chad Rosier <mcrosier at apple.com<mailto:mcrosier at apple.com>>
> Date: Tuesday, 5 March, 2013 5:54 PM
> To: "llvm-commits at cs.uiuc.edu<mailto:llvm-commits at cs.uiuc.edu>" <llvm-commits at cs.uiuc.edu<mailto:llvm-commits at cs.uiuc.edu>>
> Cc: Paul Redmond <paul.redmond at intel.com<mailto:paul.redmond at intel.com>>, Duncan Sands <baldrick at free.fr<mailto:baldrick at free.fr>>
> Subject: Re: [llvm-commits] [test-suite] r171745 - in /test-suite/trunk: LICENSE.TXT SingleSource/Benchmarks/Makefile SingleSource/Benchmarks/SmallPT/ SingleSource/Benchmarks/SmallPT/LICENSE.txt SingleSource/Benchmarks/SmallPT/Makefile SingleSource/Benchmarks/S...
> 
> All,
> Smallpt has been failing on a few of our internal nightly testers since it was introduced.  Fortunately,
> there's nothing wrong with the code that's being generated.  The issue is that the stack is being
> blown out for unoptimized builds.  Below is a patch that bounds the recursion in an attempt to
> prevent such failures.  Hopefully, this makes the runtime a little more tractable as well.
> 
> Index: SingleSource/Benchmarks/SmallPT/smallpt.cpp
> ===================================================================
> --- SingleSource/Benchmarks/SmallPT/smallpt.cpp(revision 176513)
> +++ SingleSource/Benchmarks/SmallPT/smallpt.cpp(working copy)
> @@ -53,6 +53,7 @@
>   Vec x=r.o+r.d*t, n=(x-obj.p).norm(), nl=n.dot(r.d)<0?n:n*-1, f=obj.c;
>   double p = f.x>f.y && f.x>f.z ? f.x : f.y>f.z ? f.y : f.z; // max refl
>   if (++depth>5) if (erand48(Xi)<p) f=f*(1/p); else return obj.e; //R.R.
> +  if (depth>128) return obj.e; //Bound to avoid stack overflow at -O0.
>   if (obj.refl == DIFF){                  // Ideal DIFFUSE reflection
>     double r1=2*M_PI*erand48(Xi), r2=erand48(Xi), r2s=sqrt(r2);
>     Vec w=nl, u=((fabs(w.x)>.1?Vec(0,1):Vec(1))%w).norm(), v=w%u;
> 
> Chad
> 
> On Jan 7, 2013, at 7:25 AM, Paul Redmond <paul.redmond at intel.com<mailto:paul.redmond at intel.com>> wrote:
> 
> Author: predmond
> Date: Mon Jan  7 09:25:10 2013
> New Revision: 171745
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=171745&view=rev
> Log:
> add smallpt benchmark to test-suite
> 
> original source from http://www.kevinbeason.com/smallpt/ with the following
> modifications:
> - commented out openmp pragma
> - disabled writing to output image to file
> 
> Added:
>   test-suite/trunk/SingleSource/Benchmarks/SmallPT/
>   test-suite/trunk/SingleSource/Benchmarks/SmallPT/LICENSE.txt
>   test-suite/trunk/SingleSource/Benchmarks/SmallPT/Makefile
>   test-suite/trunk/SingleSource/Benchmarks/SmallPT/README
>   test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.cpp
>   test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.reference_output
> Modified:
>   test-suite/trunk/LICENSE.TXT
>   test-suite/trunk/SingleSource/Benchmarks/Makefile
> 
> Modified: test-suite/trunk/LICENSE.TXT
> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/LICENSE.TXT?rev=171745&r1=171744&r2=171745&view=diff
> ==============================================================================
> --- test-suite/trunk/LICENSE.TXT (original)
> +++ test-suite/trunk/LICENSE.TXT Mon Jan  7 09:25:10 2013
> @@ -108,3 +108,4 @@
> SingleSource Tests: llvm-test/SingleSource/Benchmarks/Misc
>                    llvm-test/SingleSource/CustomChecked
>                    llvm-test/SingleSource/Gizmos
> +                    llvm-test/SingleSource/Benchmarks/SmallPT
> 
> Modified: test-suite/trunk/SingleSource/Benchmarks/Makefile
> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/Makefile?rev=171745&r1=171744&r2=171745&view=diff
> ==============================================================================
> --- test-suite/trunk/SingleSource/Benchmarks/Makefile (original)
> +++ test-suite/trunk/SingleSource/Benchmarks/Makefile Mon Jan  7 09:25:10 2013
> @@ -1,6 +1,7 @@
> LEVEL = ../..
> PARALLEL_DIRS := Dhrystone CoyoteBench Shootout Shootout-C++ Stanford McGill \
> -              Misc Misc-C++ Misc-C++-EH BenchmarkGame Adobe-C++ Polybench Linpack LivermoreLoops
> +              Misc Misc-C++ Misc-C++-EH BenchmarkGame Adobe-C++ Polybench Linpack LivermoreLoops \
> +              SmallPT
> LDFLAGS += -lm
> 
> # Disable Polybench tests on ARM for the time being, they are very long running.
> 
> Added: test-suite/trunk/SingleSource/Benchmarks/SmallPT/LICENSE.txt
> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/SmallPT/LICENSE.txt?rev=171745&view=auto
> ==============================================================================
> --- test-suite/trunk/SingleSource/Benchmarks/SmallPT/LICENSE.txt (added)
> +++ test-suite/trunk/SingleSource/Benchmarks/SmallPT/LICENSE.txt Mon Jan  7 09:25:10 2013
> @@ -0,0 +1,22 @@
> +LICENSE
> +
> +Copyright (c) 2006-2008 Kevin Beason (kevin.beason at gmail.com<mailto:kevin.beason at gmail.com>)
> +
> +Permission is hereby granted, free of charge, to any person obtaining
> +a copy of this software and associated documentation files (the
> +"Software"), to deal in the Software without restriction, including
> +without limitation the rights to use, copy, modify, merge, publish,
> +distribute, sublicense, and/or sell copies of the Software, and to
> +permit persons to whom the Software is furnished to do so, subject to
> +the following conditions:
> +
> +The above copyright notice and this permission notice shall be included
> +in all copies or substantial portions of the Software.
> +
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> 
> Added: test-suite/trunk/SingleSource/Benchmarks/SmallPT/Makefile
> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/SmallPT/Makefile?rev=171745&view=auto
> ==============================================================================
> --- test-suite/trunk/SingleSource/Benchmarks/SmallPT/Makefile (added)
> +++ test-suite/trunk/SingleSource/Benchmarks/SmallPT/Makefile Mon Jan  7 09:25:10 2013
> @@ -0,0 +1,7 @@
> +LEVEL = ../../..
> +LDFLAGS += -lm
> +FP_TOLERANCE := 0.001
> +
> +include $(LEVEL)/Makefile.config
> +
> +include $(LEVEL)/SingleSource/Makefile.singlesrc
> 
> Added: test-suite/trunk/SingleSource/Benchmarks/SmallPT/README
> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/SmallPT/README?rev=171745&view=auto
> ==============================================================================
> --- test-suite/trunk/SingleSource/Benchmarks/SmallPT/README (added)
> +++ test-suite/trunk/SingleSource/Benchmarks/SmallPT/README Mon Jan  7 09:25:10 2013
> @@ -0,0 +1,119 @@
> +TITLE
> +
> +smallpt: Global Illumination in 99 lines of C++
> +
> +CREDITS
> +
> +Author: Kevin Beason (kevin.beason [at] gmail.com<http://gmail.com/>)
> +Date: 10/11/2008
> +
> +SUMMARY
> +
> +smallpt is a small Monte Carlo path tracer, and generates a single image of a
> +modified Cornell box rendered with full global illumination (GI). It does this
> +by solving the rendering equation, including ideal Lambertian, specular, and
> +dielectric reflection, area lights, anti-aliasing, importance sampling, and
> +multi-threading. It is only 99 lines of C++, but illustrates photo realistic
> +rendering in a correct, and concise manner.
> +
> +DESCRIPTION
> +
> +The source code for a small program that path traces a simple Cornell box and
> +produces accurate results in a terse implementation is given, which provides an
> +educational example to new graphics students (and seasoned alike), and yields a
> +ground truth image, all in an easy to read package. Never before has a correct,
> +complete, and functioning path tracer been presented so succinctly. Readers
> +will see ray-sphere intersection, Monte Carlo path tracing, Russian roulette,
> +importance sampling, anti-aliasing, and OpenMP multi-threading in a concrete
> +working example, which may be read from beginning to end in a single
> +sitting. The program compiles with GCC 4.2 down to a 16k executable and
> +produces a 1024x768 resolution image using 5000 paths in 2 hours on an Intel
> +Core 2 Quad machine. With slight modifications (smallpt4k.cpp) the code compiles to
> +under 4KB.
> +
> +FEATURES
> +
> +* Global illumination
> +* Unbiased Monte Carlo path tracing
> +* Cornell box scene description
> +* Ray-sphere intersection
> +* Soft shadows from diffuse luminaire
> +* Specular, Diffuse, and Glass BRDFs
> +* Cosine importance sampling of the hemisphere for diffuse reflection
> +* Russian roulette for path termination
> +* Russian roulette for selecting reflection or refraction for glass BRDF
> +* Antialiasing via super-sampling with importance-sampled tent distribution,
> +  and 2x2 subpixels
> +* Automatic multi-threading using OpenMP
> +* Less than 100 lines of 72-column code
> +* With provided code changes, can compile to 4K binary
> +
> +BUILDING
> +
> +There are two versions of smallpt. The basic version is called "smallpt"
> +(smallpt.cpp), and is 99 lines. A second version, "smallpt4k" (smallpt4k.cpp),
> +is 102 lines but compiles to 4K instead of 16KB. It is just a
> +proof-of-concept. They compute slightly different images due to compiler optimization differences.
> +The 4 KB version takes 30% longer.
> +
> +1) Modify top of Makefile to select the correct compiler.
> +2) "make smallpt" (This builds both the regular version)
> +3) "make smallpt4k"  (This builds the 4K version. Requires sstrip, see Makefile.)
> +
> +USAGE
> +
> +The program takes one argument, the number of samples per pixel. This value
> +must be greater than 4 to accommodate the 2x2 subpixel grid. For example,
> +the included reference image was generated with:
> +
> +     time ./smallpt 5000
> +
> +This took 124 minutes (2 hours) on a Intel Core 2 Quad Q6600 2.4GHz machine
> +running Kubuntu Linux (32-bit Gutsy).
> +
> +The tiny version takes no arguments (5000 samples/pixel is hard coded):
> +
> +    time ./smallpt4k
> +
> +Compilation requires gzip and ELFkicker's sstrip command. See the Makefile for
> +details. It executes in slightly longer time, and yields a slightly different
> +image due to compiler optimizations differences.
> +
> +The time command tells you how long the render takes and is optional. You can
> +view the image with most any image viewer. For example, if you have ImageMagick
> +installed:
> +
> +    display image.ppm
> +
> +MORE INFO
> +
> +MINILIGHT - a minimal global illumination renderer, by Harrison Ainsworth
> +A similar, earlier project. More general but also larger (100x). The site has
> +some good information on Monte Carlo path tracing. Instead of repeating it
> +here, the reader is referred to that site:
> +http://www.hxa7241.org/minilight/minilight.html
> +
> +Realistic Ray Tracing by Peter Shirley
> +Almost 100% of smallpt is derived from this book.
> +http://www.amazon.com/Realistic-Ray-Tracing-Peter-Shirley/dp/1568811101
> +
> +Henrik Wann Jensen's Cornell box images
> +The inpiration of the output generated by smallpt.
> +http://graphics.ucsd.edu/~henrik/images/cbox.html
> +
> +100 lines C++ sphereflake raytracer, by Thierry Berger-Perrin
> +Ray sphere intersection code stolen from here. (No full GI.)
> +http://ompf.org/ray/sphereflake/
> +
> +sf4k, also by Thierry Berger-Perrin
> +Idea for 4K-ness. (No full GI.)
> +http://ompf.org/stuff/sf4k/
> +
> +C++ vs OCaml: Ray tracer comparison, by Jon D. Harrop
> +105 line C++ ray tracer. (No full GI.)
> +http://www.ffconsultancy.com/languages/ray_tracer/comparison.html
> +
> +Introduction to Linux as 4 KB Platform
> +Some information regarding shrinking binaries to 4KB on Linux .
> +http://in4k.untergrund.net/index.php?title=Linux
> +
> 
> Added: test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.cpp
> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.cpp?rev=171745&view=auto
> ==============================================================================
> --- test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.cpp (added)
> +++ test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.cpp Mon Jan  7 09:25:10 2013
> @@ -0,0 +1,102 @@
> +#include <math.h>   // smallpt, a Path Tracer by Kevin Beason, 2008
> +#include <stdlib.h> // Make : g++ -O3 -fopenmp smallpt.cpp -o smallpt
> +#include <stdio.h>  //        Remove "-fopenmp" for g++ version < 4.2
> +struct Vec {        // Usage: time ./smallpt 5000 && xv image.ppm
> +  double x, y, z;                  // position, also color (r,g,b)
> +  Vec(double x_=0, double y_=0, double z_=0){ x=x_; y=y_; z=z_; }
> +  Vec operator+(const Vec &b) const { return Vec(x+b.x,y+b.y,z+b.z); }
> +  Vec operator-(const Vec &b) const { return Vec(x-b.x,y-b.y,z-b.z); }
> +  Vec operator*(double b) const { return Vec(x*b,y*b,z*b); }
> +  Vec mult(const Vec &b) const { return Vec(x*b.x,y*b.y,z*b.z); }
> +  Vec& norm(){ return *this = *this * (1/sqrt(x*x+y*y+z*z)); }
> +  double dot(const Vec &b) const { return x*b.x+y*b.y+z*b.z; } // cross:
> +  Vec operator%(Vec&b){return Vec(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);}
> +};
> +struct Ray { Vec o, d; Ray(Vec o_, Vec d_) : o(o_), d(d_) {} };
> +enum Refl_t { DIFF, SPEC, REFR };  // material types, used in radiance()
> +struct Sphere {
> +  double rad;       // radius
> +  Vec p, e, c;      // position, emission, color
> +  Refl_t refl;      // reflection type (DIFFuse, SPECular, REFRactive)
> +  Sphere(double rad_, Vec p_, Vec e_, Vec c_, Refl_t refl_):
> +    rad(rad_), p(p_), e(e_), c(c_), refl(refl_) {}
> +  double intersect(const Ray &r) const { // returns distance, 0 if nohit
> +    Vec op = p-r.o; // Solve t^2*d.d + 2*t*(o-p).d + (o-p).(o-p)-R^2 = 0
> +    double t, eps=1e-4, b=op.dot(r.d), det=b*b-op.dot(op)+rad*rad;
> +    if (det<0) return 0; else det=sqrt(det);
> +    return (t=b-det)>eps ? t : ((t=b+det)>eps ? t : 0);
> +  }
> +};
> +Sphere spheres[] = {//Scene: radius, position, emission, color, material
> +  Sphere(1e5, Vec( 1e5+1,40.8,81.6), Vec(),Vec(.75,.25,.25),DIFF),//Left
> +  Sphere(1e5, Vec(-1e5+99,40.8,81.6),Vec(),Vec(.25,.25,.75),DIFF),//Rght
> +  Sphere(1e5, Vec(50,40.8, 1e5),     Vec(),Vec(.75,.75,.75),DIFF),//Back
> +  Sphere(1e5, Vec(50,40.8,-1e5+170), Vec(),Vec(),           DIFF),//Frnt
> +  Sphere(1e5, Vec(50, 1e5, 81.6),    Vec(),Vec(.75,.75,.75),DIFF),//Botm
> +  Sphere(1e5, Vec(50,-1e5+81.6,81.6),Vec(),Vec(.75,.75,.75),DIFF),//Top
> +  Sphere(16.5,Vec(27,16.5,47),       Vec(),Vec(1,1,1)*.999, SPEC),//Mirr
> +  Sphere(16.5,Vec(73,16.5,78),       Vec(),Vec(1,1,1)*.999, REFR),//Glas
> +  Sphere(600, Vec(50,681.6-.27,81.6),Vec(12,12,12),  Vec(), DIFF) //Lite
> +};
> +inline double clamp(double x){ return x<0 ? 0 : x>1 ? 1 : x; }
> +inline int toInt(double x){ return int(pow(clamp(x),1/2.2)*255+.5); }
> +inline bool intersect(const Ray &r, double &t, int &id){
> +  double n=sizeof(spheres)/sizeof(Sphere), d, inf=t=1e20;
> +  for(int i=int(n);i--;) if((d=spheres[i].intersect(r))&&d<t){t=d;id=i;}
> +  return t<inf;
> +}
> +Vec radiance(const Ray &r, int depth, unsigned short *Xi){
> +  double t;                               // distance to intersection
> +  int id=0;                               // id of intersected object
> +  if (!intersect(r, t, id)) return Vec(); // if miss, return black
> +  const Sphere &obj = spheres[id];        // the hit object
> +  Vec x=r.o+r.d*t, n=(x-obj.p).norm(), nl=n.dot(r.d)<0?n:n*-1, f=obj.c;
> +  double p = f.x>f.y && f.x>f.z ? f.x : f.y>f.z ? f.y : f.z; // max refl
> +  if (++depth>5) if (erand48(Xi)<p) f=f*(1/p); else return obj.e; //R.R.
> +  if (obj.refl == DIFF){                  // Ideal DIFFUSE reflection
> +    double r1=2*M_PI*erand48(Xi), r2=erand48(Xi), r2s=sqrt(r2);
> +    Vec w=nl, u=((fabs(w.x)>.1?Vec(0,1):Vec(1))%w).norm(), v=w%u;
> +    Vec d = (u*cos(r1)*r2s + v*sin(r1)*r2s + w*sqrt(1-r2)).norm();
> +    return obj.e + f.mult(radiance(Ray(x,d),depth,Xi));
> +  } else if (obj.refl == SPEC)            // Ideal SPECULAR reflection
> +    return obj.e + f.mult(radiance(Ray(x,r.d-n*2*n.dot(r.d)),depth,Xi));
> +  Ray reflRay(x, r.d-n*2*n.dot(r.d));     // Ideal dielectric REFRACTION
> +  bool into = n.dot(nl)>0;                // Ray from outside going in?
> +  double nc=1, nt=1.5, nnt=into?nc/nt:nt/nc, ddn=r.d.dot(nl), cos2t;
> +  if ((cos2t=1-nnt*nnt*(1-ddn*ddn))<0)    // Total internal reflection
> +    return obj.e + f.mult(radiance(reflRay,depth,Xi));
> +  Vec tdir = (r.d*nnt - n*((into?1:-1)*(ddn*nnt+sqrt(cos2t)))).norm();
> +  double a=nt-nc, b=nt+nc, R0=a*a/(b*b), c = 1-(into?-ddn:tdir.dot(n));
> +  double Re=R0+(1-R0)*c*c*c*c*c,Tr=1-Re,P=.25+.5*Re,RP=Re/P,TP=Tr/(1-P);
> +  return obj.e + f.mult(depth>2 ? (erand48(Xi)<P ?   // Russian roulette
> +    radiance(reflRay,depth,Xi)*RP:radiance(Ray(x,tdir),depth,Xi)*TP) :
> +    radiance(reflRay,depth,Xi)*Re+radiance(Ray(x,tdir),depth,Xi)*Tr);
> +}
> +int main(int argc, char *argv[]){
> +  int w=1024, h=768, samps = argc==2 ? atoi(argv[1])/4 : 1; // # samples
> +  Ray cam(Vec(50,52,295.6), Vec(0,-0.042612,-1).norm()); // cam pos, dir
> +  Vec cx=Vec(w*.5135/h), cy=(cx%cam.d).norm()*.5135, r, *c=new Vec[w*h];
> +  //#pragma omp parallel for schedule(dynamic, 1) private(r)       // OpenMP
> +  fprintf(stderr,"Rendering (%d spp)\n",samps*4);
> +  for (int y=0; y<h; y++){                       // Loop over image rows
> +    //fprintf(stderr,"\rRendering (%d spp) %5.2f%%",samps*4,100.*y/(h-1));
> +    for (unsigned short x=0, Xi[3]={0,0,y*y*y}; x<w; x++)   // Loop cols
> +      for (int sy=0, i=(h-y-1)*w+x; sy<2; sy++)     // 2x2 subpixel rows
> +        for (int sx=0; sx<2; sx++, r=Vec()){        // 2x2 subpixel cols
> +          for (int s=0; s<samps; s++){
> +            double r1=2*erand48(Xi), dx=r1<1 ? sqrt(r1)-1: 1-sqrt(2-r1);
> +            double r2=2*erand48(Xi), dy=r2<1 ? sqrt(r2)-1: 1-sqrt(2-r2);
> +            Vec d = cx*( ( (sx+.5 + dx)/2 + x)/w - .5) +
> +                    cy*( ( (sy+.5 + dy)/2 + y)/h - .5) + cam.d;
> +            r = r + radiance(Ray(cam.o+d*140,d.norm()),0,Xi)*(1./samps);
> +          } // Camera rays are pushed ^^^^^ forward to start in interior
> +          c[i] = c[i] + Vec(clamp(r.x),clamp(r.y),clamp(r.z))*.25;
> +        }
> +  }
> +#if 0
> +  FILE *f = fopen("image.ppm", "w");         // Write image to PPM file.
> +  fprintf(f, "P3\n%d %d\n%d\n", w, h, 255);
> +  for (int i=0; i<w*h; i++)
> +    fprintf(f, "%d %d %d\n", toInt(c[i].x), toInt(c[i].y), toInt(c[i].z));
> +#endif
> +}
> 
> Added: test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.reference_output
> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.reference_output?rev=171745&view=auto
> ==============================================================================
> --- test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.reference_output (added)
> +++ test-suite/trunk/SingleSource/Benchmarks/SmallPT/smallpt.reference_output Mon Jan  7 09:25:10 2013
> @@ -0,0 +1,2 @@
> +Rendering (4 spp)
> +exit 0
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu<mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130306/7cca1f63/attachment.html>


More information about the llvm-commits mailing list