Skip to content
  1. Jul 29, 2010
    • Argyrios Kyrtzidis's avatar
      Weak references and variables that are not definitions are not required for... · 6e03a747
      Argyrios Kyrtzidis authored
      Weak references and variables that are not definitions are not required for early codegen/deserialization.
      
      llvm-svn: 109796
      6e03a747
    • 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
      Implement PCH support for offsetof(base-specifier). · d67d4cc8
      Argyrios Kyrtzidis authored
      llvm-svn: 109785
      d67d4cc8
    • 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
    • Nate Begeman's avatar
      Add codegen support for ARM qadd & qsub intrinsics · faededef
      Nate Begeman authored
      llvm-svn: 109771
      faededef
    • 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
    • Benjamin Kramer's avatar
      Prepare for upcoming ownership change. · 4b5de0d6
      Benjamin Kramer authored
      llvm-svn: 109766
      4b5de0d6
    • 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
      in release mode, irbuilder doesn't add names to instructions, · 44f9c3b3
      Chris Lattner authored
      this will hopefully fix the osuosl clang-i686-darwin10 builder.
      
      llvm-svn: 109760
      44f9c3b3
    • 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
    • Fariborz Jahanian's avatar
      Tigthen the condition for issung ivar shadowing · c15dfd8a
      Fariborz Jahanian authored
      variables to those in file scope (nonfragile-abi2).
      Fixes radar 8248681.
      
      llvm-svn: 109758
      c15dfd8a
    • Douglas Gregor's avatar
      When dynamic_cast'ing from a type to itself, fill in the cast kind · e9bf2d15
      Douglas Gregor authored
      with CK_NoOp. Fixes PR7727.
      
      llvm-svn: 109757
      e9bf2d15
    • Peter Collingbourne's avatar
      Implement RedeclarableTemplateDecl::getNextRedeclaration · 029fd693
      Peter Collingbourne authored
      This patch uses the newly added Latest field of CommonBase to provide
      a getNextRedeclaration() implementation for RedeclarableTemplateDecl.
      
      llvm-svn: 109756
      029fd693
    • Peter Collingbourne's avatar
      Store latest redeclaration for each redeclarable template declaration · 2bf3d24c
      Peter Collingbourne authored
      This patch adds a Latest field to RedeclarableTemplateDecl's CommonBase
      class which is used to store the latest redeclaration.
      
      llvm-svn: 109755
      2bf3d24c
    • Peter Collingbourne's avatar
      Refactor redeclarable template declarations · 91b25b74
      Peter Collingbourne authored
      This patch refactors much of the common code in ClassTemplateDecl and
      FunctionTemplateDecl into a common base class RedeclarableTemplateDecl
      together with support functions in a template class RedeclarableTemplate.
      
      The patch also includes similar refactoring for these classes' PCH
      reader and writer implementations.
      
      llvm-svn: 109754
      91b25b74
    • Douglas Gregor's avatar
      When taking the address of a value of Objective-C object type (e.g., · 0bdcb8a2
      Douglas Gregor authored
      one because we're referencing a variable of type NSString &), the
      resulting type is an ObjCObjectPointerType.
      
      llvm-svn: 109753
      0bdcb8a2
    • Douglas Gregor's avatar
      Allow a looser form of compatibility checking (which ignores · 17ea3f5d
      Douglas Gregor authored
      qualifiers) when checking a K&R function definition against a previous
      prototype. Fixes <rdar://problem/8193107>.
      
      llvm-svn: 109751
      17ea3f5d
    • Douglas Gregor's avatar
      When deleting a value of class type, make sure that type is complete · f65f490a
      Douglas Gregor authored
      before looking for conversions to pointer type. Fixes <rdar://problem/8248780>.
      
      llvm-svn: 109749
      f65f490a
    • Douglas Gregor's avatar
      Reword the empty struct/union warning in C to note that such structs and... · da2955ed
      Douglas Gregor authored
      Reword the empty struct/union warning in C to note that such structs and unions have size 0 in C, size 1 in C++. Put this warning under -Wc++-compat.
      
      llvm-svn: 109748
      da2955ed
    • 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
    • Jordy Rose's avatar
      Move new test (that requires RegionStore) into its own file. · 23f0f4b7
      Jordy Rose authored
      llvm-svn: 109736
      23f0f4b7
    • Chris Lattner's avatar
      fix a builder, why didn't clang++ catch this? · 2cdfda44
      Chris Lattner authored
      llvm-svn: 109735
      2cdfda44
    • Jordy Rose's avatar
      Use a LazyCompoundVal to handle initialization with a string literal, rather... · daa1c834
      Jordy Rose authored
      Use a LazyCompoundVal to handle initialization with a string literal, rather than copying each character.
      
      llvm-svn: 109734
      daa1c834
    • 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
    • Daniel Dunbar's avatar
      Transcribe clattner email to SVN. · 51738ba4
      Daniel Dunbar authored
      llvm-svn: 109727
      51738ba4
    • 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
    • Daniel Dunbar's avatar
      Change #pragma crash to segv, instead of abort. · e1128107
      Daniel Dunbar authored
      llvm-svn: 109725
      e1128107
    • 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
    • Ted Kremenek's avatar
      Teach GRExprEngine::VisitLValue() about FloatingLiteral, ImaginaryLiteral, and... · 8bedb7dd
      Ted Kremenek authored
      Teach GRExprEngine::VisitLValue() about FloatingLiteral, ImaginaryLiteral, and CharacterLiteral.  Fixes an assertion failure reported in PR 7675.
      
      llvm-svn: 109719
      8bedb7dd
Loading