[cfe-commits] r138599 - in /cfe/trunk: lib/CodeGen/CGCall.cpp lib/CodeGen/CGClass.cpp lib/CodeGen/CGDecl.cpp lib/CodeGen/CGDeclCXX.cpp lib/CodeGen/CGExpr.cpp lib/CodeGen/CGExprAgg.cpp lib/CodeGen/CGObjC.cpp lib/CodeGen/CGStmt.cpp lib/CodeGen/CGVa

Nico Weber thakis at chromium.org
Thu Aug 25 23:53:32 PDT 2011


Hi John,

it looks like this caused http://llvm.org/bugs/show_bug.cgi?id=10756

Nico

On Thu, Aug 25, 2011 at 11:04 PM, John McCall <rjmccall at apple.com> wrote:
> Author: rjmccall
> Date: Thu Aug 25 18:04:34 2011
> New Revision: 138599
>
> URL: http://llvm.org/viewvc/llvm-project?rev=138599&view=rev
> Log:
> Track whether an AggValueSlot is potentially aliased, and do not
> emit call results into potentially aliased slots.  This allows us
> to properly mark indirect return slots as noalias, at the cost
> of requiring an extra memcpy when assigning an aggregate call
> result into a l-value.  It also brings us into compliance with
> the x86-64 ABI.
>
>
> Modified:
>    cfe/trunk/lib/CodeGen/CGCall.cpp
>    cfe/trunk/lib/CodeGen/CGClass.cpp
>    cfe/trunk/lib/CodeGen/CGDecl.cpp
>    cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
>    cfe/trunk/lib/CodeGen/CGExpr.cpp
>    cfe/trunk/lib/CodeGen/CGExprAgg.cpp
>    cfe/trunk/lib/CodeGen/CGObjC.cpp
>    cfe/trunk/lib/CodeGen/CGStmt.cpp
>    cfe/trunk/lib/CodeGen/CGValue.h
>    cfe/trunk/lib/CodeGen/CodeGenFunction.h
>    cfe/trunk/test/CodeGen/arm-arguments.c
>    cfe/trunk/test/CodeGen/arm-vector-arguments.c
>    cfe/trunk/test/CodeGen/blocks.c
>    cfe/trunk/test/CodeGen/x86_32-arguments-darwin.c
>    cfe/trunk/test/CodeGen/x86_64-arguments.c
>    cfe/trunk/test/CodeGenCXX/temporaries.cpp
>    cfe/trunk/test/CodeGenCXX/x86_32-arguments.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGCall.cpp Thu Aug 25 18:04:34 2011
> @@ -907,6 +907,7 @@
>   // Name the struct return argument.
>   if (CGM.ReturnTypeUsesSRet(FI)) {
>     AI->setName("agg.result");
> +    AI->addAttr(llvm::Attribute::NoAlias);
>     ++AI;
>   }
>
>
> Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGClass.cpp Thu Aug 25 18:04:34 2011
> @@ -401,7 +401,8 @@
>   AggValueSlot AggSlot =
>     AggValueSlot::forAddr(V, Qualifiers(),
>                           AggValueSlot::IsDestructed,
> -                          AggValueSlot::DoesNotNeedGCBarriers);
> +                          AggValueSlot::DoesNotNeedGCBarriers,
> +                          AggValueSlot::IsNotAliased);
>
>   CGF.EmitAggExpr(BaseInit->getInit(), AggSlot);
>
> @@ -441,7 +442,8 @@
>       AggValueSlot Slot =
>         AggValueSlot::forAddr(Dest, LHS.getQuals(),
>                               AggValueSlot::IsDestructed,
> -                              AggValueSlot::DoesNotNeedGCBarriers);
> +                              AggValueSlot::DoesNotNeedGCBarriers,
> +                              AggValueSlot::IsNotAliased);
>
>       CGF.EmitAggExpr(MemberInit->getInit(), Slot);
>     }
> @@ -1330,7 +1332,8 @@
>   AggValueSlot AggSlot =
>     AggValueSlot::forAddr(ThisPtr, Qualifiers(),
>                           AggValueSlot::IsDestructed,
> -                          AggValueSlot::DoesNotNeedGCBarriers);
> +                          AggValueSlot::DoesNotNeedGCBarriers,
> +                          AggValueSlot::IsNotAliased);
>
>   EmitAggExpr(Ctor->init_begin()[0]->getInit(), AggSlot);
>
>
> Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Thu Aug 25 18:04:34 2011
> @@ -1046,7 +1046,8 @@
>     // TODO: how can we delay here if D is captured by its initializer?
>     EmitAggExpr(init, AggValueSlot::forLValue(lvalue,
>                                               AggValueSlot::IsDestructed,
> -                                         AggValueSlot::DoesNotNeedGCBarriers));
> +                                         AggValueSlot::DoesNotNeedGCBarriers,
> +                                              AggValueSlot::IsNotAliased));
>   }
>  }
>
>
> Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Thu Aug 25 18:04:34 2011
> @@ -47,7 +47,8 @@
>     CGF.EmitComplexExprIntoAddr(Init, DeclPtr, lv.isVolatile());
>   } else {
>     CGF.EmitAggExpr(Init, AggValueSlot::forLValue(lv,AggValueSlot::IsDestructed,
> -                                          AggValueSlot::DoesNotNeedGCBarriers));
> +                                          AggValueSlot::DoesNotNeedGCBarriers,
> +                                                  AggValueSlot::IsNotAliased));
>   }
>  }
>
>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu Aug 25 18:04:34 2011
> @@ -360,7 +360,8 @@
>         = AggValueSlot::IsDestructed_t(InitializedDecl != 0);
>       AggSlot = AggValueSlot::forAddr(ReferenceTemporary, Qualifiers(),
>                                       isDestructed,
> -                                      AggValueSlot::DoesNotNeedGCBarriers);
> +                                      AggValueSlot::DoesNotNeedGCBarriers,
> +                                      AggValueSlot::IsNotAliased);
>     }
>
>     if (InitializedDecl) {
>
> Modified: cfe/trunk/lib/CodeGen/CGExprAgg.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprAgg.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExprAgg.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExprAgg.cpp Thu Aug 25 18:04:34 2011
> @@ -35,11 +35,18 @@
>   AggValueSlot Dest;
>   bool IgnoreResult;
>
> +  /// We want to use 'dest' as the return slot except under two
> +  /// conditions:
> +  ///   - The destination slot requires garbage collection, so we
> +  ///     need to use the GC API.
> +  ///   - The destination slot is potentially aliased.
> +  bool shouldUseDestForReturnSlot() const {
> +    return !(Dest.requiresGCollection() || Dest.isPotentiallyAliased());
> +  }
> +
>   ReturnValueSlot getReturnValueSlot() const {
> -    // If the destination slot requires garbage collection, we can't
> -    // use the real return value slot, because we have to use the GC
> -    // API.
> -    if (Dest.requiresGCollection()) return ReturnValueSlot();
> +    if (!shouldUseDestForReturnSlot())
> +      return ReturnValueSlot();
>
>     return ReturnValueSlot(Dest.getAddr(), Dest.isVolatile());
>   }
> @@ -69,7 +76,7 @@
>   void EmitFinalDestCopy(const Expr *E, LValue Src, bool Ignore = false);
>   void EmitFinalDestCopy(const Expr *E, RValue Src, bool Ignore = false);
>
> -  void EmitGCMove(const Expr *E, RValue Src);
> +  void EmitMoveFromReturnSlot(const Expr *E, RValue Src);
>
>   AggValueSlot::NeedsGCBarriers_t needsGC(QualType T) {
>     if (CGF.getLangOptions().getGCMode() && TypeRequiresGCollection(T))
> @@ -179,23 +186,27 @@
>   return Record->hasObjectMember();
>  }
>
> -/// \brief Perform the final move to DestPtr if RequiresGCollection is set.
> +/// \brief Perform the final move to DestPtr if for some reason
> +/// getReturnValueSlot() didn't use it directly.
>  ///
>  /// The idea is that you do something like this:
>  ///   RValue Result = EmitSomething(..., getReturnValueSlot());
> -///   EmitGCMove(E, Result);
> -/// If GC doesn't interfere, this will cause the result to be emitted
> -/// directly into the return value slot.  If GC does interfere, a final
> -/// move will be performed.
> -void AggExprEmitter::EmitGCMove(const Expr *E, RValue Src) {
> -  if (Dest.requiresGCollection()) {
> -    CharUnits size = CGF.getContext().getTypeSizeInChars(E->getType());
> -    llvm::Type *SizeTy = CGF.ConvertType(CGF.getContext().getSizeType());
> -    llvm::Value *SizeVal = llvm::ConstantInt::get(SizeTy, size.getQuantity());
> -    CGF.CGM.getObjCRuntime().EmitGCMemmoveCollectable(CGF, Dest.getAddr(),
> -                                                    Src.getAggregateAddr(),
> -                                                    SizeVal);
> +///   EmitMoveFromReturnSlot(E, Result);
> +///
> +/// If nothing interferes, this will cause the result to be emitted
> +/// directly into the return value slot.  Otherwise, a final move
> +/// will be performed.
> +void AggExprEmitter::EmitMoveFromReturnSlot(const Expr *E, RValue Src) {
> +  if (shouldUseDestForReturnSlot()) {
> +    // Logically, Dest.getAddr() should equal Src.getAggregateAddr().
> +    // The possibility of undef rvalues complicates that a lot,
> +    // though, so we can't really assert.
> +    return;
>   }
> +
> +  // Otherwise, do a final copy,
> +  assert(Dest.getAddr() != Src.getAggregateAddr());
> +  EmitFinalDestCopy(E, Src, /*Ignore*/ true);
>  }
>
>  /// EmitFinalDestCopy - Perform the final copy to DestPtr, if desired.
> @@ -316,7 +327,7 @@
>     LValue LV = CGF.EmitLValue(E->getSubExpr());
>     assert(LV.isPropertyRef());
>     RValue RV = CGF.EmitLoadOfPropertyRefLValue(LV, getReturnValueSlot());
> -    EmitGCMove(E, RV);
> +    EmitMoveFromReturnSlot(E, RV);
>     break;
>   }
>
> @@ -381,12 +392,12 @@
>   }
>
>   RValue RV = CGF.EmitCallExpr(E, getReturnValueSlot());
> -  EmitGCMove(E, RV);
> +  EmitMoveFromReturnSlot(E, RV);
>  }
>
>  void AggExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
>   RValue RV = CGF.EmitObjCMessageExpr(E, getReturnValueSlot());
> -  EmitGCMove(E, RV);
> +  EmitMoveFromReturnSlot(E, RV);
>  }
>
>  void AggExprEmitter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
> @@ -600,6 +611,7 @@
>     CGF.EmitAggExpr(E, AggValueSlot::forLValue(LV,
>                                                AggValueSlot::IsDestructed,
>                                       AggValueSlot::DoesNotNeedGCBarriers,
> +                                               AggValueSlot::IsNotAliased,
>                                                Dest.isZeroed()));
>   } else if (LV.isSimple()) {
>     CGF.EmitScalarInit(E, /*D=*/0, LV, /*Captured=*/false);
>
> Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjC.cpp Thu Aug 25 18:04:34 2011
> @@ -820,7 +820,8 @@
>                                     LoadObjCSelf(), Ivar, 0);
>       EmitAggExpr(IvarInit->getInit(),
>                   AggValueSlot::forLValue(LV, AggValueSlot::IsDestructed,
> -                                          AggValueSlot::DoesNotNeedGCBarriers));
> +                                          AggValueSlot::DoesNotNeedGCBarriers,
> +                                          AggValueSlot::IsNotAliased));
>     }
>     // constructor returns 'self'.
>     CodeGenTypes &Types = CGM.getTypes();
>
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Thu Aug 25 18:04:34 2011
> @@ -786,7 +786,8 @@
>   } else {
>     EmitAggExpr(RV, AggValueSlot::forAddr(ReturnValue, Qualifiers(),
>                                           AggValueSlot::IsDestructed,
> -                                          AggValueSlot::DoesNotNeedGCBarriers));
> +                                          AggValueSlot::DoesNotNeedGCBarriers,
> +                                          AggValueSlot::IsNotAliased));
>   }
>
>   EmitBranchThroughCleanup(ReturnBlock);
>
> Modified: cfe/trunk/lib/CodeGen/CGValue.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGValue.h?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGValue.h (original)
> +++ cfe/trunk/lib/CodeGen/CGValue.h Thu Aug 25 18:04:34 2011
> @@ -347,9 +347,14 @@
>   /// be set.
>   bool ZeroedFlag : 1;
>
> +  /// AliasedFlag - This generally defaults to false, but can be true
> +  /// if the memory is known not to be aliased.
> +  bool AliasedFlag : 1;
> +
>  public:
> -  enum IsZeroed_t { IsNotZeroed, IsZeroed };
> +  enum IsAliased_t { IsNotAliased, IsAliased };
>   enum IsDestructed_t { IsNotDestructed, IsDestructed };
> +  enum IsZeroed_t { IsNotZeroed, IsZeroed };
>   enum NeedsGCBarriers_t { DoesNotNeedGCBarriers, NeedsGCBarriers };
>
>   /// ignored - Returns an aggregate value slot indicating that the
> @@ -358,7 +363,10 @@
>     AggValueSlot AV;
>     AV.Addr = 0;
>     AV.Quals = Qualifiers();
> -    AV.LifetimeFlag = AV.RequiresGCollection = AV.ZeroedFlag = 0;
> +    AV.LifetimeFlag = AV.RequiresGCollection = AV.ZeroedFlag = false;
> +
> +    // If there's ever an address here, it will be a temporary.
> +    AV.AliasedFlag = false;
>     return AV;
>   }
>
> @@ -375,6 +383,7 @@
>   static AggValueSlot forAddr(llvm::Value *addr, Qualifiers quals,
>                               IsDestructed_t isDestructed,
>                               NeedsGCBarriers_t needsGC,
> +                              IsAliased_t isAliased = IsAliased,
>                               IsZeroed_t isZeroed = IsNotZeroed) {
>     AggValueSlot AV;
>     AV.Addr = addr;
> @@ -382,14 +391,16 @@
>     AV.LifetimeFlag = isDestructed;
>     AV.RequiresGCollection = needsGC;
>     AV.ZeroedFlag = isZeroed;
> +    AV.AliasedFlag = isAliased;
>     return AV;
>   }
>
>   static AggValueSlot forLValue(LValue LV, IsDestructed_t isDestructed,
>                                 NeedsGCBarriers_t needsGC,
> +                                IsAliased_t isAliased = IsAliased,
>                                 IsZeroed_t isZeroed = IsNotZeroed) {
>     return forAddr(LV.getAddress(), LV.getQuals(),
> -                   isDestructed, needsGC, isZeroed);
> +                   isDestructed, needsGC, isAliased, isZeroed);
>   }
>
>   IsDestructed_t isLifetimeExternallyManaged() const {
> @@ -421,6 +432,10 @@
>     return Addr == 0;
>   }
>
> +  IsAliased_t isPotentiallyAliased() const {
> +    return IsAliased_t(AliasedFlag);
> +  }
> +
>   RValue asRValue() const {
>     return RValue::getAggregate(getAddr(), isVolatile());
>   }
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Thu Aug 25 18:04:34 2011
> @@ -1466,7 +1466,8 @@
>   AggValueSlot CreateAggTemp(QualType T, const Twine &Name = "tmp") {
>     return AggValueSlot::forAddr(CreateMemTemp(T, Name), T.getQualifiers(),
>                                  AggValueSlot::IsNotDestructed,
> -                                 AggValueSlot::DoesNotNeedGCBarriers);
> +                                 AggValueSlot::DoesNotNeedGCBarriers,
> +                                 AggValueSlot::IsNotAliased);
>   }
>
>   /// Emit a cast to void* in the appropriate address space.
>
> Modified: cfe/trunk/test/CodeGen/arm-arguments.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-arguments.c?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGen/arm-arguments.c (original)
> +++ cfe/trunk/test/CodeGen/arm-arguments.c Thu Aug 25 18:04:34 2011
> @@ -28,13 +28,13 @@
>  struct s4 f4(void) {}
>
>  // APCS-GNU: define void @f5(
> -// APCS-GNU: struct.s5* sret
> +// APCS-GNU: struct.s5* noalias sret
>  // AAPCS: define arm_aapcscc i32 @f5()
>  struct s5 { struct { } f0; int f1; };
>  struct s5 f5(void) {}
>
>  // APCS-GNU: define void @f6(
> -// APCS-GNU: struct.s6* sret
> +// APCS-GNU: struct.s6* noalias sret
>  // AAPCS: define arm_aapcscc i32 @f6()
>  struct s6 { int f0[1]; };
>  struct s6 f6(void) {}
> @@ -45,7 +45,7 @@
>  struct s7 f7(void) {}
>
>  // APCS-GNU: define void @f8(
> -// APCS-GNU: struct.s8* sret
> +// APCS-GNU: struct.s8* noalias sret
>  // AAPCS: define arm_aapcscc void @f8()
>  struct s8 { struct { int : 0; } f0[1]; };
>  struct s8 f8(void) {}
> @@ -61,7 +61,7 @@
>  struct s10 f10(void) {}
>
>  // APCS-GNU: define void @f11(
> -// APCS-GNU: struct.s11* sret
> +// APCS-GNU: struct.s11* noalias sret
>  // AAPCS: define arm_aapcscc i32 @f11()
>  struct s11 { int : 0; int f0; };
>  struct s11 f11(void) {}
> @@ -72,7 +72,7 @@
>  union u12 f12(void) {}
>
>  // APCS-GNU: define void @f13(
> -// APCS-GNU: struct.s13* sret
> +// APCS-GNU: struct.s13* noalias sret
>
>  // FIXME: This should return a float.
>  // AAPCS-FIXME: darm_aapcscc efine float @f13()
> @@ -80,7 +80,7 @@
>  struct s13 f13(void) {}
>
>  // APCS-GNU: define void @f14(
> -// APCS-GNU: union.u14* sret
> +// APCS-GNU: union.u14* noalias sret
>  // AAPCS: define arm_aapcscc i32 @f14()
>  union u14 { float f0; };
>  union u14 f14(void) {}
> @@ -104,13 +104,13 @@
>  struct s18 f18(void) {}
>
>  // APCS-GNU: define void @f19(
> -// APCS-GNU: struct.s19* sret
> +// APCS-GNU: struct.s19* noalias sret
>  // AAPCS: define arm_aapcscc i32 @f19()
>  struct s19 { int f0; struct s8 f1; };
>  struct s19 f19(void) {}
>
>  // APCS-GNU: define void @f20(
> -// APCS-GNU: struct.s20* sret
> +// APCS-GNU: struct.s20* noalias sret
>  // AAPCS: define arm_aapcscc i32 @f20()
>  struct s20 { struct s8 f1; int f0; };
>  struct s20 f20(void) {}
> @@ -128,10 +128,10 @@
>  // APCS-GNU: define i128 @f27()
>  // AAPCS: define arm_aapcscc i16 @f22()
>  // AAPCS: define arm_aapcscc i32 @f23()
> -// AAPCS: define arm_aapcscc void @f24({{.*}} sret
> -// AAPCS: define arm_aapcscc void @f25({{.*}} sret
> -// AAPCS: define arm_aapcscc void @f26({{.*}} sret
> -// AAPCS: define arm_aapcscc void @f27({{.*}} sret
> +// AAPCS: define arm_aapcscc void @f24({{.*}} noalias sret
> +// AAPCS: define arm_aapcscc void @f25({{.*}} noalias sret
> +// AAPCS: define arm_aapcscc void @f26({{.*}} noalias sret
> +// AAPCS: define arm_aapcscc void @f27({{.*}} noalias sret
>  _Complex char       f22(void) {}
>  _Complex short      f23(void) {}
>  _Complex int        f24(void) {}
> @@ -149,7 +149,7 @@
>  struct s29 { _Complex short f0; };
>  struct s29 f29() {}
>
> -// APCS-GNU: define void @f30({{.*}} sret
> -// AAPCS: define arm_aapcscc void @f30({{.*}} sret
> +// APCS-GNU: define void @f30({{.*}} noalias sret
> +// AAPCS: define arm_aapcscc void @f30({{.*}} noalias sret
>  struct s30 { _Complex int f0; };
>  struct s30 f30() {}
>
> Modified: cfe/trunk/test/CodeGen/arm-vector-arguments.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-vector-arguments.c?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGen/arm-vector-arguments.c (original)
> +++ cfe/trunk/test/CodeGen/arm-vector-arguments.c Thu Aug 25 18:04:34 2011
> @@ -8,7 +8,7 @@
>
>  #include <arm_neon.h>
>
> -// CHECK: define void @f0(%struct.int8x16x2_t* sret %agg.result, <16 x i8> %{{.*}}, <16 x i8> %{{.*}})
> +// CHECK: define void @f0(%struct.int8x16x2_t* noalias sret %agg.result, <16 x i8> %{{.*}}, <16 x i8> %{{.*}})
>  int8x16x2_t f0(int8x16_t a0, int8x16_t a1) {
>   return vzipq_s8(a0, a1);
>  }
> @@ -24,7 +24,7 @@
>  T_float32x2 f1_0(T_float32x2 a0) { return a0; }
>  // CHECK: define <4 x float> @f1_1(<4 x float> %{{.*}})
>  T_float32x4 f1_1(T_float32x4 a0) { return a0; }
> -// CHECK: define void @f1_2(<8 x float>* sret %{{.*}}, <8 x float> %{{.*}})
> +// CHECK: define void @f1_2(<8 x float>* noalias sret %{{.*}}, <8 x float> %{{.*}})
>  T_float32x8 f1_2(T_float32x8 a0) { return a0; }
> -// CHECK: define void @f1_3(<16 x float>* sret %{{.*}}, <16 x float> %{{.*}})
> +// CHECK: define void @f1_3(<16 x float>* noalias sret %{{.*}}, <16 x float> %{{.*}})
>  T_float32x16 f1_3(T_float32x16 a0) { return a0; }
>
> Modified: cfe/trunk/test/CodeGen/blocks.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/blocks.c?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGen/blocks.c (original)
> +++ cfe/trunk/test/CodeGen/blocks.c Thu Aug 25 18:04:34 2011
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o %t -fblocks
> +// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - -fblocks | FileCheck %s
>  void (^f)(void) = ^{};
>
>  // rdar://6768379
> @@ -12,7 +12,7 @@
>   int a[64];
>  };
>
> -// RUN: grep 'internal void @__f2_block_invoke_0(.struct.s0\* sret .*, .*, .* byval .*)' %t
> +// CHECK: define internal void @__f2_block_invoke_0(%struct.s0* noalias sret {{%.*}}, i8* {{%.*}}, %struct.s0* byval align 4 {{.*}})
>  struct s0 f2(struct s0 a0) {
>   return ^(struct s0 a1){ return a1; }(a0);
>  }
>
> Modified: cfe/trunk/test/CodeGen/x86_32-arguments-darwin.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_32-arguments-darwin.c?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGen/x86_32-arguments-darwin.c (original)
> +++ cfe/trunk/test/CodeGen/x86_32-arguments-darwin.c Thu Aug 25 18:04:34 2011
> @@ -71,7 +71,7 @@
>  // Small vectors and 1 x {i64,double} are returned in registers
>
>  // CHECK: i32 @f11()
> -// CHECK: void @f12(<2 x i32>* sret %agg.result)
> +// CHECK: void @f12(<2 x i32>* noalias sret %agg.result)
>  // CHECK: i64 @f13()
>  // CHECK: i64 @f14()
>  // CHECK: <2 x i64> @f15()
> @@ -93,11 +93,11 @@
>  // 128-bits).
>
>  // CHECK: i32 @f17()
> -// CHECK: void @f18(%{{.*}}* sret %agg.result)
> -// CHECK: void @f19(%{{.*}}* sret %agg.result)
> -// CHECK: void @f20(%{{.*}}* sret %agg.result)
> -// CHECK: void @f21(%{{.*}}* sret %agg.result)
> -// CHECK: void @f22(%{{.*}}* sret %agg.result)
> +// CHECK: void @f18(%{{.*}}* noalias sret %agg.result)
> +// CHECK: void @f19(%{{.*}}* noalias sret %agg.result)
> +// CHECK: void @f20(%{{.*}}* noalias sret %agg.result)
> +// CHECK: void @f21(%{{.*}}* noalias sret %agg.result)
> +// CHECK: void @f22(%{{.*}}* noalias sret %agg.result)
>  struct { T11 a; } f17(void) { while (1) {} }
>  struct { T12 a; } f18(void) { while (1) {} }
>  struct { T13 a; } f19(void) { while (1) {} }
> @@ -116,11 +116,11 @@
>
>  // Small structures are handled recursively
>  // CHECK: i32 @f26()
> -// CHECK: void @f27(%struct.s27* sret %agg.result)
> +// CHECK: void @f27(%struct.s27* noalias sret %agg.result)
>  struct s26 { struct { char a, b; } a; struct { char a, b; } b; } f26(void) { while (1) {} }
>  struct s27 { struct { char a, b, c; } a; struct { char a; } b; } f27(void) { while (1) {} }
>
> -// CHECK: void @f28(%struct.s28* sret %agg.result)
> +// CHECK: void @f28(%struct.s28* noalias sret %agg.result)
>  struct s28 { int a; int b[]; } f28(void) { while (1) {} }
>
>  // CHECK: define i16 @f29()
> @@ -150,7 +150,7 @@
>  // CHECK: define float @f37()
>  struct s37 { float c[1][1]; } f37(void) { while (1) {} }
>
> -// CHECK: define void @f38(%struct.s38* sret %agg.result)
> +// CHECK: define void @f38(%struct.s38* noalias sret %agg.result)
>  struct s38 { char a[3]; short b; } f38(void) { while (1) {} }
>
>  // CHECK: define void @f39(%struct.s39* byval align 16 %x)
>
> Modified: cfe/trunk/test/CodeGen/x86_64-arguments.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_64-arguments.c?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGen/x86_64-arguments.c (original)
> +++ cfe/trunk/test/CodeGen/x86_64-arguments.c Thu Aug 25 18:04:34 2011
> @@ -42,7 +42,7 @@
>
>  // Test merging/passing of upper eightbyte with X87 class.
>  //
> -// CHECK: define void @f8_1(%union.u8* sret %agg.result)
> +// CHECK: define void @f8_1(%union.u8* noalias sret %agg.result)
>  // CHECK: define void @f8_2(%union.u8* byval align 16 %a0)
>  union u8 {
>   long double a;
> @@ -58,7 +58,7 @@
>  struct s10 { int a; int b; int : 0; };
>  void f10(struct s10 a0) {}
>
> -// CHECK: define void @f11(%union.anon* sret %agg.result)
> +// CHECK: define void @f11(%union.anon* noalias sret %agg.result)
>  union { long double a; float b; } f11() { while (1) {} }
>
>  // CHECK: define i32 @f12_0()
> @@ -69,7 +69,7 @@
>
>  // Check that sret parameter is accounted for when checking available integer
>  // registers.
> -// CHECK: define void @f13(%struct.s13_0* sret %agg.result, i32 %a, i32 %b, i32 %c, i32 %d, {{.*}}* byval align 8 %e, i32 %f)
> +// CHECK: define void @f13(%struct.s13_0* noalias sret %agg.result, i32 %a, i32 %b, i32 %c, i32 %d, {{.*}}* byval align 8 %e, i32 %f)
>
>  struct s13_0 { long long f0[3]; };
>  struct s13_1 { long long f0[2]; };
>
> Modified: cfe/trunk/test/CodeGenCXX/temporaries.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/temporaries.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/temporaries.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/temporaries.cpp Thu Aug 25 18:04:34 2011
> @@ -395,7 +395,7 @@
>     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]])
>   }
>
> -  // CHECK: define void @_ZN7Elision5test2Ev([[A]]* sret
> +  // CHECK: define void @_ZN7Elision5test2Ev([[A]]* noalias sret
>   A test2() {
>     // CHECK:      call void @_ZN7Elision3fooEv()
>     // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
> @@ -403,7 +403,7 @@
>     return (foo(), A());
>   }
>
> -  // CHECK: define void @_ZN7Elision5test3EiNS_1AE([[A]]* sret
> +  // CHECK: define void @_ZN7Elision5test3EiNS_1AE([[A]]* noalias sret
>   A test3(int v, A x) {
>     if (v < 5)
>     // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
> @@ -444,7 +444,7 @@
>   }
>
>   // rdar://problem/8433352
> -  // CHECK: define void @_ZN7Elision5test5Ev([[A]]* sret
> +  // CHECK: define void @_ZN7Elision5test5Ev([[A]]* noalias sret
>   struct B { A a; B(); };
>   A test5() {
>     // CHECK:      [[AT0:%.*]] = alloca [[A]], align 8
>
> Modified: cfe/trunk/test/CodeGenCXX/x86_32-arguments.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/x86_32-arguments.cpp?rev=138599&r1=138598&r2=138599&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/x86_32-arguments.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/x86_32-arguments.cpp Thu Aug 25 18:04:34 2011
> @@ -6,7 +6,7 @@
>   short s;
>  };
>
> -// CHECK: define void @_Z1fv(%struct.S* sret %
> +// CHECK: define void @_Z1fv(%struct.S* noalias sret %
>  S f() { return S(); }
>  // CHECK: define void @_Z1f1S(%struct.S*)
>  void f(S) { }
> @@ -18,7 +18,7 @@
>   double c;
>  };
>
> -// CHECK: define void @_Z1gv(%class.C* sret %
> +// CHECK: define void @_Z1gv(%class.C* noalias sret %
>  C g() { return C(); }
>
>  // CHECK: define void @_Z1f1C(%class.C*)
> @@ -103,13 +103,13 @@
>  struct s7 : s7_0, s7_1 { };
>  s7 f7() { return s7(); }
>
> -// CHECK: define void @_Z2f8v(%struct.s8* sret %agg.result)
> +// CHECK: define void @_Z2f8v(%struct.s8* noalias sret %agg.result)
>  struct s8_0 { };
>  struct s8_1 { double x; };
>  struct s8 { s8_0 a; s8_1 b; };
>  s8 f8() { return s8(); }
>
> -// CHECK: define void @_Z2f9v(%struct.s9* sret %agg.result)
> +// CHECK: define void @_Z2f9v(%struct.s9* noalias sret %agg.result)
>  struct s9_0 { unsigned : 0; };
>  struct s9_1 { double x; };
>  struct s9 { s9_0 a; s9_1 b; };
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list