diff options
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
| -rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 204 | 
1 files changed, 127 insertions, 77 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index a73e667e780e..3a9fbeed9d69 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -78,7 +78,7 @@ public:      return I;    } -  const llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); } +  llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); }    LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); }    LValue EmitCheckedLValue(const Expr *E) { return CGF.EmitCheckedLValue(E); } @@ -153,8 +153,7 @@ public:    Value *VisitStmt(Stmt *S) {      S->dump(CGF.getContext().getSourceManager()); -    assert(0 && "Stmt can't have complex result type!"); -    return 0; +    llvm_unreachable("Stmt can't have complex result type!");    }    Value *VisitExpr(Expr *S); @@ -343,6 +342,10 @@ public:    }    // C++ +  Value *VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E) { +    return EmitLoadOfLValue(E); +  } +        Value *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {      return Visit(DAE->getExpr());    } @@ -510,6 +513,7 @@ public:      return CGF.EmitObjCStringLiteral(E);    }    Value *VisitAsTypeExpr(AsTypeExpr *CE); +  Value *VisitAtomicExpr(AtomicExpr *AE);  };  }  // end anonymous namespace. @@ -548,14 +552,24 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,    if (DstType->isVoidType()) return 0; +  llvm::Type *SrcTy = Src->getType(); + +  // Floating casts might be a bit special: if we're doing casts to / from half +  // FP, we should go via special intrinsics. +  if (SrcType->isHalfType()) { +    Src = Builder.CreateCall(CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_from_fp16), Src); +    SrcType = CGF.getContext().FloatTy; +    SrcTy = llvm::Type::getFloatTy(VMContext); +  } +    // Handle conversions to bool first, they are special: comparisons against 0.    if (DstType->isBooleanType())      return EmitConversionToBool(Src, SrcType); -  const llvm::Type *DstTy = ConvertType(DstType); +  llvm::Type *DstTy = ConvertType(DstType);    // Ignore conversions like int -> uint. -  if (Src->getType() == DstTy) +  if (SrcTy == DstTy)      return Src;    // Handle pointer conversions next: pointers can only be converted to/from @@ -563,13 +577,13 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,    // some native types (like Obj-C id) may map to a pointer type.    if (isa<llvm::PointerType>(DstTy)) {      // The source value may be an integer, or a pointer. -    if (isa<llvm::PointerType>(Src->getType())) +    if (isa<llvm::PointerType>(SrcTy))        return Builder.CreateBitCast(Src, DstTy, "conv");      assert(SrcType->isIntegerType() && "Not ptr->ptr or int->ptr conversion?");      // First, convert to the correct width so that we control the kind of      // extension. -    const llvm::Type *MiddleTy = CGF.IntPtrTy; +    llvm::Type *MiddleTy = CGF.IntPtrTy;      bool InputSigned = SrcType->isSignedIntegerOrEnumerationType();      llvm::Value* IntResult =          Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv"); @@ -577,7 +591,7 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,      return Builder.CreateIntToPtr(IntResult, DstTy, "conv");    } -  if (isa<llvm::PointerType>(Src->getType())) { +  if (isa<llvm::PointerType>(SrcTy)) {      // Must be an ptr to int cast.      assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?");      return Builder.CreatePtrToInt(Src, DstTy, "conv"); @@ -592,10 +606,10 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,      // Insert the element in element zero of an undef vector      llvm::Value *UnV = llvm::UndefValue::get(DstTy);      llvm::Value *Idx = Builder.getInt32(0); -    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp"); +    UnV = Builder.CreateInsertElement(UnV, Elt, Idx);      // Splat the element across to all elements -    llvm::SmallVector<llvm::Constant*, 16> Args; +    SmallVector<llvm::Constant*, 16> Args;      unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();      for (unsigned i = 0; i != NumElements; ++i)        Args.push_back(Builder.getInt32(0)); @@ -606,34 +620,47 @@ Value *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,    }    // Allow bitcast from vector to integer/fp of the same size. -  if (isa<llvm::VectorType>(Src->getType()) || +  if (isa<llvm::VectorType>(SrcTy) ||        isa<llvm::VectorType>(DstTy))      return Builder.CreateBitCast(Src, DstTy, "conv");    // Finally, we have the arithmetic types: real int/float. -  if (isa<llvm::IntegerType>(Src->getType())) { +  Value *Res = NULL; +  llvm::Type *ResTy = DstTy; + +  // Cast to half via float +  if (DstType->isHalfType()) +    DstTy = llvm::Type::getFloatTy(VMContext); + +  if (isa<llvm::IntegerType>(SrcTy)) {      bool InputSigned = SrcType->isSignedIntegerOrEnumerationType();      if (isa<llvm::IntegerType>(DstTy)) -      return Builder.CreateIntCast(Src, DstTy, InputSigned, "conv"); +      Res = Builder.CreateIntCast(Src, DstTy, InputSigned, "conv");      else if (InputSigned) -      return Builder.CreateSIToFP(Src, DstTy, "conv"); +      Res = Builder.CreateSIToFP(Src, DstTy, "conv");      else -      return Builder.CreateUIToFP(Src, DstTy, "conv"); -  } - -  assert(Src->getType()->isFloatingPointTy() && "Unknown real conversion"); -  if (isa<llvm::IntegerType>(DstTy)) { +      Res = Builder.CreateUIToFP(Src, DstTy, "conv"); +  } else if (isa<llvm::IntegerType>(DstTy)) { +    assert(SrcTy->isFloatingPointTy() && "Unknown real conversion");      if (DstType->isSignedIntegerOrEnumerationType()) -      return Builder.CreateFPToSI(Src, DstTy, "conv"); +      Res = Builder.CreateFPToSI(Src, DstTy, "conv");      else -      return Builder.CreateFPToUI(Src, DstTy, "conv"); +      Res = Builder.CreateFPToUI(Src, DstTy, "conv"); +  } else { +    assert(SrcTy->isFloatingPointTy() && DstTy->isFloatingPointTy() && +           "Unknown real conversion"); +    if (DstTy->getTypeID() < SrcTy->getTypeID()) +      Res = Builder.CreateFPTrunc(Src, DstTy, "conv"); +    else +      Res = Builder.CreateFPExt(Src, DstTy, "conv");    } -  assert(DstTy->isFloatingPointTy() && "Unknown real conversion"); -  if (DstTy->getTypeID() < Src->getType()->getTypeID()) -    return Builder.CreateFPTrunc(Src, DstTy, "conv"); -  else -    return Builder.CreateFPExt(Src, DstTy, "conv"); +  if (DstTy != ResTy) { +    assert(ResTy->isIntegerTy(16) && "Only half FP requires extra conversion"); +    Res = Builder.CreateCall(CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_to_fp16), Res); +  } + +  return Res;  }  /// EmitComplexToScalarConversion - Emit a conversion from the specified complex @@ -686,14 +713,14 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {      Value *RHS = CGF.EmitScalarExpr(E->getExpr(1));      Value *Mask; -    const llvm::VectorType *LTy = cast<llvm::VectorType>(LHS->getType()); +    llvm::VectorType *LTy = cast<llvm::VectorType>(LHS->getType());      unsigned LHSElts = LTy->getNumElements();      if (E->getNumSubExprs() == 3) {        Mask = CGF.EmitScalarExpr(E->getExpr(2));        // Shuffle LHS & RHS into one input vector. -      llvm::SmallVector<llvm::Constant*, 32> concat; +      SmallVector<llvm::Constant*, 32> concat;        for (unsigned i = 0; i != LHSElts; ++i) {          concat.push_back(Builder.getInt32(2*i));          concat.push_back(Builder.getInt32(2*i+1)); @@ -706,7 +733,7 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {        Mask = RHS;      } -    const llvm::VectorType *MTy = cast<llvm::VectorType>(Mask->getType()); +    llvm::VectorType *MTy = cast<llvm::VectorType>(Mask->getType());      llvm::Constant* EltMask;      // Treat vec3 like vec4. @@ -721,7 +748,7 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {                                         (1 << llvm::Log2_32(LHSElts))-1);      // Mask off the high bits of each shuffle index. -    llvm::SmallVector<llvm::Constant *, 32> MaskV; +    SmallVector<llvm::Constant *, 32> MaskV;      for (unsigned i = 0, e = MTy->getNumElements(); i != e; ++i)        MaskV.push_back(EltMask); @@ -734,7 +761,7 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {      //   n = extract mask i      //   x = extract val n      //   newv = insert newv, x, i -    const llvm::VectorType *RTy = llvm::VectorType::get(LTy->getElementType(), +    llvm::VectorType *RTy = llvm::VectorType::get(LTy->getElementType(),                                                          MTy->getNumElements());      Value* NewV = llvm::UndefValue::get(RTy);      for (unsigned i = 0, e = MTy->getNumElements(); i != e; ++i) { @@ -760,8 +787,8 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {    Value* V2 = CGF.EmitScalarExpr(E->getExpr(1));    // Handle vec3 special since the index will be off by one for the RHS. -  const llvm::VectorType *VTy = cast<llvm::VectorType>(V1->getType()); -  llvm::SmallVector<llvm::Constant*, 32> indices; +  llvm::VectorType *VTy = cast<llvm::VectorType>(V1->getType()); +  SmallVector<llvm::Constant*, 32> indices;    for (unsigned i = 2; i < E->getNumSubExprs(); i++) {      unsigned Idx = E->getShuffleMaskIdx(CGF.getContext(), i-2);      if (VTy->getNumElements() == 3 && Idx > 3) @@ -815,7 +842,7 @@ Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {  }  static llvm::Constant *getMaskElt(llvm::ShuffleVectorInst *SVI, unsigned Idx, -                                  unsigned Off, const llvm::Type *I32Ty) { +                                  unsigned Off, llvm::Type *I32Ty) {    int MV = SVI->getMaskValue(Idx);    if (MV == -1)       return llvm::UndefValue::get(I32Ty); @@ -831,12 +858,17 @@ Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {    if (E->hadArrayRangeDesignator())      CGF.ErrorUnsupported(E, "GNU array range designator extension"); -  const llvm::VectorType *VType = +  llvm::VectorType *VType =      dyn_cast<llvm::VectorType>(ConvertType(E->getType())); -  // We have a scalar in braces. Just use the first element. -  if (!VType) +  if (!VType) { +    if (NumInitElements == 0) { +      // C++11 value-initialization for the scalar. +      return EmitNullValue(E->getType()); +    } +    // We have a scalar in braces. Just use the first element.      return Visit(E->getInit(0)); +  }    unsigned ResElts = VType->getNumElements(); @@ -851,9 +883,9 @@ Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {    for (unsigned i = 0; i != NumInitElements; ++i) {      Expr *IE = E->getInit(i);      Value *Init = Visit(IE); -    llvm::SmallVector<llvm::Constant*, 16> Args; +    SmallVector<llvm::Constant*, 16> Args; -    const llvm::VectorType *VVT = dyn_cast<llvm::VectorType>(Init->getType()); +    llvm::VectorType *VVT = dyn_cast<llvm::VectorType>(Init->getType());      // Handle scalar elements.  If the scalar initializer is actually one      // element of a different vector of the same width, use shuffle instead of  @@ -911,7 +943,7 @@ Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {      if (isa<ExtVectorElementExpr>(IE)) {        llvm::ShuffleVectorInst *SVI = cast<llvm::ShuffleVectorInst>(Init);        Value *SVOp = SVI->getOperand(0); -      const llvm::VectorType *OpTy = cast<llvm::VectorType>(SVOp->getType()); +      llvm::VectorType *OpTy = cast<llvm::VectorType>(SVOp->getType());        if (OpTy->getNumElements() == ResElts) {          for (unsigned j = 0; j != CurIdx; ++j) { @@ -968,7 +1000,7 @@ Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {    // FIXME: evaluate codegen vs. shuffling against constant null vector.    // Emit remaining default initializers. -  const llvm::Type *EltTy = VType->getElementType(); +  llvm::Type *EltTy = VType->getElementType();    // Emit remaining default initializers    for (/* Do not initialize i*/; CurIdx < ResElts; ++CurIdx) { @@ -1023,8 +1055,9 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {                            ConvertType(CGF.getContext().getPointerType(DestTy)));      return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy));    } -       -  case CK_AnyPointerToObjCPointerCast: + +  case CK_CPointerToObjCPointerCast: +  case CK_BlockPointerToObjCPointerCast:    case CK_AnyPointerToBlockPointerCast:    case CK_BitCast: {      Value *Src = Visit(const_cast<Expr*>(E)); @@ -1075,7 +1108,9 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {        V = Builder.CreateStructGEP(V, 0, "arraydecay");      } -    return V; +    // Make sure the array decay ends up being the right type.  This matters if +    // the array type was of an incomplete type. +    return CGF.Builder.CreateBitCast(V, ConvertType(CE->getType()));    }    case CK_FunctionToPointerDecay:      return EmitLValue(E).getAddress(); @@ -1108,15 +1143,17 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {      return CGF.CGM.getCXXABI().EmitMemberPointerConversion(CGF, CE, Src);    } -  case CK_ObjCProduceObject: +  case CK_ARCProduceObject:      return CGF.EmitARCRetainScalarExpr(E); -  case CK_ObjCConsumeObject: +  case CK_ARCConsumeObject:      return CGF.EmitObjCConsumeObject(E->getType(), Visit(E)); -  case CK_ObjCReclaimReturnedObject: { +  case CK_ARCReclaimReturnedObject: {      llvm::Value *value = Visit(E);      value = CGF.EmitARCRetainAutoreleasedReturnValue(value);      return CGF.EmitObjCConsumeObject(E->getType(), value);    } +  case CK_ARCExtendBlockObject: +    return CGF.EmitARCExtendBlockObject(E);    case CK_FloatingRealToComplex:    case CK_FloatingComplexCast: @@ -1147,7 +1184,7 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {      // First, convert to the correct width so that we control the kind of      // extension. -    const llvm::Type *MiddleTy = CGF.IntPtrTy; +    llvm::Type *MiddleTy = CGF.IntPtrTy;      bool InputSigned = E->getType()->isSignedIntegerOrEnumerationType();      llvm::Value* IntResult =        Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv"); @@ -1163,16 +1200,16 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {      return 0;    }    case CK_VectorSplat: { -    const llvm::Type *DstTy = ConvertType(DestTy); +    llvm::Type *DstTy = ConvertType(DestTy);      Value *Elt = Visit(const_cast<Expr*>(E));      // Insert the element in element zero of an undef vector      llvm::Value *UnV = llvm::UndefValue::get(DstTy);      llvm::Value *Idx = Builder.getInt32(0); -    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp"); +    UnV = Builder.CreateInsertElement(UnV, Elt, Idx);      // Splat the element across to all elements -    llvm::SmallVector<llvm::Constant*, 16> Args; +    SmallVector<llvm::Constant*, 16> Args;      unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();      llvm::Constant *Zero = Builder.getInt32(0);      for (unsigned i = 0; i < NumElements; i++) @@ -1188,7 +1225,6 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {    case CK_FloatingToIntegral:    case CK_FloatingCast:      return EmitScalarConversion(Visit(E), E->getType(), DestTy); -    case CK_IntegralToBoolean:      return EmitIntToBoolConversion(Visit(E));    case CK_PointerToBoolean: @@ -1253,10 +1289,8 @@ EmitAddConsiderOverflowBehavior(const UnaryOperator *E,      BinOp.Opcode = BO_Add;      BinOp.E = E;      return EmitOverflowCheckedBinOp(BinOp); -    break;    } -  assert(false && "Unknown SignedOverflowBehaviorTy"); -  return 0; +  llvm_unreachable("Unknown SignedOverflowBehaviorTy");  }  llvm::Value * @@ -1344,6 +1378,14 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,    } else if (type->isRealFloatingType()) {      // Add the inc/dec to the real part.      llvm::Value *amt; + +    if (type->isHalfType()) { +      // Another special case: half FP increment should be done via float +      value = +    Builder.CreateCall(CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_from_fp16), +                       input); +    } +      if (value->getType()->isFloatTy())        amt = llvm::ConstantFP::get(VMContext,                                    llvm::APFloat(static_cast<float>(amount))); @@ -1359,6 +1401,11 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,      }      value = Builder.CreateFAdd(value, amt, isInc ? "inc" : "dec"); +    if (type->isHalfType()) +      value = +       Builder.CreateCall(CGF.CGM.getIntrinsic(llvm::Intrinsic::convert_to_fp16), +                          value); +    // Objective-C pointer types.    } else {      const ObjCObjectPointerType *OPT = type->castAs<ObjCObjectPointerType>(); @@ -1375,13 +1422,13 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,        value = Builder.CreateInBoundsGEP(value, sizeValue, "incdec.objptr");      value = Builder.CreateBitCast(value, input->getType());    } -   +    // Store the updated result through the lvalue.    if (LV.isBitField())      CGF.EmitStoreThroughBitfieldLValue(RValue::get(value), LV, &value);    else      CGF.EmitStoreThroughLValue(RValue::get(value), LV); -   +    // If this is a postinc, return the value read from memory, otherwise use the    // updated value.    return isPre ? value : input; @@ -1432,7 +1479,7 @@ Value *ScalarExprEmitter::VisitOffsetOfExpr(OffsetOfExpr *E) {    // Loop over the components of the offsetof to compute the value.    unsigned n = E->getNumComponents(); -  const llvm::Type* ResultType = ConvertType(E->getType()); +  llvm::Type* ResultType = ConvertType(E->getType());    llvm::Value* Result = llvm::Constant::getNullValue(ResultType);    QualType CurrentType = E->getTypeSourceInfo()->getType();    for (unsigned i = 0; i != n; ++i) { @@ -1686,7 +1733,7 @@ void ScalarExprEmitter::EmitUndefinedBehaviorIntegerDivAndRemCheck(                           llvm::next(insertPt));    llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn); -  const llvm::IntegerType *Ty = cast<llvm::IntegerType>(Zero->getType()); +  llvm::IntegerType *Ty = cast<llvm::IntegerType>(Zero->getType());    if (Ops.Ty->hasSignedIntegerRepresentation()) {      llvm::Value *IntMin = @@ -1769,7 +1816,7 @@ Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {      IID = llvm::Intrinsic::smul_with_overflow;      break;    default: -    assert(false && "Unsupported operation for overflow detection"); +    llvm_unreachable("Unsupported operation for overflow detection");      IID = 0;    }    OpID <<= 1; @@ -2065,7 +2112,7 @@ enum IntrinsicType { VCMPEQ, VCMPGT };  static llvm::Intrinsic::ID GetIntrinsic(IntrinsicType IT,                                          BuiltinType::Kind ElemKind) {    switch (ElemKind) { -  default: assert(0 && "unexpected element type"); +  default: llvm_unreachable("unexpected element type");    case BuiltinType::Char_U:    case BuiltinType::UChar:      return (IT == VCMPEQ) ? llvm::Intrinsic::ppc_altivec_vcmpequb_p : @@ -2135,7 +2182,7 @@ Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,        BuiltinType::Kind ElementKind = BTy->getKind();        switch(E->getOpcode()) { -      default: assert(0 && "is not a comparison operation"); +      default: llvm_unreachable("is not a comparison operation");        case BO_EQ:          CR6 = CR6_LT;          ID = GetIntrinsic(VCMPEQ, ElementKind); @@ -2294,7 +2341,7 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {  }  Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) { -  const llvm::Type *ResTy = ConvertType(E->getType()); +  llvm::Type *ResTy = ConvertType(E->getType());    // If we have 0 && RHS, see if we can elide RHS, if so, just return 0.    // If we have 1 && X, just emit X without inserting the control flow. @@ -2349,7 +2396,7 @@ Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {  }  Value *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) { -  const llvm::Type *ResTy = ConvertType(E->getType()); +  llvm::Type *ResTy = ConvertType(E->getType());    // If we have 1 || RHS, see if we can elide RHS, if so, just return 1.    // If we have 0 || X, just emit X without inserting the control flow. @@ -2471,11 +2518,11 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {      llvm::Value *LHS = Visit(lhsExpr);      llvm::Value *RHS = Visit(rhsExpr); -    const llvm::Type *condType = ConvertType(condExpr->getType()); -    const llvm::VectorType *vecTy = cast<llvm::VectorType>(condType); +    llvm::Type *condType = ConvertType(condExpr->getType()); +    llvm::VectorType *vecTy = cast<llvm::VectorType>(condType);      unsigned numElem = vecTy->getNumElements();       -    const llvm::Type *elemType = vecTy->getElementType(); +    llvm::Type *elemType = vecTy->getElementType();      std::vector<llvm::Constant*> Zvals;      for (unsigned i = 0; i < numElem; ++i) @@ -2493,7 +2540,7 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {      llvm::Value *RHSTmp = RHS;      llvm::Value *LHSTmp = LHS;      bool wasCast = false; -    const llvm::VectorType *rhsVTy = cast<llvm::VectorType>(RHS->getType()); +    llvm::VectorType *rhsVTy = cast<llvm::VectorType>(RHS->getType());      if (rhsVTy->getElementType()->isFloatTy()) {        RHSTmp = Builder.CreateBitCast(RHS, tmp2->getType());        LHSTmp = Builder.CreateBitCast(LHS, tmp->getType()); @@ -2578,11 +2625,11 @@ Value *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *block) {  Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) {    Value *Src  = CGF.EmitScalarExpr(E->getSrcExpr()); -  const llvm::Type *DstTy = ConvertType(E->getType()); +  llvm::Type *DstTy = ConvertType(E->getType());    // Going from vec4->vec3 or vec3->vec4 is a special case and requires    // a shuffle vector instead of a bitcast. -  const llvm::Type *SrcTy = Src->getType(); +  llvm::Type *SrcTy = Src->getType();    if (isa<llvm::VectorType>(DstTy) && isa<llvm::VectorType>(SrcTy)) {      unsigned numElementsDst = cast<llvm::VectorType>(DstTy)->getNumElements();      unsigned numElementsSrc = cast<llvm::VectorType>(SrcTy)->getNumElements(); @@ -2592,15 +2639,15 @@ Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) {        // In the case of going from int4->float3, a bitcast is needed before        // doing a shuffle. -      const llvm::Type *srcElemTy =  +      llvm::Type *srcElemTy =         cast<llvm::VectorType>(SrcTy)->getElementType(); -      const llvm::Type *dstElemTy =  +      llvm::Type *dstElemTy =         cast<llvm::VectorType>(DstTy)->getElementType();        if ((srcElemTy->isIntegerTy() && dstElemTy->isFloatTy())            || (srcElemTy->isFloatTy() && dstElemTy->isIntegerTy())) {          // Create a float type of the same size as the source or destination. -        const llvm::VectorType *newSrcTy = llvm::VectorType::get(dstElemTy, +        llvm::VectorType *newSrcTy = llvm::VectorType::get(dstElemTy,                                                                   numElementsSrc);          Src = Builder.CreateBitCast(Src, newSrcTy, "astypeCast"); @@ -2608,7 +2655,7 @@ Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) {        llvm::Value *UnV = llvm::UndefValue::get(Src->getType()); -      llvm::SmallVector<llvm::Constant*, 3> Args; +      SmallVector<llvm::Constant*, 3> Args;        Args.push_back(Builder.getInt32(0));        Args.push_back(Builder.getInt32(1));        Args.push_back(Builder.getInt32(2)); @@ -2626,6 +2673,10 @@ Value *ScalarExprEmitter::VisitAsTypeExpr(AsTypeExpr *E) {    return Builder.CreateBitCast(Src, DstTy, "astype");  } +Value *ScalarExprEmitter::VisitAtomicExpr(AtomicExpr *E) { +  return CGF.EmitAtomicExpr(E).getScalarVal(); +} +  //===----------------------------------------------------------------------===//  //                         Entry Point into this File  //===----------------------------------------------------------------------===// @@ -2678,7 +2729,7 @@ LValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {    // object->isa or (*object).isa    // Generate code as for: *(Class*)object    // build Class* type -  const llvm::Type *ClassPtrTy = ConvertType(E->getType()); +  llvm::Type *ClassPtrTy = ConvertType(E->getType());    Expr *BaseExpr = E->getBase();    if (BaseExpr->isRValue()) { @@ -2744,8 +2795,7 @@ LValue CodeGenFunction::EmitCompoundAssignmentLValue(    case BO_LOr:    case BO_Assign:    case BO_Comma: -    assert(false && "Not valid compound assignment operators"); -    break; +    llvm_unreachable("Not valid compound assignment operators");    }    llvm_unreachable("Unhandled compound assignment operator");  | 
