Skip to content
  1. Jul 29, 2010
    • Argyrios Kyrtzidis's avatar
    • Chris Lattner's avatar
      Implement the clang-side of detection for when to pass as · e556a718
      Chris Lattner authored
      <2 x float> instead of double.  This works but can't be turned
      on until I teach codegen to pass <2 x float> as one XMM register
      instead of two.
      
      llvm-svn: 109790
      e556a718
    • Chris Lattner's avatar
      Look at me, I can count! · 50a357e9
      Chris Lattner authored
      llvm-svn: 109786
      50a357e9
    • Argyrios Kyrtzidis's avatar
      Merge PCHWriterDecl.cpp's isRequiredDecl and CodeGenModule::MayDeferGeneration into a new function, · c81af03f
      Argyrios Kyrtzidis authored
      DeclIsRequiredFunctionOrFileScopedVar.
      
      This is essentially a CodeGen predicate that is also needed by the PCH mechanism to determine whether a decl
      needs to be deserialized during PCH loading for codegen purposes.
      Since this logic is shared by CodeGen and the PCH mechanism, move it to the ASTContext,
      thus CodeGenModule's GetLinkageForFunction/GetLinkageForVariable and the GVALinkage enum is moved out of CodeGen.
      
      This fixes current (and avoids future) codegen-from-PCH bugs.
      
      llvm-svn: 109784
      c81af03f
    • Chris Lattner's avatar
      fix rdar://8251384, another case where we could access beyond the · 7f4b81af
      Chris Lattner authored
      end of a struct.  This improves the case when the struct being passed
      contains 3 floats, either due to a struct or array of 3 things.  Before
      we'd generate this IR for the testcase:
      
      define float @bar(double %X.coerce0, double %X.coerce1) nounwind {
      entry:
        %X = alloca %struct.foof, align 8               ; <%struct.foof*> [#uses=2]
        %0 = bitcast %struct.foof* %X to %1*            ; <%1*> [#uses=2]
        %1 = getelementptr %1* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %X.coerce0, double* %1
        %2 = getelementptr %1* %0, i32 0, i32 1         ; <double*> [#uses=1]
        store double %X.coerce1, double* %2
        %tmp = getelementptr inbounds %struct.foof* %X, i32 0, i32 2 ; <float*> [#uses=1]
        %tmp1 = load float* %tmp                        ; <float> [#uses=1]
        ret float %tmp1
      }
      
      which compiled (with optimization) to:
      
      _bar:                                   ## @bar
      ## BB#0:                                ## %entry
      	movd	%xmm1, %rax
      	movd	%eax, %xmm0
      	ret
      
      Now we produce:
      
      define float @bar(double %X.coerce0, float %X.coerce1) nounwind {
      entry:
        %X = alloca %struct.foof, align 8               ; <%struct.foof*> [#uses=2]
        %0 = bitcast %struct.foof* %X to %0*            ; <%0*> [#uses=2]
        %1 = getelementptr %0* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %X.coerce0, double* %1
        %2 = getelementptr %0* %0, i32 0, i32 1         ; <float*> [#uses=1]
        store float %X.coerce1, float* %2
        %tmp = getelementptr inbounds %struct.foof* %X, i32 0, i32 2 ; <float*> [#uses=1]
        %tmp1 = load float* %tmp                        ; <float> [#uses=1]
        ret float %tmp1
      }
      
      and:
      
      _bar:                                   ## @bar
      ## BB#0:                                ## %entry
      	movaps	%xmm1, %xmm0
      	ret
      
      llvm-svn: 109776
      7f4b81af
    • Chris Lattner's avatar
      start setting up infrastructure for passing multi-floats · c95a3989
      Chris Lattner authored
      as <2 x float> instead of as double.  The backend isn't ready
      yet, but infrastructure in the frontend can come up.
      
      llvm-svn: 109768
      c95a3989
    • Chris Lattner's avatar
      rename Get8ByteTypeAtOffset -> GetINTEGERTypeAtOffset to · 1c56d9ab
      Chris Lattner authored
      make it clear that this function should only return a type
      that the codegen will classify the same as an INTEGER type.
      
      llvm-svn: 109763
      1c56d9ab
    • Chris Lattner's avatar
      handle a case where we could access off the end of a function · 3f76342c
      Chris Lattner authored
      that Eli pointed out, rdar://8249586
      
      llvm-svn: 109762
      3f76342c
    • Chris Lattner's avatar
      fix PR7742 / rdar://8250764, a miscompilation of struct · cd84084f
      Chris Lattner authored
      return where the struct has a base but no fields.  This
      was because the x86-64 abi logic was checking the wrong
      predicate in one place.
      
      This was introduced in r91874, which was a fix for PR5831,
      which lacked a CHECK line, so I verified and added it.
      
      llvm-svn: 109759
      cd84084f
    • Chris Lattner's avatar
      This is a little bit far, but optimize cases like: · 98076a25
      Chris Lattner authored
      struct a {
        struct c {
          double x;
          int y;
        } x[1];
      };
      
      void foo(struct a A) {
      }
      
      into:
      
      define void @foo(double %A.coerce0, i32 %A.coerce1) nounwind {
      entry:
        %A = alloca %struct.a, align 8                  ; <%struct.a*> [#uses=1]
        %0 = bitcast %struct.a* %A to %struct.c*        ; <%struct.c*> [#uses=2]
        %1 = getelementptr %struct.c* %0, i32 0, i32 0  ; <double*> [#uses=1]
        store double %A.coerce0, double* %1
        %2 = getelementptr %struct.c* %0, i32 0, i32 1  ; <i32*> [#uses=1]
        store i32 %A.coerce1, i32* %2
      
      instead of:
      
      define void @foo(double %A.coerce0, i64 %A.coerce1) nounwind {
      entry:
        %A = alloca %struct.a, align 8                  ; <%struct.a*> [#uses=1]
        %0 = bitcast %struct.a* %A to %0*               ; <%0*> [#uses=2]
        %1 = getelementptr %0* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %A.coerce0, double* %1
        %2 = getelementptr %0* %0, i32 0, i32 1         ; <i64*> [#uses=1]
        store i64 %A.coerce1, i64* %2
      
      I only do this now because I never want to look at this code again :)
       
      
      llvm-svn: 109738
      98076a25
    • Chris Lattner's avatar
      implement a todo: pass a eight-byte that consists of a · c8b7b53a
      Chris Lattner authored
      small integer + padding as that small integer.  On code
      like:
      
      struct c { double x; int y; };
      void bar(struct c C) { }
      
      This means that we compile to:
      
      define void @bar(double %C.coerce0, i32 %C.coerce1) nounwind {
      entry:
        %C = alloca %struct.c, align 8                  ; <%struct.c*> [#uses=2]
        %0 = getelementptr %struct.c* %C, i32 0, i32 0  ; <double*> [#uses=1]
        store double %C.coerce0, double* %0
        %1 = getelementptr %struct.c* %C, i32 0, i32 1  ; <i32*> [#uses=1]
        store i32 %C.coerce1, i32* %1
      
      instead of:
      
      define void @bar(double %C.coerce0, i64 %C.coerce1) nounwind {
      entry:
        %C = alloca %struct.c, align 8                  ; <%struct.c*> [#uses=3]
        %0 = bitcast %struct.c* %C to %0*               ; <%0*> [#uses=2]
        %1 = getelementptr %0* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %C.coerce0, double* %1
        %2 = getelementptr %0* %0, i32 0, i32 1         ; <i64*> [#uses=1]
        store i64 %C.coerce1, i64* %2
      
      which gives SRoA heartburn.
      
      This implements rdar://5711709, a nice low number :)
      
      llvm-svn: 109737
      c8b7b53a
    • Chris Lattner's avatar
      fix a builder, why didn't clang++ catch this? · 2cdfda44
      Chris Lattner authored
      llvm-svn: 109735
      2cdfda44
    • Chris Lattner's avatar
      Kill off the 'coerce' ABI passing form. Now 'direct' and 'extend' always · fe34c1d5
      Chris Lattner authored
      have a "coerce to" type which often matches the default lowering of Clang
      type to LLVM IR type, but the coerce case can be handled by making them
      not be the same.
      
      This simplifies things and fixes issues where X86-64 abi lowering would 
      return coerce after making preferred types exactly match up.  This caused
      us to compile:
      
      typedef float v4f32 __attribute__((__vector_size__(16)));
      v4f32 foo(v4f32 X) {
        return X+X;
      }
      
      into this code at -O0:
      
      define <4 x float> @foo(<4 x float> %X.coerce) nounwind {
      entry:
        %retval = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=2]
        %coerce = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=2]
        %X.addr = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=3]
        store <4 x float> %X.coerce, <4 x float>* %coerce
        %X = load <4 x float>* %coerce                  ; <<4 x float>> [#uses=1]
        store <4 x float> %X, <4 x float>* %X.addr
        %tmp = load <4 x float>* %X.addr                ; <<4 x float>> [#uses=1]
        %tmp1 = load <4 x float>* %X.addr               ; <<4 x float>> [#uses=1]
        %add = fadd <4 x float> %tmp, %tmp1             ; <<4 x float>> [#uses=1]
        store <4 x float> %add, <4 x float>* %retval
        %0 = load <4 x float>* %retval                  ; <<4 x float>> [#uses=1]
        ret <4 x float> %0
      }
      
      Now we get:
      
      define <4 x float> @foo(<4 x float> %X) nounwind {
      entry:
        %X.addr = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=3]
        store <4 x float> %X, <4 x float>* %X.addr
        %tmp = load <4 x float>* %X.addr                ; <<4 x float>> [#uses=1]
        %tmp1 = load <4 x float>* %X.addr               ; <<4 x float>> [#uses=1]
        %add = fadd <4 x float> %tmp, %tmp1             ; <<4 x float>> [#uses=1]
        ret <4 x float> %add
      }
      
      This implements rdar://8248065
      
      llvm-svn: 109733
      fe34c1d5
    • Chris Lattner's avatar
      ignore structs that wrap vectors in IR, the abstraction shouldn't add penalty. · 9fa15c36
      Chris Lattner authored
      Before we'd compile the example into something like:
      
        %coerce.dive2 = getelementptr %struct.v4f32wrapper* %retval, i32 0, i32 0 ; <<4 x float>*> [#uses=1]
        %1 = bitcast <4 x float>* %coerce.dive2 to <2 x double>* ; <<2 x double>*> [#uses=1]
        %2 = load <2 x double>* %1, align 1             ; <<2 x double>> [#uses=1]
        ret <2 x double> %2
      
      Now we produce:
      
        %coerce.dive2 = getelementptr %struct.v4f32wrapper* %retval, i32 0, i32 0 ; <<4 x float>*> [#uses=1]
        %0 = load <4 x float>* %coerce.dive2, align 1   ; <<4 x float>> [#uses=1]
        ret <4 x float> %0
      
      llvm-svn: 109732
      9fa15c36
    • Chris Lattner's avatar
      move the 'pretty 16-byte vector' inferring code up to be shared · 4200fe4e
      Chris Lattner authored
      with return values, improving stuff that returns __m128 etc.
      
      llvm-svn: 109731
      4200fe4e
    • Chris Lattner's avatar
      simplify code by eliminating a premature optimization. · ce1bd754
      Chris Lattner authored
      llvm-svn: 109730
      ce1bd754
    • Chris Lattner's avatar
      now that we have CGT around, we can start using preferred types · 3a44c7e5
      Chris Lattner authored
      for return values too.  Instead of compiling something like:
      
      struct foo {
        int *X;
        float *Y;
      };
      
      struct foo test(struct foo *P) { return *P; }
      
      to:
      
      %1 = type { i64, i64 }
      
      define %1 @test(%struct.foo* %P) nounwind {
      entry:
        %retval = alloca %struct.foo, align 8           ; <%struct.foo*> [#uses=2]
        %P.addr = alloca %struct.foo*, align 8          ; <%struct.foo**> [#uses=2]
        store %struct.foo* %P, %struct.foo** %P.addr
        %tmp = load %struct.foo** %P.addr               ; <%struct.foo*> [#uses=1]
        %tmp1 = bitcast %struct.foo* %retval to i8*     ; <i8*> [#uses=1]
        %tmp2 = bitcast %struct.foo* %tmp to i8*        ; <i8*> [#uses=1]
        call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp1, i8* %tmp2, i64 16, i32 8, i1 false)
        %0 = bitcast %struct.foo* %retval to %1*        ; <%1*> [#uses=1]
        %1 = load %1* %0, align 1                       ; <%1> [#uses=1]
        ret %1 %1
      }
      
      We now get the result more type safe, with:
      
      define %struct.foo @test(%struct.foo* %P) nounwind {
      entry:
        %retval = alloca %struct.foo, align 8           ; <%struct.foo*> [#uses=2]
        %P.addr = alloca %struct.foo*, align 8          ; <%struct.foo**> [#uses=2]
        store %struct.foo* %P, %struct.foo** %P.addr
        %tmp = load %struct.foo** %P.addr               ; <%struct.foo*> [#uses=1]
        %tmp1 = bitcast %struct.foo* %retval to i8*     ; <i8*> [#uses=1]
        %tmp2 = bitcast %struct.foo* %tmp to i8*        ; <i8*> [#uses=1]
        call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp1, i8* %tmp2, i64 16, i32 8, i1 false)
        %0 = load %struct.foo* %retval                  ; <%struct.foo> [#uses=1]
        ret %struct.foo %0
      }
      
      That memcpy is completely terrible, but I don't know how to fix it.
      
      llvm-svn: 109729
      3a44c7e5
    • Chris Lattner's avatar
      sink preferred type stuff lower. It's possible that this might · 029c0f16
      Chris Lattner authored
      improve codegen for vaarg or something, because its codepath is
      getting preferred types now.
      
      llvm-svn: 109728
      029c0f16
    • Chris Lattner's avatar
      dissolve some more complexity: make the x86-64 abi lowering code · 22326a10
      Chris Lattner authored
      compute its own preferred types instead of having CGT compute
      them then pass them (circuituously) down into ABIInfo.
      
      llvm-svn: 109726
      22326a10
    • Chris Lattner's avatar
      simplify Get8ByteTypeAtOffset by making it a member of X86_64ABIInfo · c11301c7
      Chris Lattner authored
      llvm-svn: 109724
      c11301c7
    • Chris Lattner's avatar
      now that ABIInfo depends on CGT, it has trivial access to such · 458b2aae
      Chris Lattner authored
      things as TargetData, ASTContext, LLVMContext etc.  Stop passing
      them through so many APIs.
      
      llvm-svn: 109723
      458b2aae
    • Chris Lattner's avatar
      cave in to reality and make ABIInfo depend on CodeGenTypes. · 2b037972
      Chris Lattner authored
      This will simplify a bunch of code, coming up next.
      
      llvm-svn: 109722
      2b037972
    • Chris Lattner's avatar
      pass argument vectors in a type that corresponds to the user type if · f4ba08ae
      Chris Lattner authored
      possible.  This improves the example to pass <4 x float> instead of
      <2 x double> but we still get awful code, and still don't get the
      return value right.
      
      llvm-svn: 109700
      f4ba08ae
    • Chris Lattner's avatar
      tidy up · 4b8585ef
      Chris Lattner authored
      llvm-svn: 109699
      4b8585ef
    • Devang Patel's avatar
      Override selected builtin names (e.g. "long int" instead of "long") to match... · c7f16ab3
      Devang Patel authored
      Override selected builtin names (e.g. "long int" instead of "long") to match names used by gcc in debug info. This makes gdb testsuite happy.
      
      llvm-svn: 109694
      c7f16ab3
    • Chris Lattner's avatar
      fix some break statements to be formatted more consistently, · fa560fed
      Chris Lattner authored
      remove some now-dead code.
      
      llvm-svn: 109690
      fa560fed
    • Chris Lattner's avatar
      use Get8ByteTypeAtOffset for the return value path as well so we · 31faff5d
      Chris Lattner authored
      don't get errors similar to PR7714 on the return path.
      
      llvm-svn: 109689
      31faff5d
    • Chris Lattner's avatar
      refactor the autosizing code, eliminating duplication · b22f1c8b
      Chris Lattner authored
      and making Get8ByteTypeAtOffset always succeed and documented.
      
      llvm-svn: 109685
      b22f1c8b
    • Chris Lattner's avatar
      fix PR7714 by not referencing off the end of a struct when passed by value in · 4c1e484f
      Chris Lattner authored
      x86-64 abi.  This also improves codegen as well.  Some refactoring is needed of
      this code.
      
      llvm-svn: 109681
      4c1e484f
  2. Jul 28, 2010
  3. Jul 27, 2010
Loading