CGExprScalar.cpp revision 404cd1669c3ba138a9ae0a619bd689cce5aae271
17f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===--- CGExprScalar.cpp - Emit LLVM Code for Scalar Exprs ---------------===//
27f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//
37f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                     The LLVM Compiler Infrastructure
47f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
77f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//
87f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
97f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//
107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner// This contains code to emit Expr nodes with scalar LLVM types as LLVM code.
117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//
127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1478ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel#include "clang/Frontend/CodeGenOptions.h"
157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "CodeGenFunction.h"
164c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall#include "CGCXXABI.h"
17f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian#include "CGObjCRuntime.h"
187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "CodeGenModule.h"
1978ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel#include "CGDebugInfo.h"
20de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "clang/AST/ASTContext.h"
2198c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar#include "clang/AST/DeclObjC.h"
2219cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h"
23de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "clang/AST/StmtVisitor.h"
2425ddea7f7835c4b1804e458a5c866cde0097430aChris Lattner#include "clang/Basic/TargetInfo.h"
257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "llvm/Constants.h"
267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "llvm/Function.h"
2785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson#include "llvm/GlobalVariable.h"
287c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson#include "llvm/Intrinsics.h"
292add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump#include "llvm/Module.h"
30f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner#include "llvm/Support/CFG.h"
314e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump#include "llvm/Target/TargetData.h"
32c89bf69c9289d2b2305f2c267daacc7312391898Chris Lattner#include <cstdarg>
336aad91a43e26118c824d976661077819265d9bc0Ted Kremenek
347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerusing namespace clang;
357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerusing namespace CodeGen;
367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerusing llvm::Value;
377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                         Scalar Expression Emitter
407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
4279ba2a6379f87fa137377c3f55ff993b9e5cc144Benjamin Kramernamespace {
437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerstruct BinOpInfo {
447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *LHS;
457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS;
461f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  QualType Ty;  // Computation Type.
479a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinaryOperator::Opcode Opcode; // Opcode of BinOp to perform
489a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const Expr *E;      // Entire expr, for error unsupported.  May not be binop.
497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner};
507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
51404cd1669c3ba138a9ae0a619bd689cce5aae271John McCallstatic bool MustVisitNullValue(const Expr *E) {
52404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall  // If a null pointer expression's type is the C++0x nullptr_t, then
53404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall  // it's not necessarily a simple constant and it must be evaluated
54404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall  // for its potential side effects.
55404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall  return E->getType()->isNullPtrType();
56404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall}
57404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall
5885b4521e34dcd4a0a4a1f0819e1123128e5a3125Benjamin Kramerclass ScalarExprEmitter
597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  : public StmtVisitor<ScalarExprEmitter, Value*> {
607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CodeGenFunction &CGF;
6145d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar  CGBuilderTy &Builder;
627f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool IgnoreResultAssign;
63a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson  llvm::LLVMContext &VMContext;
647f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerpublic:
657f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
667f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  ScalarExprEmitter(CodeGenFunction &cgf, bool ira=false)
67db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    : CGF(cgf), Builder(CGF.Builder), IgnoreResultAssign(ira),
68a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson      VMContext(cgf.getLLVMContext()) {
697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
70db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
727f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //                               Utilities
737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
757f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool TestAndClearIgnoreResultAssign() {
769c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    bool I = IgnoreResultAssign;
779c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    IgnoreResultAssign = false;
789c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    return I;
799c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner  }
807f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  const llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); }
827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); }
83b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue EmitCheckedLValue(const Expr *E) { return CGF.EmitCheckedLValue(E); }
847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitLoadOfLValue(LValue LV, QualType T) {
869b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return CGF.EmitLoadOfLValue(LV, T).getScalarVal();
877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
88db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// EmitLoadOfLValue - Given an expression with complex type that represents a
907f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// value l-value, this method emits the address of the l-value, then loads
917f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// and returns the result.
927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitLoadOfLValue(const Expr *E) {
93b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump    return EmitLoadOfLValue(EmitCheckedLValue(E), E->getType());
947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
95db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
969abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  /// EmitConversionToBool - Convert the specified expression value to a
973420d0de2c52fedf771d7ef20522f6080233e377Chris Lattner  /// boolean (i1) truth value.  This is equivalent to "Val != 0".
989abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  Value *EmitConversionToBool(Value *Src, QualType DstTy);
99db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1003707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// EmitScalarConversion - Emit a conversion from the specified type to the
1013707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// specified destination type, both of which are LLVM scalar types.
1024f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *EmitScalarConversion(Value *Src, QualType SrcTy, QualType DstTy);
1034f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
1044f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  /// EmitComplexToScalarConversion - Emit a conversion from the specified
105db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  /// complex type to the specified destination type, where the destination type
106db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  /// is an LLVM scalar type.
1074f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *EmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
1084f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                       QualType SrcTy, QualType DstTy);
109df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump
110a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  /// EmitNullValue - Emit a value that corresponds to null for the given type.
111a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  Value *EmitNullValue(QualType Ty);
112a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson
1137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
1147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //                            Visitor Methods
1157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
1167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
117af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian  Value *Visit(Expr *E) {
118af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    llvm::DenseMap<const Expr *, llvm::Value *>::iterator I =
119af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian      CGF.ConditionalSaveExprs.find(E);
120af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    if (I != CGF.ConditionalSaveExprs.end())
121af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian      return I->second;
122af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian
123af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    return StmtVisitor<ScalarExprEmitter, Value*>::Visit(E);
124af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian  }
125af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian
1267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitStmt(Stmt *S) {
1277a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek    S->dump(CGF.getContext().getSourceManager());
1287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    assert(0 && "Stmt can't have complex result type!");
1297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return 0;
1307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitExpr(Expr *S);
132f51dc64f90851f636302dbaaf3f52c0524cdac36Fariborz Jahanian
133af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian  Value *VisitParenExpr(ParenExpr *PE) {
134af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    return Visit(PE->getSubExpr());
135af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian  }
1367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Leaves.
1387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitIntegerLiteral(const IntegerLiteral *E) {
1394a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(VMContext, E->getValue());
1407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitFloatingLiteral(const FloatingLiteral *E) {
142bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson    return llvm::ConstantFP::get(VMContext, E->getValue());
1437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitCharacterLiteral(const CharacterLiteral *E) {
1454a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
146e7579b57eb3eabfd3545b86320fb67466730e9fcNate Begeman  }
147e7579b57eb3eabfd3545b86320fb67466730e9fcNate Begeman  Value *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
1484a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
1497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
150ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  Value *VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) {
151a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson    return EmitNullValue(E->getType());
1527267f7832e5f0c7f951765e201c5a2650eb1637bArgyrios Kyrtzidis  }
1533f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  Value *VisitGNUNullExpr(const GNUNullExpr *E) {
154a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson    return EmitNullValue(E->getType());
1553f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
1567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
1574a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()),
158ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff                                  CGF.getContext().typesAreCompatible(
159ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff                                    E->getArgType1(), E->getArgType2()));
1607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1610027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  Value *VisitOffsetOfExpr(OffsetOfExpr *E);
1620518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  Value *VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
1630ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar  Value *VisitAddrLabelExpr(const AddrLabelExpr *E) {
164d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    llvm::Value *V = CGF.GetAddrOfLabel(E->getLabel());
165d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    return Builder.CreateBitCast(V, ConvertType(E->getType()));
1660ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar  }
167db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1687f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // l-values.
1697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitDeclRefExpr(DeclRefExpr *E) {
17028665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    Expr::EvalResult Result;
171189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    if (!E->Evaluate(Result, CGF.getContext()))
172189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall      return EmitLoadOfLValue(E);
173189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall
174189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    assert(!Result.HasSideEffects && "Constant declref with side-effect?!");
175189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall
176189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    llvm::Constant *C;
177189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    if (Result.Val.isInt()) {
178189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall      C = llvm::ConstantInt::get(VMContext, Result.Val.getInt());
179189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    } else if (Result.Val.isFloat()) {
180189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall      C = llvm::ConstantFP::get(VMContext, Result.Val.getFloat());
181189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    } else {
182189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall      return EmitLoadOfLValue(E);
18328665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    }
184189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall
185189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    // Make sure we emit a debug reference to the global variable.
186189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) {
187189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall      if (!CGF.getContext().DeclMustBeEmitted(VD))
188189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall        CGF.EmitDeclRefExprDbgValue(E, C);
189189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    } else if (isa<EnumConstantDecl>(E->getDecl())) {
190189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall      CGF.EmitDeclRefExprDbgValue(E, C);
191189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    }
192189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall
193189d6ef40eff11b83b2cda941d5ed89a5cef09b2John McCall    return C;
1947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
195db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
196db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    return CGF.EmitObjCSelectorExpr(E);
1979c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
198db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
199db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    return CGF.EmitObjCProtocolExpr(E);
2009c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
201db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
2029c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar    return EmitLoadOfLValue(E);
2039c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
2040a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar  Value *VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
20585c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar    return EmitLoadOfLValue(E);
2069c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
20709105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian  Value *VisitObjCImplicitSetterGetterRefExpr(
20809105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                        ObjCImplicitSetterGetterRefExpr *E) {
20943f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian    return EmitLoadOfLValue(E);
21043f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian  }
2119c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  Value *VisitObjCMessageExpr(ObjCMessageExpr *E) {
2129c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar    return CGF.EmitObjCMessageExpr(E).getScalarVal();
2130a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar  }
2140a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar
21583dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian  Value *VisitObjCIsaExpr(ObjCIsaExpr *E) {
216820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian    LValue LV = CGF.EmitObjCIsaExpr(E);
217820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian    Value *V = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
21883dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian    return V;
21983dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian  }
22083dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian
2217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
222d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value *VisitShuffleVectorExpr(ShuffleVectorExpr *E);
22328665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  Value *VisitMemberExpr(MemberExpr *E);
224213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  Value *VisitExtVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); }
225be20bb558cae5352898e6a913e29d24d20134841Chris Lattner  Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
226be20bb558cae5352898e6a913e29d24d20134841Chris Lattner    return EmitLoadOfLValue(E);
227be20bb558cae5352898e6a913e29d24d20134841Chris Lattner  }
22835634f5ed67966c9f1fde38420e79cc6515cd673Devang Patel
2290533b3020ca39898751d4200feed776861dcd1ceNate Begeman  Value *VisitInitListExpr(InitListExpr *E);
230db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2313498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  Value *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
2323cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson    return CGF.CGM.EmitNullConstant(E->getType());
2333498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  }
234d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Value *VisitCastExpr(CastExpr *E) {
235c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman    // Make sure to evaluate VLA bounds now so that we have them for later.
236745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian    if (E->getType()->isVariablyModifiedType())
237745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian      CGF.EmitVLASize(E->getType());
238c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman
239592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson    return EmitCastExpr(E);
2407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
241d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Value *EmitCastExpr(CastExpr *E);
2427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
2437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitCallExpr(const CallExpr *E) {
244e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson    if (E->getCallReturnType()->isReferenceType())
245e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson      return EmitLoadOfLValue(E);
246db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2479b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return CGF.EmitCallExpr(E).getScalarVal();
2487f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2498f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar
2503379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner  Value *VisitStmtExpr(const StmtExpr *E);
2514e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump
252a99038c0757a836c6faeeddaa5dfd249b32f6e9eMike Stump  Value *VisitBlockDeclRefExpr(const BlockDeclRefExpr *E);
253db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Unary Operators.
2557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPostDec(const UnaryOperator *E) {
2568c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2578c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, false, false);
2587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPostInc(const UnaryOperator *E) {
2608c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2618c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, true, false);
2627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPreDec(const UnaryOperator *E) {
2648c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2658c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, false, true);
2667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPreInc(const UnaryOperator *E) {
2688c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2698c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, true, true);
2707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2718c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2728c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  llvm::Value *EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
2738c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                                       bool isInc, bool isPre);
2748c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2758c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2767f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryAddrOf(const UnaryOperator *E) {
277d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // If the sub-expression is an instance member reference,
278d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // EmitDeclRefLValue will magically emit it with the appropriate
279d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // value as the "address".
2807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLValue(E->getSubExpr()).getAddress();
2817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
2837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPlus(const UnaryOperator *E) {
2847f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    // This differs from gcc, though, most likely due to a bug in gcc.
2857f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    TestAndClearIgnoreResultAssign();
2867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Visit(E->getSubExpr());
2877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryMinus    (const UnaryOperator *E);
2897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryNot      (const UnaryOperator *E);
2907f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryLNot     (const UnaryOperator *E);
29146f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Value *VisitUnaryReal     (const UnaryOperator *E);
29246f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Value *VisitUnaryImag     (const UnaryOperator *E);
2937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryExtension(const UnaryOperator *E) {
2947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Visit(E->getSubExpr());
2957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
2975f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson  // C++
29804421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  Value *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
29904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    return Visit(DAE->getExpr());
30004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  }
3015f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson  Value *VisitCXXThisExpr(CXXThisExpr *TE) {
3025f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson    return CGF.LoadCXXThis();
303db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
304db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
3057f6ad153565245026c7569314f65a4d4ff4ac41fAnders Carlsson  Value *VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
3063082463f4f387b725f4e4bf7d7b46269d445e4f5Anders Carlsson    return CGF.EmitCXXExprWithTemporaries(E).getScalarVal();
3077f6ad153565245026c7569314f65a4d4ff4ac41fAnders Carlsson  }
308a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson  Value *VisitCXXNewExpr(const CXXNewExpr *E) {
309a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson    return CGF.EmitCXXNewExpr(E);
310a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson  }
31160e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson  Value *VisitCXXDeleteExpr(const CXXDeleteExpr *E) {
31260e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson    CGF.EmitCXXDeleteExpr(E);
31360e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson    return 0;
31460e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson  }
3159dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman  Value *VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
3160dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl    return llvm::ConstantInt::get(Builder.getInt1Ty(), E->getValue());
3179dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman  }
318db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
319a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  Value *VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E) {
320a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    // C++ [expr.pseudo]p1:
321db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    //   The result shall only be used as the operand for the function call
322a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   operator (), and the result of such a call has type void. The only
323a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   effect is the evaluation of the postfix-expression before the dot or
324a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   arrow.
325a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CGF.EmitScalarExpr(E->getBase());
326a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return 0;
327a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
328db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
329c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson  Value *VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) {
330a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson    return EmitNullValue(E->getType());
331c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson  }
332756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson
333756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson  Value *VisitCXXThrowExpr(const CXXThrowExpr *E) {
334756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson    CGF.EmitCXXThrowExpr(E);
335756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson    return 0;
336756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson  }
337756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson
33898294def01c97e127fa6d812ebd944d37212828aSebastian Redl  Value *VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) {
33998294def01c97e127fa6d812ebd944d37212828aSebastian Redl    return llvm::ConstantInt::get(Builder.getInt1Ty(), E->getValue());
34098294def01c97e127fa6d812ebd944d37212828aSebastian Redl  }
34198294def01c97e127fa6d812ebd944d37212828aSebastian Redl
3427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Binary Operators.
3437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitMul(const BinOpInfo &Ops) {
344f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    if (Ops.Ty->hasSignedIntegerRepresentation()) {
345a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
346a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Undefined:
347a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateNSWMul(Ops.LHS, Ops.RHS, "mul");
348a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Defined:
349a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul");
350a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Trapping:
351a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return EmitOverflowCheckedBinOp(Ops);
352a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      }
353a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    }
354a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
355f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
35687415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFMul(Ops.LHS, Ops.RHS, "mul");
3577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul");
3587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3598023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  bool isTrapvOverflowBehavior() {
3608023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    return CGF.getContext().getLangOptions().getSignedOverflowBehavior()
3618023030f76d334355b73d9c675d3870858aaf4fdChris Lattner               == LangOptions::SOB_Trapping;
3628023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  }
3632add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  /// Create a binary op that checks for overflow.
3642add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  /// Currently only supports +, - and *.
3652add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *EmitOverflowCheckedBinOp(const BinOpInfo &Ops);
3668023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  // Emit the overflow BB when -ftrapv option is activated.
3678023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  void EmitOverflowBB(llvm::BasicBlock *overflowBB) {
3688023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    Builder.SetInsertPoint(overflowBB);
3698023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Function *Trap = CGF.CGM.getIntrinsic(llvm::Intrinsic::trap);
3708023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    Builder.CreateCall(Trap);
3718023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    Builder.CreateUnreachable();
3728023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  }
3738023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  // Check for undefined division and modulus behaviors.
3748023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  void EmitUndefinedBehaviorIntegerDivAndRemCheck(const BinOpInfo &Ops,
3758023030f76d334355b73d9c675d3870858aaf4fdChris Lattner                                                  llvm::Value *Zero,bool isDiv);
3767f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitDiv(const BinOpInfo &Ops);
3777f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitRem(const BinOpInfo &Ops);
3787f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitAdd(const BinOpInfo &Ops);
3797f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitSub(const BinOpInfo &Ops);
3807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitShl(const BinOpInfo &Ops);
3817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitShr(const BinOpInfo &Ops);
3827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitAnd(const BinOpInfo &Ops) {
3837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateAnd(Ops.LHS, Ops.RHS, "and");
3847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitXor(const BinOpInfo &Ops) {
3867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateXor(Ops.LHS, Ops.RHS, "xor");
3877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitOr (const BinOpInfo &Ops) {
3897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateOr(Ops.LHS, Ops.RHS, "or");
3907f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3917f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
3921f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  BinOpInfo EmitBinOps(const BinaryOperator *E);
3936a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E,
3946a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                            Value *(ScalarExprEmitter::*F)(const BinOpInfo &),
395d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                  Value *&Result);
3966a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
3973ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *EmitCompoundAssign(const CompoundAssignOperator *E,
3981f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner                            Value *(ScalarExprEmitter::*F)(const BinOpInfo &));
3991f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
4001f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  // Binary operators and binary compound assignment operators.
4011f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner#define HANDLEBINOP(OP) \
4023ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *VisitBin ## OP(const BinaryOperator *E) {                         \
4033ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner    return Emit ## OP(EmitBinOps(E));                                      \
4043ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  }                                                                        \
4053ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *VisitBin ## OP ## Assign(const CompoundAssignOperator *E) {       \
4063ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner    return EmitCompoundAssign(E, &ScalarExprEmitter::Emit ## OP);          \
4071f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  }
4087177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Mul)
4097177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Div)
4107177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Rem)
4117177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Add)
4127177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Sub)
4137177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Shl)
4147177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Shr)
4157177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(And)
4167177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Xor)
4177177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Or)
4181f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner#undef HANDLEBINOP
4198c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar
4207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Comparisons.
4217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitCompare(const BinaryOperator *E, unsigned UICmpOpc,
4227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                     unsigned SICmpOpc, unsigned FCmpOpc);
4237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#define VISITCOMP(CODE, UI, SI, FP) \
4247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *VisitBin##CODE(const BinaryOperator *E) { \
4257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      return EmitCompare(E, llvm::ICmpInst::UI, llvm::ICmpInst::SI, \
4267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                         llvm::FCmpInst::FP); }
4277177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(LT, ICMP_ULT, ICMP_SLT, FCMP_OLT)
4287177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(GT, ICMP_UGT, ICMP_SGT, FCMP_OGT)
4297177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(LE, ICMP_ULE, ICMP_SLE, FCMP_OLE)
4307177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(GE, ICMP_UGE, ICMP_SGE, FCMP_OGE)
4317177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(EQ, ICMP_EQ , ICMP_EQ , FCMP_OEQ)
4327177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(NE, ICMP_NE , ICMP_NE , FCMP_UNE)
4337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#undef VISITCOMP
434db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinAssign     (const BinaryOperator *E);
4367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
4377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinLAnd       (const BinaryOperator *E);
4387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinLOr        (const BinaryOperator *E);
4397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinComma      (const BinaryOperator *E);
4407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
44125b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman  Value *VisitBinPtrMemD(const Expr *E) { return EmitLoadOfLValue(E); }
44225b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman  Value *VisitBinPtrMemI(const Expr *E) { return EmitLoadOfLValue(E); }
44325b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman
4447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Other Operators.
445df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump  Value *VisitBlockExpr(const BlockExpr *BE);
4467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitConditionalOperator(const ConditionalOperator *CO);
4477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitChooseExpr(ChooseExpr *CE);
4487c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  Value *VisitVAArgExpr(VAArgExpr *VE);
4497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitObjCStringLiteral(const ObjCStringLiteral *E) {
4507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return CGF.EmitObjCStringLiteral(E);
4517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
4527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner};
4537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}  // end anonymous namespace.
4547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
4557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
4567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                                Utilities
4577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
4587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
4599abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner/// EmitConversionToBool - Convert the specified expression value to a
4603420d0de2c52fedf771d7ef20522f6080233e377Chris Lattner/// boolean (i1) truth value.  This is equivalent to "Val != 0".
4619abc84e7ac4db891209fe67cc3a8c9690dc886efChris LattnerValue *ScalarExprEmitter::EmitConversionToBool(Value *Src, QualType SrcType) {
462467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(SrcType.isCanonical() && "EmitScalarConversion strips typedefs");
463db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4649abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  if (SrcType->isRealFloatingType()) {
4659abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    // Compare against 0.0 for fp scalars.
466c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson    llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
4679abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    return Builder.CreateFCmpUNE(Src, Zero, "tobool");
4689abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  }
469db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4700bab0cdab751248ca389a5592bcb70eac5d39260John McCall  if (const MemberPointerType *MPT = dyn_cast<MemberPointerType>(SrcType))
4710bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitMemberPointerIsNotNull(CGF, Src, MPT);
472db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
473d1d66bcd6914ff82abdfa88dd25bb0b74cde3b99Daniel Dunbar  assert((SrcType->isIntegerType() || isa<llvm::PointerType>(Src->getType())) &&
4749abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner         "Unknown scalar type to convert");
475db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4769abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Because of the type rules of C, we often end up computing a logical value,
4779abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // then zero extending it to int, then wanting it as a logical value again.
4789abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Optimize this common case.
4799abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  if (llvm::ZExtInst *ZI = dyn_cast<llvm::ZExtInst>(Src)) {
4800032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    if (ZI->getOperand(0)->getType() ==
4810032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson        llvm::Type::getInt1Ty(CGF.getLLVMContext())) {
4829abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner      Value *Result = ZI->getOperand(0);
483356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // If there aren't any more uses, zap the instruction to save space.
484356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // Note that there can be more uses, for example if this
485356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // is the result of an assignment.
486356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      if (ZI->use_empty())
487356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman        ZI->eraseFromParent();
4889abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner      return Result;
4899abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    }
4909abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  }
491db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4929abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Compare against an integer or pointer null.
493c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson  llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
4949abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  return Builder.CreateICmpNE(Src, Zero, "tobool");
4959abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner}
4969abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner
4973707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// EmitScalarConversion - Emit a conversion from the specified type to the
4983707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// specified destination type, both of which are LLVM scalar types.
4994f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
5004f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                               QualType DstType) {
5019619662a1d42e2008b865d3459c0677e149dad1bChris Lattner  SrcType = CGF.getContext().getCanonicalType(SrcType);
5029619662a1d42e2008b865d3459c0677e149dad1bChris Lattner  DstType = CGF.getContext().getCanonicalType(DstType);
5033707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (SrcType == DstType) return Src;
504db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
505cf289083ab007264fa3ea96d92f133339aee5d2dChris Lattner  if (DstType->isVoidType()) return 0;
506db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5073707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Handle conversions to bool first, they are special: comparisons against 0.
508ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  if (DstType->isBooleanType())
509ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    return EmitConversionToBool(Src, SrcType);
510db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5113707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  const llvm::Type *DstTy = ConvertType(DstType);
5123707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
5133707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Ignore conversions like int -> uint.
5143707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (Src->getType() == DstTy)
5153707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    return Src;
5163707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
517db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Handle pointer conversions next: pointers can only be converted to/from
518db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // other pointers and integers. Check for pointer types in terms of LLVM, as
519db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // some native types (like Obj-C id) may map to a pointer type.
520270cc66683b22d6bb0b4644f5a40f84d45edf119Daniel Dunbar  if (isa<llvm::PointerType>(DstTy)) {
5213707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // The source value may be an integer, or a pointer.
522191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    if (isa<llvm::PointerType>(Src->getType()))
5233707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner      return Builder.CreateBitCast(Src, DstTy, "conv");
524191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
5253707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    assert(SrcType->isIntegerType() && "Not ptr->ptr or int->ptr conversion?");
52625615424741bcce31fe52c896f76268f0307f00dEli Friedman    // First, convert to the correct width so that we control the kind of
52725615424741bcce31fe52c896f76268f0307f00dEli Friedman    // extension.
52877b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    const llvm::Type *MiddleTy = CGF.IntPtrTy;
52925615424741bcce31fe52c896f76268f0307f00dEli Friedman    bool InputSigned = SrcType->isSignedIntegerType();
53025615424741bcce31fe52c896f76268f0307f00dEli Friedman    llvm::Value* IntResult =
53125615424741bcce31fe52c896f76268f0307f00dEli Friedman        Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
53225615424741bcce31fe52c896f76268f0307f00dEli Friedman    // Then, cast to pointer.
53325615424741bcce31fe52c896f76268f0307f00dEli Friedman    return Builder.CreateIntToPtr(IntResult, DstTy, "conv");
5343707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
535db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
536270cc66683b22d6bb0b4644f5a40f84d45edf119Daniel Dunbar  if (isa<llvm::PointerType>(Src->getType())) {
5373707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // Must be an ptr to int cast.
5383707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?");
53950b5a30db40322880340e957ad7d6d8d60bb4c5bAnders Carlsson    return Builder.CreatePtrToInt(Src, DstTy, "conv");
5403707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
541db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
542213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // A scalar can be splatted to an extended vector of the same element type
5432ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  if (DstType->isExtVectorType() && !SrcType->isVectorType()) {
5446fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Cast the scalar to element type
545183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    QualType EltTy = DstType->getAs<ExtVectorType>()->getElementType();
5466fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::Value *Elt = EmitScalarConversion(Src, SrcType, EltTy);
5476fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman
5486fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Insert the element in element zero of an undef vector
54903e205031b08669f05c41eed5b896fc94c4a12bbOwen Anderson    llvm::Value *UnV = llvm::UndefValue::get(DstTy);
55077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    llvm::Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, 0);
5516fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp");
5526fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman
5536fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Splat the element across to all elements
5546fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::SmallVector<llvm::Constant*, 16> Args;
5556fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();
5566fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    for (unsigned i = 0; i < NumElements; i++)
55777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 0));
558db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5594a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], NumElements);
5606fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::Value *Yay = Builder.CreateShuffleVector(UnV, UnV, Mask, "splat");
5616fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    return Yay;
5626fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman  }
5634119d1aeca8016654d381ce079864058d1709571Nate Begeman
5643b1ae004d0ee88fc029dad876ec5695f178ef3f6Chris Lattner  // Allow bitcast from vector to integer/fp of the same size.
5657019a9ea3f5d6f8cdf5e2e31f74b4df53e3ffcddAnders Carlsson  if (isa<llvm::VectorType>(Src->getType()) ||
5663b1ae004d0ee88fc029dad876ec5695f178ef3f6Chris Lattner      isa<llvm::VectorType>(DstTy))
5677019a9ea3f5d6f8cdf5e2e31f74b4df53e3ffcddAnders Carlsson    return Builder.CreateBitCast(Src, DstTy, "conv");
568db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5693707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Finally, we have the arithmetic types: real int/float.
5703707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (isa<llvm::IntegerType>(Src->getType())) {
5713707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    bool InputSigned = SrcType->isSignedIntegerType();
572b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    if (isa<llvm::IntegerType>(DstTy))
573b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateIntCast(Src, DstTy, InputSigned, "conv");
574b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else if (InputSigned)
575b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateSIToFP(Src, DstTy, "conv");
576b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else
577b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateUIToFP(Src, DstTy, "conv");
5783707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
579db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
580f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  assert(Src->getType()->isFloatingPointTy() && "Unknown real conversion");
5813707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (isa<llvm::IntegerType>(DstTy)) {
582b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    if (DstType->isSignedIntegerType())
583b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateFPToSI(Src, DstTy, "conv");
584b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else
585b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateFPToUI(Src, DstTy, "conv");
5863707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
5873707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
588f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  assert(DstTy->isFloatingPointTy() && "Unknown real conversion");
589b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson  if (DstTy->getTypeID() < Src->getType()->getTypeID())
590b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    return Builder.CreateFPTrunc(Src, DstTy, "conv");
591b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson  else
592b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    return Builder.CreateFPExt(Src, DstTy, "conv");
5933707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner}
5943707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
595db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitComplexToScalarConversion - Emit a conversion from the specified complex
596db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type to the specified destination type, where the destination type is an
597db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// LLVM scalar type.
5984f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *ScalarExprEmitter::
5994f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerEmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
6004f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                              QualType SrcTy, QualType DstTy) {
601ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  // Get the source element type.
602183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  SrcTy = SrcTy->getAs<ComplexType>()->getElementType();
603db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
604ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  // Handle conversions to bool first, they are special: comparisons against 0.
605ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  if (DstTy->isBooleanType()) {
606ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    //  Complex != 0  -> (Real != 0) | (Imag != 0)
607ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    Src.first  = EmitScalarConversion(Src.first, SrcTy, DstTy);
608ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    Src.second = EmitScalarConversion(Src.second, SrcTy, DstTy);
609ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    return Builder.CreateOr(Src.first, Src.second, "tobool");
610ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  }
611db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
6124f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // C99 6.3.1.7p2: "When a value of complex type is converted to a real type,
6134f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // the imaginary part of the complex value is discarded and the value of the
6144f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // real part is converted according to the conversion rules for the
615db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // corresponding real type.
6164f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  return EmitScalarConversion(Src.first, SrcTy, DstTy);
6174f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner}
6184f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
619a40a9f31218c743e366322e34b59f0d4d4414198Anders CarlssonValue *ScalarExprEmitter::EmitNullValue(QualType Ty) {
6200bab0cdab751248ca389a5592bcb70eac5d39260John McCall  if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>())
6210bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitNullMemberPointer(MPT);
6220bab0cdab751248ca389a5592bcb70eac5d39260John McCall
6230bab0cdab751248ca389a5592bcb70eac5d39260John McCall  return llvm::Constant::getNullValue(ConvertType(Ty));
624a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson}
6254f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
6267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
6277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                            Visitor Methods
6287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
6297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
6307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitExpr(Expr *E) {
631488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar  CGF.ErrorUnsupported(E, "scalar expression");
6327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (E->getType()->isVoidType())
6337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return 0;
63403e205031b08669f05c41eed5b896fc94c4a12bbOwen Anderson  return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
6357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
6367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
637d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanValue *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
63837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  // Vector Mask Case
63937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  if (E->getNumSubExprs() == 2 ||
6403f4cb120fe574f7b80864f52a1999502a4f3a83dRafael Espindola      (E->getNumSubExprs() == 3 && E->getExpr(2)->getType()->isVectorType())) {
64177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *LHS = CGF.EmitScalarExpr(E->getExpr(0));
64277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *RHS = CGF.EmitScalarExpr(E->getExpr(1));
64377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *Mask;
64437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
64537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *LTy = cast<llvm::VectorType>(LHS->getType());
64637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    unsigned LHSElts = LTy->getNumElements();
64737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
64837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    if (E->getNumSubExprs() == 3) {
64937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Mask = CGF.EmitScalarExpr(E->getExpr(2));
65037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
65137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      // Shuffle LHS & RHS into one input vector.
65237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      llvm::SmallVector<llvm::Constant*, 32> concat;
65337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      for (unsigned i = 0; i != LHSElts; ++i) {
65477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        concat.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 2*i));
65577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        concat.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 2*i+1));
65637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      }
65737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
65837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Value* CV = llvm::ConstantVector::get(concat.begin(), concat.size());
65937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      LHS = Builder.CreateShuffleVector(LHS, RHS, CV, "concat");
66037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      LHSElts *= 2;
66137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    } else {
66237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Mask = RHS;
66337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    }
66437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
66537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *MTy = cast<llvm::VectorType>(Mask->getType());
66637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    llvm::Constant* EltMask;
66737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
66837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // Treat vec3 like vec4.
66937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    if ((LHSElts == 6) && (E->getNumSubExprs() == 3))
67037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      EltMask = llvm::ConstantInt::get(MTy->getElementType(),
67137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                       (1 << llvm::Log2_32(LHSElts+2))-1);
67237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    else if ((LHSElts == 3) && (E->getNumSubExprs() == 2))
67337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      EltMask = llvm::ConstantInt::get(MTy->getElementType(),
67437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                       (1 << llvm::Log2_32(LHSElts+1))-1);
67537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    else
67637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      EltMask = llvm::ConstantInt::get(MTy->getElementType(),
67737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                       (1 << llvm::Log2_32(LHSElts))-1);
67837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
67937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // Mask off the high bits of each shuffle index.
68037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    llvm::SmallVector<llvm::Constant *, 32> MaskV;
68137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    for (unsigned i = 0, e = MTy->getNumElements(); i != e; ++i)
68237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      MaskV.push_back(EltMask);
68337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
68437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    Value* MaskBits = llvm::ConstantVector::get(MaskV.begin(), MaskV.size());
68537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    Mask = Builder.CreateAnd(Mask, MaskBits, "mask");
68637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
68737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // newv = undef
68837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // mask = mask & maskbits
68937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // for each elt
69037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    //   n = extract mask i
69137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    //   x = extract val n
69237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    //   newv = insert newv, x, i
69337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *RTy = llvm::VectorType::get(LTy->getElementType(),
69437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                                        MTy->getNumElements());
69537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    Value* NewV = llvm::UndefValue::get(RTy);
69637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    for (unsigned i = 0, e = MTy->getNumElements(); i != e; ++i) {
69777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Value *Indx = llvm::ConstantInt::get(CGF.Int32Ty, i);
69837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Indx = Builder.CreateExtractElement(Mask, Indx, "shuf_idx");
69977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Indx = Builder.CreateZExt(Indx, CGF.Int32Ty, "idx_zext");
70037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
70137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      // Handle vec3 special since the index will be off by one for the RHS.
70237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      if ((LHSElts == 6) && (E->getNumSubExprs() == 3)) {
70337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        Value *cmpIndx, *newIndx;
70477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        cmpIndx = Builder.CreateICmpUGT(Indx,
70577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner                                        llvm::ConstantInt::get(CGF.Int32Ty, 3),
70637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                        "cmp_shuf_idx");
70777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        newIndx = Builder.CreateSub(Indx, llvm::ConstantInt::get(CGF.Int32Ty,1),
70837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                    "shuf_idx_adj");
70937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        Indx = Builder.CreateSelect(cmpIndx, newIndx, Indx, "sel_shuf_idx");
71037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      }
71137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Value *VExt = Builder.CreateExtractElement(LHS, Indx, "shuf_elt");
71237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      NewV = Builder.CreateInsertElement(NewV, VExt, Indx, "shuf_ins");
71337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    }
71437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    return NewV;
715d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
71637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
717d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value* V1 = CGF.EmitScalarExpr(E->getExpr(0));
718d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value* V2 = CGF.EmitScalarExpr(E->getExpr(1));
71937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
72037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  // Handle vec3 special since the index will be off by one for the RHS.
72137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  llvm::SmallVector<llvm::Constant*, 32> indices;
72237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  for (unsigned i = 2; i < E->getNumSubExprs(); i++) {
72337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    llvm::Constant *C = cast<llvm::Constant>(CGF.EmitScalarExpr(E->getExpr(i)));
72437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *VTy = cast<llvm::VectorType>(V1->getType());
72537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    if (VTy->getNumElements() == 3) {
72637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      if (llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C)) {
72737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        uint64_t cVal = CI->getZExtValue();
72837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        if (cVal > 3) {
72937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman          C = llvm::ConstantInt::get(C->getType(), cVal-1);
73037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        }
73137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      }
73237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    }
73337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    indices.push_back(C);
73437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  }
73537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
7364a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson  Value* SV = llvm::ConstantVector::get(indices.begin(), indices.size());
737d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  return Builder.CreateShuffleVector(V1, V2, SV, "shuffle");
738d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}
73928665272c36cccb1014a6ea1217354b0519e2b59Eli FriedmanValue *ScalarExprEmitter::VisitMemberExpr(MemberExpr *E) {
74028665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  Expr::EvalResult Result;
74128665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  if (E->Evaluate(Result, CGF.getContext()) && Result.Val.isInt()) {
74228665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    if (E->isArrow())
74328665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      CGF.EmitScalarExpr(E->getBase());
74428665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    else
74528665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      EmitLValue(E->getBase());
74628665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    return llvm::ConstantInt::get(VMContext, Result.Val.getInt());
74728665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  }
74878ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel
74978ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel  // Emit debug info for aggregate now, if it was delayed to reduce
75078ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel  // debug info size.
75178ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel  CGDebugInfo *DI = CGF.getDebugInfo();
75278ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel  if (DI && CGF.CGM.getCodeGenOpts().LimitDebugInfo) {
75378ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel    QualType PQTy = E->getBase()->IgnoreParenImpCasts()->getType();
75478ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel    if (const PointerType * PTy = dyn_cast<PointerType>(PQTy))
75549c8465f14fc3b2e1a32c7016ad3fb4e2cf8d466Devang Patel      if (FieldDecl *M = dyn_cast<FieldDecl>(E->getMemberDecl()))
75678ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel        DI->getOrCreateRecordType(PTy->getPointeeType(),
75778ba3d46388f17b4fc5e63ed23b746dd4dea9547Devang Patel                                  M->getParent()->getLocation());
7587fa8ab2e77f5703d0adf14e4d98f1edc1e66505dDevang Patel  }
75928665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  return EmitLoadOfLValue(E);
76028665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman}
761d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
7627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
7637f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
7647f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
7657f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Emit subscript expressions in rvalue context's.  For most cases, this just
7667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // loads the lvalue formed by the subscript expr.  However, we have to be
7677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // careful, because the base of a vector subscript is occasionally an rvalue,
7687f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // so we can't get it as an lvalue.
7697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (!E->getBase()->getType()->isVectorType())
7707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLoadOfLValue(E);
771db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
7727f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Handle the vector case.  The base must be a vector, the index must be an
7737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // integer value.
7747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Base = Visit(E->getBase());
7757f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Idx  = Visit(E->getIdx());
776daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  bool IdxSigned = E->getIdx()->getType()->isSignedIntegerType();
77777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner  Idx = Builder.CreateIntCast(Idx, CGF.Int32Ty, IdxSigned, "vecidxcast");
7787f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateExtractElement(Base, Idx, "vecext");
7797f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
7807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
7810533b3020ca39898751d4200feed776861dcd1ceNate Begemanstatic llvm::Constant *getMaskElt(llvm::ShuffleVectorInst *SVI, unsigned Idx,
7820533b3020ca39898751d4200feed776861dcd1ceNate Begeman                                  unsigned Off, const llvm::Type *I32Ty) {
7830533b3020ca39898751d4200feed776861dcd1ceNate Begeman  int MV = SVI->getMaskValue(Idx);
7840533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (MV == -1)
7850533b3020ca39898751d4200feed776861dcd1ceNate Begeman    return llvm::UndefValue::get(I32Ty);
7860533b3020ca39898751d4200feed776861dcd1ceNate Begeman  return llvm::ConstantInt::get(I32Ty, Off+MV);
7870533b3020ca39898751d4200feed776861dcd1ceNate Begeman}
7880533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7890533b3020ca39898751d4200feed776861dcd1ceNate BegemanValue *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {
7900533b3020ca39898751d4200feed776861dcd1ceNate Begeman  bool Ignore = TestAndClearIgnoreResultAssign();
7910533b3020ca39898751d4200feed776861dcd1ceNate Begeman  (void)Ignore;
7920533b3020ca39898751d4200feed776861dcd1ceNate Begeman  assert (Ignore == false && "init list ignored");
7930533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned NumInitElements = E->getNumInits();
7940533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7950533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (E->hadArrayRangeDesignator())
7960533b3020ca39898751d4200feed776861dcd1ceNate Begeman    CGF.ErrorUnsupported(E, "GNU array range designator extension");
7970533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7980533b3020ca39898751d4200feed776861dcd1ceNate Begeman  const llvm::VectorType *VType =
7990533b3020ca39898751d4200feed776861dcd1ceNate Begeman    dyn_cast<llvm::VectorType>(ConvertType(E->getType()));
8000533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8010533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // We have a scalar in braces. Just use the first element.
8020533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (!VType)
8030533b3020ca39898751d4200feed776861dcd1ceNate Begeman    return Visit(E->getInit(0));
8040533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8050533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned ResElts = VType->getNumElements();
8060533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8070533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Loop over initializers collecting the Value for each, and remembering
8080533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // whether the source was swizzle (ExtVectorElementExpr).  This will allow
8090533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // us to fold the shuffle for the swizzle into the shuffle for the vector
8100533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // initializer, since LLVM optimizers generally do not want to touch
8110533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // shuffles.
8120533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned CurIdx = 0;
8130533b3020ca39898751d4200feed776861dcd1ceNate Begeman  bool VIsUndefShuffle = false;
8140533b3020ca39898751d4200feed776861dcd1ceNate Begeman  llvm::Value *V = llvm::UndefValue::get(VType);
8150533b3020ca39898751d4200feed776861dcd1ceNate Begeman  for (unsigned i = 0; i != NumInitElements; ++i) {
8160533b3020ca39898751d4200feed776861dcd1ceNate Begeman    Expr *IE = E->getInit(i);
8170533b3020ca39898751d4200feed776861dcd1ceNate Begeman    Value *Init = Visit(IE);
8180533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::SmallVector<llvm::Constant*, 16> Args;
8190533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8200533b3020ca39898751d4200feed776861dcd1ceNate Begeman    const llvm::VectorType *VVT = dyn_cast<llvm::VectorType>(Init->getType());
8210533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8220533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // Handle scalar elements.  If the scalar initializer is actually one
8230533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // element of a different vector of the same width, use shuffle instead of
8240533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // extract+insert.
8250533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (!VVT) {
8260533b3020ca39898751d4200feed776861dcd1ceNate Begeman      if (isa<ExtVectorElementExpr>(IE)) {
8270533b3020ca39898751d4200feed776861dcd1ceNate Begeman        llvm::ExtractElementInst *EI = cast<llvm::ExtractElementInst>(Init);
8280533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8290533b3020ca39898751d4200feed776861dcd1ceNate Begeman        if (EI->getVectorOperandType()->getNumElements() == ResElts) {
8300533b3020ca39898751d4200feed776861dcd1ceNate Begeman          llvm::ConstantInt *C = cast<llvm::ConstantInt>(EI->getIndexOperand());
8310533b3020ca39898751d4200feed776861dcd1ceNate Begeman          Value *LHS = 0, *RHS = 0;
8320533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (CurIdx == 0) {
8330533b3020ca39898751d4200feed776861dcd1ceNate Begeman            // insert into undef -> shuffle (src, undef)
8340533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(C);
8350533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = 1; j != ResElts; ++j)
83677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner              Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
8370533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8380533b3020ca39898751d4200feed776861dcd1ceNate Begeman            LHS = EI->getVectorOperand();
8390533b3020ca39898751d4200feed776861dcd1ceNate Begeman            RHS = V;
8400533b3020ca39898751d4200feed776861dcd1ceNate Begeman            VIsUndefShuffle = true;
8410533b3020ca39898751d4200feed776861dcd1ceNate Begeman          } else if (VIsUndefShuffle) {
8420533b3020ca39898751d4200feed776861dcd1ceNate Begeman            // insert into undefshuffle && size match -> shuffle (v, src)
8430533b3020ca39898751d4200feed776861dcd1ceNate Begeman            llvm::ShuffleVectorInst *SVV = cast<llvm::ShuffleVectorInst>(V);
8440533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = 0; j != CurIdx; ++j)
84577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner              Args.push_back(getMaskElt(SVV, j, 0, CGF.Int32Ty));
84677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner            Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty,
8470533b3020ca39898751d4200feed776861dcd1ceNate Begeman                                                  ResElts + C->getZExtValue()));
8480533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = CurIdx + 1; j != ResElts; ++j)
84977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner              Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
8500533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8510533b3020ca39898751d4200feed776861dcd1ceNate Begeman            LHS = cast<llvm::ShuffleVectorInst>(V)->getOperand(0);
8520533b3020ca39898751d4200feed776861dcd1ceNate Begeman            RHS = EI->getVectorOperand();
8530533b3020ca39898751d4200feed776861dcd1ceNate Begeman            VIsUndefShuffle = false;
8540533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
8550533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (!Args.empty()) {
8560533b3020ca39898751d4200feed776861dcd1ceNate Begeman            llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
8570533b3020ca39898751d4200feed776861dcd1ceNate Begeman            V = Builder.CreateShuffleVector(LHS, RHS, Mask);
8580533b3020ca39898751d4200feed776861dcd1ceNate Begeman            ++CurIdx;
8590533b3020ca39898751d4200feed776861dcd1ceNate Begeman            continue;
8600533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
8610533b3020ca39898751d4200feed776861dcd1ceNate Begeman        }
8620533b3020ca39898751d4200feed776861dcd1ceNate Begeman      }
86377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, CurIdx);
8640533b3020ca39898751d4200feed776861dcd1ceNate Begeman      V = Builder.CreateInsertElement(V, Init, Idx, "vecinit");
8650533b3020ca39898751d4200feed776861dcd1ceNate Begeman      VIsUndefShuffle = false;
8660533b3020ca39898751d4200feed776861dcd1ceNate Begeman      ++CurIdx;
8670533b3020ca39898751d4200feed776861dcd1ceNate Begeman      continue;
8680533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
8690533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8700533b3020ca39898751d4200feed776861dcd1ceNate Begeman    unsigned InitElts = VVT->getNumElements();
8710533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8720533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // If the initializer is an ExtVecEltExpr (a swizzle), and the swizzle's
8730533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // input is the same width as the vector being constructed, generate an
8740533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // optimized shuffle of the swizzle input into the result.
875a99f08351b6df3bb0f2947e038747717a60fd93aNate Begeman    unsigned Offset = (CurIdx == 0) ? 0 : ResElts;
8760533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (isa<ExtVectorElementExpr>(IE)) {
8770533b3020ca39898751d4200feed776861dcd1ceNate Begeman      llvm::ShuffleVectorInst *SVI = cast<llvm::ShuffleVectorInst>(Init);
8780533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Value *SVOp = SVI->getOperand(0);
8790533b3020ca39898751d4200feed776861dcd1ceNate Begeman      const llvm::VectorType *OpTy = cast<llvm::VectorType>(SVOp->getType());
8800533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8810533b3020ca39898751d4200feed776861dcd1ceNate Begeman      if (OpTy->getNumElements() == ResElts) {
8820533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = 0; j != CurIdx; ++j) {
8830533b3020ca39898751d4200feed776861dcd1ceNate Begeman          // If the current vector initializer is a shuffle with undef, merge
8840533b3020ca39898751d4200feed776861dcd1ceNate Begeman          // this shuffle directly into it.
8850533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (VIsUndefShuffle) {
8860533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(getMaskElt(cast<llvm::ShuffleVectorInst>(V), j, 0,
88777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner                                      CGF.Int32Ty));
8880533b3020ca39898751d4200feed776861dcd1ceNate Begeman          } else {
88977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner            Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j));
8900533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
8910533b3020ca39898751d4200feed776861dcd1ceNate Begeman        }
8920533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = 0, je = InitElts; j != je; ++j)
89377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner          Args.push_back(getMaskElt(SVI, j, Offset, CGF.Int32Ty));
8940533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = CurIdx + InitElts; j != ResElts; ++j)
89577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner          Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
8960533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8970533b3020ca39898751d4200feed776861dcd1ceNate Begeman        if (VIsUndefShuffle)
8980533b3020ca39898751d4200feed776861dcd1ceNate Begeman          V = cast<llvm::ShuffleVectorInst>(V)->getOperand(0);
8990533b3020ca39898751d4200feed776861dcd1ceNate Begeman
9000533b3020ca39898751d4200feed776861dcd1ceNate Begeman        Init = SVOp;
9010533b3020ca39898751d4200feed776861dcd1ceNate Begeman      }
9020533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
9030533b3020ca39898751d4200feed776861dcd1ceNate Begeman
9040533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // Extend init to result vector length, and then shuffle its contribution
9050533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // to the vector initializer into V.
9060533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (Args.empty()) {
9070533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != InitElts; ++j)
90877b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j));
9090533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = InitElts; j != ResElts; ++j)
91077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
9110533b3020ca39898751d4200feed776861dcd1ceNate Begeman      llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
9120533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Init = Builder.CreateShuffleVector(Init, llvm::UndefValue::get(VVT),
913a99f08351b6df3bb0f2947e038747717a60fd93aNate Begeman                                         Mask, "vext");
9140533b3020ca39898751d4200feed776861dcd1ceNate Begeman
9150533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Args.clear();
9160533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != CurIdx; ++j)
91777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j));
9180533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != InitElts; ++j)
91977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j+Offset));
9200533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = CurIdx + InitElts; j != ResElts; ++j)
92177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
9220533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
9230533b3020ca39898751d4200feed776861dcd1ceNate Begeman
9240533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // If V is undef, make sure it ends up on the RHS of the shuffle to aid
9250533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // merging subsequent shuffles into this one.
9260533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (CurIdx == 0)
9270533b3020ca39898751d4200feed776861dcd1ceNate Begeman      std::swap(V, Init);
9280533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
9290533b3020ca39898751d4200feed776861dcd1ceNate Begeman    V = Builder.CreateShuffleVector(V, Init, Mask, "vecinit");
9300533b3020ca39898751d4200feed776861dcd1ceNate Begeman    VIsUndefShuffle = isa<llvm::UndefValue>(Init);
9310533b3020ca39898751d4200feed776861dcd1ceNate Begeman    CurIdx += InitElts;
9320533b3020ca39898751d4200feed776861dcd1ceNate Begeman  }
9330533b3020ca39898751d4200feed776861dcd1ceNate Begeman
9340533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // FIXME: evaluate codegen vs. shuffling against constant null vector.
9350533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Emit remaining default initializers.
9360533b3020ca39898751d4200feed776861dcd1ceNate Begeman  const llvm::Type *EltTy = VType->getElementType();
9370533b3020ca39898751d4200feed776861dcd1ceNate Begeman
9380533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Emit remaining default initializers
9390533b3020ca39898751d4200feed776861dcd1ceNate Begeman  for (/* Do not initialize i*/; CurIdx < ResElts; ++CurIdx) {
94077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, CurIdx);
9410533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::Value *Init = llvm::Constant::getNullValue(EltTy);
9420533b3020ca39898751d4200feed776861dcd1ceNate Begeman    V = Builder.CreateInsertElement(V, Init, Idx, "vecinit");
9430533b3020ca39898751d4200feed776861dcd1ceNate Begeman  }
9440533b3020ca39898751d4200feed776861dcd1ceNate Begeman  return V;
9450533b3020ca39898751d4200feed776861dcd1ceNate Begeman}
9460533b3020ca39898751d4200feed776861dcd1ceNate Begeman
947a3697c9c155bda93fd2802f37084b620f4738822Anders Carlssonstatic bool ShouldNullCheckClassCastValue(const CastExpr *CE) {
948a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  const Expr *E = CE->getSubExpr();
94923cba801e11b03929c44f8cf54578305963a3476John McCall
9502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (CE->getCastKind() == CK_UncheckedDerivedToBase)
95123cba801e11b03929c44f8cf54578305963a3476John McCall    return false;
952a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
953a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  if (isa<CXXThisExpr>(E)) {
954a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    // We always assume that 'this' is never null.
955a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    return false;
956a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
957a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
958a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(CE)) {
959906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl    // And that glvalue casts are never null.
9605baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall    if (ICE->getValueKind() != VK_RValue)
961a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson      return false;
962a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
963a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
964a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  return true;
965a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson}
966a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
967504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// VisitCastExpr - Emit code for an explicit or implicit cast.  Implicit casts
968504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// have to handle a more broad range of conversions than explicit casts, as they
969504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// handle things like function to ptr-to-function decay etc.
970d888962cff03b543fbe9ac6051ec6addf5b993b4Eli FriedmanValue *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
971d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Expr *E = CE->getSubExpr();
972592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson  QualType DestTy = CE->getType();
9732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  CastKind Kind = CE->getCastKind();
974592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson
975504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson  if (!DestTy->isVoidType())
976504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson    TestAndClearIgnoreResultAssign();
977db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
9788c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // Since almost all cast kinds apply to scalars, this switch doesn't have
9798c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // a default case, so the compiler will warn on a missing case.  The cases
9808c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // are in the same order as in the CastKind enum.
981504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson  switch (Kind) {
9822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_Unknown:
983d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    // FIXME: All casts should have a known kind!
984ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    //assert(0 && "Unknown cast kind!");
985504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson    break;
986ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
9872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_LValueBitCast:
9882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ObjCObjectLValueCast: {
989e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor    Value *V = EmitLValue(E).getAddress();
990e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor    V = Builder.CreateBitCast(V,
991e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor                          ConvertType(CGF.getContext().getPointerType(DestTy)));
9929f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy), DestTy);
993e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor  }
994e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor
9952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToObjCPointerCast:
9962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToBlockPointerCast:
9972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BitCast: {
998cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
999cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson    return Builder.CreateBitCast(Src, ConvertType(DestTy));
1000cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson  }
10012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_NoOp:
10022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_UserDefinedConversion:
1003ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return Visit(const_cast<Expr*>(E));
1004db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
10052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BaseToDerived: {
1006a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    const CXXRecordDecl *DerivedClassDecl =
1007a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson      DestTy->getCXXRecordDeclForPointerType();
1008a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
1009a04efdf635d35d88e65041fad007225d8c8d64a5Anders Carlsson    return CGF.GetAddressOfDerivedClass(Visit(E), DerivedClassDecl,
1010f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                        CE->path_begin(), CE->path_end(),
1011a04efdf635d35d88e65041fad007225d8c8d64a5Anders Carlsson                                        ShouldNullCheckClassCastValue(CE));
1012a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
10132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_UncheckedDerivedToBase:
10142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_DerivedToBase: {
1015191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    const RecordType *DerivedClassTy =
1016191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson      E->getType()->getAs<PointerType>()->getPointeeType()->getAs<RecordType>();
1017191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    CXXRecordDecl *DerivedClassDecl =
1018191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson      cast<CXXRecordDecl>(DerivedClassTy->getDecl());
1019191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
102034a2d384c745ebc39cae45dc1c0c4a6a7012e09bAnders Carlsson    return CGF.GetAddressOfBaseClass(Visit(E), DerivedClassDecl,
1021f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                     CE->path_begin(), CE->path_end(),
102234a2d384c745ebc39cae45dc1c0c4a6a7012e09bAnders Carlsson                                     ShouldNullCheckClassCastValue(CE));
1023191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson  }
10242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_Dynamic: {
10258c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    Value *V = Visit(const_cast<Expr*>(E));
10268c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    const CXXDynamicCastExpr *DCE = cast<CXXDynamicCastExpr>(CE);
10278c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    return CGF.EmitDynamicCast(V, DCE);
10288c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  }
10292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ToUnion:
1030ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    assert(0 && "Should be unreachable!");
1031ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    break;
1032d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
10332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ArrayToPointerDecay: {
1034ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    assert(E->getType()->isArrayType() &&
1035ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman           "Array to pointer decay must have array source type!");
1036ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1037ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    Value *V = EmitLValue(E).getAddress();  // Bitfields can't be arrays.
1038ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1039ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Note that VLA pointers are always decayed, so we don't need to do
1040ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // anything here.
1041ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    if (!E->getType()->isVariableArrayType()) {
1042ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      assert(isa<llvm::PointerType>(V->getType()) && "Expected pointer");
1043ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      assert(isa<llvm::ArrayType>(cast<llvm::PointerType>(V->getType())
1044ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman                                 ->getElementType()) &&
1045ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman             "Expected pointer to array");
1046ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      V = Builder.CreateStructGEP(V, 0, "arraydecay");
1047ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    }
1048ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1049ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return V;
1050ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
10512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FunctionToPointerDecay:
1052ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return EmitLValue(E).getAddress();
1053ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1054404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall  case CK_NullToPointer:
1055404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall    if (MustVisitNullValue(E))
1056404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall      (void) Visit(E);
1057404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall
1058404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall    return llvm::ConstantPointerNull::get(
1059404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall                               cast<llvm::PointerType>(ConvertType(DestTy)));
1060404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall
10612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_NullToMemberPointer: {
1062404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall    if (MustVisitNullValue(E))
1063d608cdb7c044365cf4e8764ade1e11e99c176078John McCall      (void) Visit(E);
1064d608cdb7c044365cf4e8764ade1e11e99c176078John McCall
10650bab0cdab751248ca389a5592bcb70eac5d39260John McCall    const MemberPointerType *MPT = CE->getType()->getAs<MemberPointerType>();
10660bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitNullMemberPointer(MPT);
10670bab0cdab751248ca389a5592bcb70eac5d39260John McCall  }
1068191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
10692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BaseToDerivedMemberPointer:
10702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_DerivedToBaseMemberPointer: {
1071d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    Value *Src = Visit(E);
1072d608cdb7c044365cf4e8764ade1e11e99c176078John McCall
1073d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // Note that the AST doesn't distinguish between checked and
1074d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // unchecked member pointer conversions, so we always have to
1075d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // implement checked conversions here.  This is inefficient when
1076d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // actual control flow may be required in order to perform the
1077d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // check, which it is for data member pointers (but not member
1078d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // function pointers on Itanium and ARM).
10790bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitMemberPointerConversion(CGF, CE, Src);
1080d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  }
10810bab0cdab751248ca389a5592bcb70eac5d39260John McCall
1082d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
10832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ConstructorConversion:
1084d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    assert(0 && "Should be unreachable!");
10858c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    break;
10868c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman
10872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToPointer: {
10887f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
108989f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
109082debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    // First, convert to the correct width so that we control the kind of
109182debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    // extension.
109277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    const llvm::Type *MiddleTy = CGF.IntPtrTy;
109382debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    bool InputSigned = E->getType()->isSignedIntegerType();
109482debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    llvm::Value* IntResult =
109582debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson      Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
109689f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
109782debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return Builder.CreateIntToPtr(IntResult, ConvertType(DestTy));
10987f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  }
10992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_PointerToIntegral: {
11007f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
110189f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
110289f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar    // Handle conversion to bool correctly.
110389f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar    if (DestTy->isBooleanType())
1104db50547fd526329d00fa1fee4e7ac90f2624c6e0Daniel Dunbar      return EmitScalarConversion(Src, E->getType(), DestTy);
110589f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
11067f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    return Builder.CreatePtrToInt(Src, ConvertType(DestTy));
11077f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  }
11082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ToVoid: {
1109699c06068dab18efd37897659ec120d211827607Fariborz Jahanian    if (E->Classify(CGF.getContext()).isGLValue()) {
1110699c06068dab18efd37897659ec120d211827607Fariborz Jahanian      LValue LV = CGF.EmitLValue(E);
1111699c06068dab18efd37897659ec120d211827607Fariborz Jahanian      if (LV.isPropertyRef())
1112699c06068dab18efd37897659ec120d211827607Fariborz Jahanian        CGF.EmitLoadOfPropertyRefLValue(LV, E->getType());
1113699c06068dab18efd37897659ec120d211827607Fariborz Jahanian      else if (LV.isKVCRef())
1114699c06068dab18efd37897659ec120d211827607Fariborz Jahanian        CGF.EmitLoadOfKVCRefLValue(LV, E->getType());
1115699c06068dab18efd37897659ec120d211827607Fariborz Jahanian    }
1116569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor    else
1117558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      CGF.EmitAnyExpr(E, AggValueSlot::ignored(), true);
1118ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return 0;
1119ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
11202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_VectorSplat: {
1121ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    const llvm::Type *DstTy = ConvertType(DestTy);
1122ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    Value *Elt = Visit(const_cast<Expr*>(E));
1123ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1124ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Insert the element in element zero of an undef vector
1125ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Value *UnV = llvm::UndefValue::get(DstTy);
112677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    llvm::Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, 0);
1127ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp");
1128ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1129ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Splat the element across to all elements
1130ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::SmallVector<llvm::Constant*, 16> Args;
1131ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();
1132ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    for (unsigned i = 0; i < NumElements; i++)
113377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 0));
1134ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1135ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], NumElements);
1136ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Value *Yay = Builder.CreateShuffleVector(UnV, UnV, Mask, "splat");
1137ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return Yay;
1138ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
11392de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralCast:
11402de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToFloating:
11412de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FloatingToIntegral:
11422de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FloatingCast:
1143d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    return EmitScalarConversion(Visit(E), E->getType(), DestTy);
1144ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
11452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_MemberPointerToBoolean: {
11460bab0cdab751248ca389a5592bcb70eac5d39260John McCall    llvm::Value *MemPtr = Visit(E);
11470bab0cdab751248ca389a5592bcb70eac5d39260John McCall    const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>();
11480bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitMemberPointerIsNotNull(CGF, MemPtr, MPT);
1149e9776247577715ad3a19461769a3488a445a8cbdAnders Carlsson  }
11500bab0cdab751248ca389a5592bcb70eac5d39260John McCall  }
11510bab0cdab751248ca389a5592bcb70eac5d39260John McCall
115258a2e944faa16f1f61439acd2e71b19f50189511Chris Lattner  // Handle cases where the source is an non-complex type.
1153db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
115419a1d7c646729eb858b15583e647262a22de3637Chris Lattner  if (!CGF.hasAggregateLLVMType(E->getType())) {
11553707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    Value *Src = Visit(const_cast<Expr*>(E));
11563707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
11573707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // Use EmitScalarConversion to perform the conversion.
11583707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    return EmitScalarConversion(Src, E->getType(), DestTy);
11593707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
1160db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
11619b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (E->getType()->isAnyComplexType()) {
116219a1d7c646729eb858b15583e647262a22de3637Chris Lattner    // Handle cases where the source is a complex type.
11637f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreImag = true;
11647f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreImagAssign = true;
11657f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreReal = IgnoreResultAssign;
11667f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreRealAssign = IgnoreResultAssign;
11677f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    if (DestTy->isBooleanType())
11687f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreImagAssign = IgnoreImag = false;
11697f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    else if (DestTy->isVoidType()) {
11707f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreReal = IgnoreImag = false;
11717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreRealAssign = IgnoreImagAssign = true;
11727f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    }
11737f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CodeGenFunction::ComplexPairTy V
11747f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      = CGF.EmitComplexExpr(E, IgnoreReal, IgnoreImag, IgnoreRealAssign,
11757f79f9be5916c51c35da4f126b7c12596a101607Mike Stump                            IgnoreImagAssign);
11767f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return EmitComplexToScalarConversion(V, E->getType(), DestTy);
117719a1d7c646729eb858b15583e647262a22de3637Chris Lattner  }
117810b00cfe6422906b223724048b9b2123968d3baaChris Lattner
117919a1d7c646729eb858b15583e647262a22de3637Chris Lattner  // Okay, this is a cast from an aggregate.  It must be a cast to void.  Just
118019a1d7c646729eb858b15583e647262a22de3637Chris Lattner  // evaluate the result and return.
1181558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  CGF.EmitAggExpr(E, AggValueSlot::ignored(), true);
118219a1d7c646729eb858b15583e647262a22de3637Chris Lattner  return 0;
11837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
11847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
11853379320c10001d7e1ee5d7e7142c417f797cfe82Chris LattnerValue *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) {
118691d723da7b68be5245c3ac58aa2a36d04658cfb8Chris Lattner  return CGF.EmitCompoundStmt(*E->getSubStmt(),
118791d723da7b68be5245c3ac58aa2a36d04658cfb8Chris Lattner                              !E->getType()->isVoidType()).getScalarVal();
11883379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner}
11893379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner
1190a99038c0757a836c6faeeddaa5dfd249b32f6e9eMike StumpValue *ScalarExprEmitter::VisitBlockDeclRefExpr(const BlockDeclRefExpr *E) {
1191f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian  llvm::Value *V = CGF.GetAddrOfBlockDecl(E);
1192f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian  if (E->getType().isObjCGCWeak())
1193f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian    return CGF.CGM.getObjCRuntime().EmitObjCWeakRead(CGF, V);
1194469a20de757ff872c90ff6b1134f6346909ff652Fariborz Jahanian  return CGF.EmitLoadOfScalar(V, false, 0, E->getType());
11954e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump}
11963379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner
11977f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
11987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                             Unary Operators
11997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
12007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
12018c11a65c18ae607b7073e1e451264492d2297726Chris Lattnerllvm::Value *ScalarExprEmitter::
12028c11a65c18ae607b7073e1e451264492d2297726Chris LattnerEmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
12038c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                        bool isInc, bool isPre) {
12048c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12058c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  QualType ValTy = E->getSubExpr()->getType();
12068c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  llvm::Value *InVal = EmitLoadOfLValue(LV, ValTy);
12078c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12088c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  int AmountVal = isInc ? 1 : -1;
12098c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12108c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  if (ValTy->isPointerType() &&
12118c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      ValTy->getAs<PointerType>()->isVariableArrayType()) {
12128c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // The amount of the addition/subtraction needs to account for the VLA size
12138c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    CGF.ErrorUnsupported(E, "VLA pointer inc/dec");
12148c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  }
12158c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12168c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  llvm::Value *NextVal;
12178c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  if (const llvm::PointerType *PT =
12188c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      dyn_cast<llvm::PointerType>(InVal->getType())) {
121977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    llvm::Constant *Inc = llvm::ConstantInt::get(CGF.Int32Ty, AmountVal);
12208c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    if (!isa<llvm::FunctionType>(PT->getElementType())) {
12218c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      QualType PTEE = ValTy->getPointeeType();
12228c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      if (const ObjCObjectType *OIT = PTEE->getAs<ObjCObjectType>()) {
12238c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        // Handle interface types, which are not represented with a concrete
12248c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        // type.
12258c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        int size = CGF.getContext().getTypeSize(OIT) / 8;
12268c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        if (!isInc)
12278c11a65c18ae607b7073e1e451264492d2297726Chris Lattner          size = -size;
12288c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        Inc = llvm::ConstantInt::get(Inc->getType(), size);
12298c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
12308c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        InVal = Builder.CreateBitCast(InVal, i8Ty);
12318c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        NextVal = Builder.CreateGEP(InVal, Inc, "add.ptr");
12328c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        llvm::Value *lhs = LV.getAddress();
12338c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        lhs = Builder.CreateBitCast(lhs, llvm::PointerType::getUnqual(i8Ty));
12349f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar        LV = CGF.MakeAddrLValue(lhs, ValTy);
12358c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      } else
12368c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        NextVal = Builder.CreateInBoundsGEP(InVal, Inc, "ptrincdec");
12378c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    } else {
12388c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
12398c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateBitCast(InVal, i8Ty, "tmp");
12408c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateGEP(NextVal, Inc, "ptrincdec");
12418c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateBitCast(NextVal, InVal->getType());
12428c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    }
12438c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  } else if (InVal->getType()->isIntegerTy(1) && isInc) {
12448c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Bool++ is an interesting case, due to promotion rules, we get:
12458c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Bool++ -> Bool = Bool+1 -> Bool = (int)Bool+1 ->
12468c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Bool = ((int)Bool+1) != 0
12478c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // An interesting aspect of this is that increment is always true.
12488c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Decrement does not have this property.
12498c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    NextVal = llvm::ConstantInt::getTrue(VMContext);
12508c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  } else if (isa<llvm::IntegerType>(InVal->getType())) {
12518c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    NextVal = llvm::ConstantInt::get(InVal->getType(), AmountVal);
12528c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
1253640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner    if (!ValTy->isSignedIntegerType())
1254640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      // Unsigned integer inc is always two's complement.
12558c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
1256640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner    else {
1257640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
1258640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      case LangOptions::SOB_Undefined:
1259640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        NextVal = Builder.CreateNSWAdd(InVal, NextVal, isInc ? "inc" : "dec");
1260640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        break;
1261640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      case LangOptions::SOB_Defined:
1262640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
1263640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        break;
1264640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      case LangOptions::SOB_Trapping:
1265640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOpInfo BinOp;
1266640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.LHS = InVal;
1267640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.RHS = NextVal;
1268640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.Ty = E->getType();
12692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        BinOp.Opcode = BO_Add;
1270640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.E = E;
1271401be6bddcf05ac2828730e0bb4e8b81931f8296John McCall        NextVal = EmitOverflowCheckedBinOp(BinOp);
1272401be6bddcf05ac2828730e0bb4e8b81931f8296John McCall        break;
1273640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      }
1274640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner    }
12758c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  } else {
12768c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Add the inc/dec to the real part.
12778c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    if (InVal->getType()->isFloatTy())
12788c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal =
12798c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      llvm::ConstantFP::get(VMContext,
12808c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                            llvm::APFloat(static_cast<float>(AmountVal)));
12818c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    else if (InVal->getType()->isDoubleTy())
12828c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal =
12838c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      llvm::ConstantFP::get(VMContext,
12848c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                            llvm::APFloat(static_cast<double>(AmountVal)));
12858c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    else {
12868c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      llvm::APFloat F(static_cast<float>(AmountVal));
12878c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      bool ignored;
12888c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      F.convert(CGF.Target.getLongDoubleFormat(), llvm::APFloat::rmTowardZero,
12898c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                &ignored);
12908c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = llvm::ConstantFP::get(VMContext, F);
12918c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    }
12928c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    NextVal = Builder.CreateFAdd(InVal, NextVal, isInc ? "inc" : "dec");
12938c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  }
12948c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12958c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  // Store the updated result through the lvalue.
12968c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  if (LV.isBitField())
12978c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    CGF.EmitStoreThroughBitfieldLValue(RValue::get(NextVal), LV, ValTy, &NextVal);
12988c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  else
12998c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    CGF.EmitStoreThroughLValue(RValue::get(NextVal), LV, ValTy);
13008c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
13018c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  // If this is a postinc, return the value read from memory, otherwise use the
13028c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  // updated value.
13038c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  return isPre ? NextVal : InVal;
13048c11a65c18ae607b7073e1e451264492d2297726Chris Lattner}
13058c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
13068c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
13078c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
13087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
13097f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
13109a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // Emit unary minus with EmitSub so we handle overflow cases etc.
13119a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinOpInfo BinOp;
13124ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner  BinOp.RHS = Visit(E->getSubExpr());
13134ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner
13144ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner  if (BinOp.RHS->getType()->isFPOrFPVectorTy())
13154ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner    BinOp.LHS = llvm::ConstantFP::getZeroValueForNegation(BinOp.RHS->getType());
13164ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner  else
13174ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner    BinOp.LHS = llvm::Constant::getNullValue(BinOp.RHS->getType());
13189a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinOp.Ty = E->getType();
13192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  BinOp.Opcode = BO_Sub;
13209a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinOp.E = E;
13219a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  return EmitSub(BinOp);
13227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
13237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
13247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
13257f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
13267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Op = Visit(E->getSubExpr());
13277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateNot(Op, "neg");
13287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
13297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
13307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryLNot(const UnaryOperator *E) {
13317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Compare operand to zero.
13327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *BoolVal = CGF.EvaluateExprAsBool(E->getSubExpr());
1333db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
13347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Invert value.
13357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // TODO: Could dynamically modify easy computations here.  For example, if
13367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // the operand is an icmp ne, turn into icmp eq.
13377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  BoolVal = Builder.CreateNot(BoolVal, "lnot");
1338db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
13399f84d88a302ea38cf0695ce8cdace47178d2fff4Anders Carlsson  // ZExt result to the expr type.
13409f84d88a302ea38cf0695ce8cdace47178d2fff4Anders Carlsson  return Builder.CreateZExt(BoolVal, ConvertType(E->getType()), "lnot.ext");
13417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
13427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
13430027d2bb24db629a33a71d04a5fb90a14c15a680Eli FriedmanValue *ScalarExprEmitter::VisitOffsetOfExpr(OffsetOfExpr *E) {
13440027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  // Try folding the offsetof to a constant.
13450027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  Expr::EvalResult EvalResult;
13460027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  if (E->Evaluate(EvalResult, CGF.getContext()))
13470027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    return llvm::ConstantInt::get(VMContext, EvalResult.Val.getInt());
13480027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13490027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  // Loop over the components of the offsetof to compute the value.
13500027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  unsigned n = E->getNumComponents();
13510027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  const llvm::Type* ResultType = ConvertType(E->getType());
13520027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  llvm::Value* Result = llvm::Constant::getNullValue(ResultType);
13530027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  QualType CurrentType = E->getTypeSourceInfo()->getType();
13540027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  for (unsigned i = 0; i != n; ++i) {
13550027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    OffsetOfExpr::OffsetOfNode ON = E->getComponent(i);
135616fd39fb11cce33d58ecdd39f25540b85c1542b4Eli Friedman    llvm::Value *Offset = 0;
13570027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    switch (ON.getKind()) {
13580027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Array: {
13590027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the index
13600027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Expr *IdxExpr = E->getIndexExpr(ON.getArrayExprIndex());
13610027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      llvm::Value* Idx = CGF.EmitScalarExpr(IdxExpr);
13620027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      bool IdxSigned = IdxExpr->getType()->isSignedIntegerType();
13630027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Idx = Builder.CreateIntCast(Idx, ResultType, IdxSigned, "conv");
13640027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13650027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Save the element type
13660027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CurrentType =
13670027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman          CGF.getContext().getAsArrayType(CurrentType)->getElementType();
13680027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13690027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the element size
13700027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      llvm::Value* ElemSize = llvm::ConstantInt::get(ResultType,
13710027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman          CGF.getContext().getTypeSizeInChars(CurrentType).getQuantity());
13720027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13730027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Multiply out to compute the result
13740027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Offset = Builder.CreateMul(Idx, ElemSize);
13750027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      break;
13760027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
13770027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13780027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Field: {
13790027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      FieldDecl *MemberDecl = ON.getField();
13800027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      RecordDecl *RD = CurrentType->getAs<RecordType>()->getDecl();
13810027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD);
13820027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13830027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the index of the field in its parent.
13840027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      unsigned i = 0;
13850027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // FIXME: It would be nice if we didn't have to loop here!
13860027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      for (RecordDecl::field_iterator Field = RD->field_begin(),
13870027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman                                      FieldEnd = RD->field_end();
13880027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman           Field != FieldEnd; (void)++Field, ++i) {
13890027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman        if (*Field == MemberDecl)
13900027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman          break;
13910027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      }
13920027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      assert(i < RL.getFieldCount() && "offsetof field in wrong type");
13930027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13940027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the offset to the field
13950027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      int64_t OffsetInt = RL.getFieldOffset(i) /
13960027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman                          CGF.getContext().getCharWidth();
13970027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Offset = llvm::ConstantInt::get(ResultType, OffsetInt);
13980027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13990027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Save the element type.
14000027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CurrentType = MemberDecl->getType();
14010027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      break;
14020027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
140316fd39fb11cce33d58ecdd39f25540b85c1542b4Eli Friedman
14040027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Identifier:
14056d4e44b462fe9e870a40358522379400ccc6e3c2Eli Friedman      llvm_unreachable("dependent __builtin_offsetof");
140616fd39fb11cce33d58ecdd39f25540b85c1542b4Eli Friedman
14070027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Base: {
14080027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      if (ON.getBase()->isVirtual()) {
14090027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman        CGF.ErrorUnsupported(E, "virtual base in offsetof");
14100027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman        continue;
14110027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      }
14120027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
14130027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      RecordDecl *RD = CurrentType->getAs<RecordType>()->getDecl();
14140027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD);
14150027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
14160027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Save the element type.
14170027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CurrentType = ON.getBase()->getType();
14180027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
14190027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the offset to the base.
14200027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      const RecordType *BaseRT = CurrentType->getAs<RecordType>();
14210027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CXXRecordDecl *BaseRD = cast<CXXRecordDecl>(BaseRT->getDecl());
1422a14f5979572aa25c03d24750ee4724d2031d4edeAnders Carlsson      int64_t OffsetInt = RL.getBaseClassOffsetInBits(BaseRD) /
14230027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman                          CGF.getContext().getCharWidth();
14240027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Offset = llvm::ConstantInt::get(ResultType, OffsetInt);
14250027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      break;
14260027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
14270027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
14280027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    Result = Builder.CreateAdd(Result, Offset);
14290027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  }
14300027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  return Result;
14318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
14328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14330518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeOfAlignOfExpr - Return the size or alignment of the type of
14340518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// argument of the sizeof expression as an integer.
14350518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlValue *
14360518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlScalarExprEmitter::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
14370518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType TypeToSize = E->getTypeOfArgument();
1438f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  if (E->isSizeOf()) {
1439db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    if (const VariableArrayType *VAT =
1440f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman          CGF.getContext().getAsVariableArrayType(TypeToSize)) {
1441f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman      if (E->isArgumentType()) {
1442f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman        // sizeof(type) - make sure to emit the VLA size.
1443f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman        CGF.EmitVLASize(TypeToSize);
14448f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman      } else {
14458f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        // C99 6.5.3.4p2: If the argument is an expression of type
14468f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        // VLA, it is evaluated.
14478f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        CGF.EmitAnyExpr(E->getArgumentExpr());
1448f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman      }
1449db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
145096f214776c0f69069fee4d67557c8c7f416009a8Anders Carlsson      return CGF.GetVLASize(VAT);
1451b50525ba0e996bc072cdb76152fcfe0bc64bb72aAnders Carlsson    }
14525d46315ca3cbbfe0d0f5f65520b618fb05dd4446Anders Carlsson  }
1453f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1454db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // If this isn't sizeof(vla), the result must be constant; use the constant
1455db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // folding logic so we don't have to duplicate it here.
1456f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  Expr::EvalResult Result;
1457f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  E->Evaluate(Result, CGF.getContext());
14584a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson  return llvm::ConstantInt::get(VMContext, Result.Val.getInt());
14597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
14607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
146146f93d021a1778442c1c4a53f0b94a68bfae3be5Chris LattnerValue *ScalarExprEmitter::VisitUnaryReal(const UnaryOperator *E) {
146246f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Expr *Op = E->getSubExpr();
14639b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (Op->getType()->isAnyComplexType())
14647f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return CGF.EmitComplexExpr(Op, false, true, false, true).first;
146546f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  return Visit(Op);
146646f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner}
146746f93d021a1778442c1c4a53f0b94a68bfae3be5Chris LattnerValue *ScalarExprEmitter::VisitUnaryImag(const UnaryOperator *E) {
146846f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Expr *Op = E->getSubExpr();
14699b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (Op->getType()->isAnyComplexType())
14707f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return CGF.EmitComplexExpr(Op, true, false, true, false).second;
1471db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
14727f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // __imag on a scalar returns zero.  Emit the subexpr to ensure side
14737f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // effects are evaluated, but not the actual value.
14747f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (E->isLvalue(CGF.getContext()) == Expr::LV_Valid)
14757f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CGF.EmitLValue(Op);
14767f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  else
14777f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CGF.EmitScalarExpr(Op, true);
1478c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson  return llvm::Constant::getNullValue(ConvertType(E->getType()));
147946f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner}
148046f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner
14817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
14827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                           Binary Operators
14837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
14847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
14857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerBinOpInfo ScalarExprEmitter::EmitBinOps(const BinaryOperator *E) {
14867f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
14877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  BinOpInfo Result;
14887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.LHS = Visit(E->getLHS());
14897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.RHS = Visit(E->getRHS());
14901f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  Result.Ty  = E->getType();
14919a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  Result.Opcode = E->getOpcode();
14927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.E = E;
14937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Result;
14947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
14957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
14966a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas GregorLValue ScalarExprEmitter::EmitCompoundAssignLValue(
14976a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                                              const CompoundAssignOperator *E,
14986a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                        Value *(ScalarExprEmitter::*Func)(const BinOpInfo &),
1499d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                                   Value *&Result) {
150054d76db0aa7107597cac0b80d8e138a37e6d1de9Benjamin Kramer  QualType LHSTy = E->getLHS()->getType();
15011f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  BinOpInfo OpInfo;
15026a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
1503ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  if (E->getComputationResultType()->isAnyComplexType()) {
1504db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // This needs to go through the complex expression emitter, but it's a tad
1505db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // complicated to do that... I'm leaving it out for now.  (Note that we do
1506db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // actually need the imaginary part of the RHS for multiplication and
1507db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // division.)
1508ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman    CGF.ErrorUnsupported(E, "complex compound assignment");
1509d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    Result = llvm::UndefValue::get(CGF.ConvertType(E->getType()));
15106a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor    return LValue();
15111f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  }
15126a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
1513cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  // Emit the RHS first.  __block variables need to have the rhs evaluated
1514cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  // first, plus this should improve codegen a little.
1515cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.RHS = Visit(E->getRHS());
1516cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.Ty = E->getComputationResultType();
15179a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  OpInfo.Opcode = E->getOpcode();
1518cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.E = E;
1519ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  // Load/convert the LHS.
1520b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue LHSLV = EmitCheckedLValue(E->getLHS());
1521ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  OpInfo.LHS = EmitLoadOfLValue(LHSLV, LHSTy);
1522ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  OpInfo.LHS = EmitScalarConversion(OpInfo.LHS, LHSTy,
1523ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman                                    E->getComputationLHSType());
15246a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
15251f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  // Expand the binary operator.
1526d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  Result = (this->*Func)(OpInfo);
15276a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
15288c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar  // Convert the result back to the LHS type.
1529ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  Result = EmitScalarConversion(Result, E->getComputationResultType(), LHSTy);
15306a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
1531db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Store the result value into the LHS lvalue. Bit-fields are handled
1532db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // specially because the result is altered by the store, i.e., [C99 6.5.16p1]
1533db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // 'An assignment expression has the value of the left operand after the
1534db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // assignment...'.
1535d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHSLV.isBitField())
1536d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    CGF.EmitStoreThroughBitfieldLValue(RValue::get(Result), LHSLV, LHSTy,
1537d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                       &Result);
1538d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  else
1539ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar    CGF.EmitStoreThroughLValue(RValue::get(Result), LHSLV, LHSTy);
1540d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
15416a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  return LHSLV;
15426a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor}
15436a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
15446a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas GregorValue *ScalarExprEmitter::EmitCompoundAssign(const CompoundAssignOperator *E,
15456a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                      Value *(ScalarExprEmitter::*Func)(const BinOpInfo &)) {
15466a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  bool Ignore = TestAndClearIgnoreResultAssign();
1547d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  Value *RHS;
1548d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  LValue LHS = EmitCompoundAssignLValue(E, Func, RHS);
1549d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1550d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the result is clearly ignored, return now.
15517f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (Ignore)
15527f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return 0;
1553d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1554d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Objective-C property assignment never reloads the value following a store.
1555d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHS.isPropertyRef() || LHS.isKVCRef())
1556d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
1557d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1558d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the lvalue is non-volatile, return the computed value of the assignment.
1559d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (!LHS.isVolatileQualified())
1560d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
1561d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1562d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Otherwise, reload the value.
1563d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  return EmitLoadOfLValue(LHS, E->getType());
15641f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner}
15651f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
15668023030f76d334355b73d9c675d3870858aaf4fdChris Lattnervoid ScalarExprEmitter::EmitUndefinedBehaviorIntegerDivAndRemCheck(
15678023030f76d334355b73d9c675d3870858aaf4fdChris Lattner     					    const BinOpInfo &Ops,
15688023030f76d334355b73d9c675d3870858aaf4fdChris Lattner				     	    llvm::Value *Zero, bool isDiv) {
15698023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn);
15708023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  llvm::BasicBlock *contBB =
15718023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    CGF.createBasicBlock(isDiv ? "div.cont" : "rem.cont", CGF.CurFn);
15728023030f76d334355b73d9c675d3870858aaf4fdChris Lattner
15738023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  const llvm::IntegerType *Ty = cast<llvm::IntegerType>(Zero->getType());
15748023030f76d334355b73d9c675d3870858aaf4fdChris Lattner
15758023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  if (Ops.Ty->hasSignedIntegerRepresentation()) {
15768023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *IntMin =
15778023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      llvm::ConstantInt::get(VMContext,
15788023030f76d334355b73d9c675d3870858aaf4fdChris Lattner                             llvm::APInt::getSignedMinValue(Ty->getBitWidth()));
15798023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *NegOne = llvm::ConstantInt::get(Ty, -1ULL);
15808023030f76d334355b73d9c675d3870858aaf4fdChris Lattner
15818023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *Cond1 = Builder.CreateICmpEQ(Ops.RHS, Zero);
15828023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *LHSCmp = Builder.CreateICmpEQ(Ops.LHS, IntMin);
15838023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *RHSCmp = Builder.CreateICmpEQ(Ops.RHS, NegOne);
15848023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *Cond2 = Builder.CreateAnd(LHSCmp, RHSCmp, "and");
15858023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    Builder.CreateCondBr(Builder.CreateOr(Cond1, Cond2, "or"),
15868023030f76d334355b73d9c675d3870858aaf4fdChris Lattner                         overflowBB, contBB);
15878023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  } else {
15888023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    CGF.Builder.CreateCondBr(Builder.CreateICmpEQ(Ops.RHS, Zero),
15898023030f76d334355b73d9c675d3870858aaf4fdChris Lattner                             overflowBB, contBB);
15908023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  }
15918023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  EmitOverflowBB(overflowBB);
15928023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  Builder.SetInsertPoint(contBB);
15938023030f76d334355b73d9c675d3870858aaf4fdChris Lattner}
15941f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
15957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitDiv(const BinOpInfo &Ops) {
15968023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  if (isTrapvOverflowBehavior()) {
15978023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty));
15988023030f76d334355b73d9c675d3870858aaf4fdChris Lattner
15998023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    if (Ops.Ty->isIntegerType())
16008023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      EmitUndefinedBehaviorIntegerDivAndRemCheck(Ops, Zero, true);
16018023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    else if (Ops.Ty->isRealFloatingType()) {
16028023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow",
16038023030f76d334355b73d9c675d3870858aaf4fdChris Lattner                                                          CGF.CurFn);
16048023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      llvm::BasicBlock *DivCont = CGF.createBasicBlock("div.cont", CGF.CurFn);
16058023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      CGF.Builder.CreateCondBr(Builder.CreateFCmpOEQ(Ops.RHS, Zero),
16068023030f76d334355b73d9c675d3870858aaf4fdChris Lattner                               overflowBB, DivCont);
16078023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      EmitOverflowBB(overflowBB);
16088023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      Builder.SetInsertPoint(DivCont);
16098023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    }
16108023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  }
1611f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  if (Ops.LHS->getType()->isFPOrFPVectorTy())
16127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateFDiv(Ops.LHS, Ops.RHS, "div");
1613f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  else if (Ops.Ty->hasUnsignedIntegerRepresentation())
16147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateUDiv(Ops.LHS, Ops.RHS, "div");
16157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  else
16167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSDiv(Ops.LHS, Ops.RHS, "div");
16177f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
16187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
16197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitRem(const BinOpInfo &Ops) {
16207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Rem in C can't be a floating point type: C99 6.5.5p2.
16218023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  if (isTrapvOverflowBehavior()) {
16228023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty));
16238023030f76d334355b73d9c675d3870858aaf4fdChris Lattner
16248023030f76d334355b73d9c675d3870858aaf4fdChris Lattner    if (Ops.Ty->isIntegerType())
16258023030f76d334355b73d9c675d3870858aaf4fdChris Lattner      EmitUndefinedBehaviorIntegerDivAndRemCheck(Ops, Zero, false);
16268023030f76d334355b73d9c675d3870858aaf4fdChris Lattner  }
16278023030f76d334355b73d9c675d3870858aaf4fdChris Lattner
16281f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  if (Ops.Ty->isUnsignedIntegerType())
16297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateURem(Ops.LHS, Ops.RHS, "rem");
16307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  else
16317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSRem(Ops.LHS, Ops.RHS, "rem");
16327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
16337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
16342add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike StumpValue *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {
16352add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  unsigned IID;
16362add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  unsigned OpID = 0;
16375d8b2cf9fd704f6ca5e33525803a65421c0b440eMike Stump
16389a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  switch (Ops.Opcode) {
16392de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Add:
16402de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_AddAssign:
1641035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 1;
1642035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::sadd_with_overflow;
1643035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
16442de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Sub:
16452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_SubAssign:
1646035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 2;
1647035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::ssub_with_overflow;
1648035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
16492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Mul:
16502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_MulAssign:
1651035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 3;
1652035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::smul_with_overflow;
1653035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
1654035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  default:
1655035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    assert(false && "Unsupported operation for overflow detection");
1656ab4eff620a9ce0ea62cdf29529a66c2c98d116f5Daniel Dunbar    IID = 0;
1657035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  }
1658035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  OpID <<= 1;
1659035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  OpID |= 1;
1660035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump
16612add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  const llvm::Type *opTy = CGF.CGM.getTypes().ConvertType(Ops.Ty);
16622add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
16632add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::Function *intrinsic = CGF.CGM.getIntrinsic(IID, &opTy, 1);
16642add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
16652add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *resultAndOverflow = Builder.CreateCall2(intrinsic, Ops.LHS, Ops.RHS);
16662add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *result = Builder.CreateExtractValue(resultAndOverflow, 0);
16672add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *overflow = Builder.CreateExtractValue(resultAndOverflow, 1);
16682add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
16692add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // Branch in case of overflow.
16707f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  llvm::BasicBlock *initialBB = Builder.GetInsertBlock();
167193a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn);
167293a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  llvm::BasicBlock *continueBB = CGF.createBasicBlock("nooverflow", CGF.CurFn);
16732add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
16742add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.CreateCondBr(overflow, overflowBB, continueBB);
16752add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
167693a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  // Handle overflow with llvm.trap.
16777f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  const std::string *handlerName =
16787f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    &CGF.getContext().getLangOptions().OverflowHandler;
16797f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  if (handlerName->empty()) {
16807f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    EmitOverflowBB(overflowBB);
16817f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    Builder.SetInsertPoint(continueBB);
16827f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    return result;
16837f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  }
16847f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
16857f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // If an overflow handler is set, then we want to call it and then use its
16867f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // result, if it returns.
16877f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  Builder.SetInsertPoint(overflowBB);
16887f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
16897f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // Get the overflow handler.
16907f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  const llvm::Type *Int8Ty = llvm::Type::getInt8Ty(VMContext);
16917f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  std::vector<const llvm::Type*> argTypes;
16927f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  argTypes.push_back(CGF.Int64Ty); argTypes.push_back(CGF.Int64Ty);
16937f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  argTypes.push_back(Int8Ty); argTypes.push_back(Int8Ty);
16947f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  llvm::FunctionType *handlerTy =
16957f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall      llvm::FunctionType::get(CGF.Int64Ty, argTypes, true);
16967f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  llvm::Value *handler = CGF.CGM.CreateRuntimeFunction(handlerTy, *handlerName);
16977f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
16987f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // Sign extend the args to 64-bit, so that we can use the same handler for
16997f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // all types of overflow.
17007f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  llvm::Value *lhs = Builder.CreateSExt(Ops.LHS, CGF.Int64Ty);
17017f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  llvm::Value *rhs = Builder.CreateSExt(Ops.RHS, CGF.Int64Ty);
17027f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
17037f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // Call the handler with the two arguments, the operation, and the size of
17047f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // the result.
17057f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  llvm::Value *handlerResult = Builder.CreateCall4(handler, lhs, rhs,
17067f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall      Builder.getInt8(OpID),
17077f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall      Builder.getInt8(cast<llvm::IntegerType>(opTy)->getBitWidth()));
17087f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
17097f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  // Truncate the result back to the desired size.
17107f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  handlerResult = Builder.CreateTrunc(handlerResult, opTy);
17117f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  Builder.CreateBr(continueBB);
17127f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
17132add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.SetInsertPoint(continueBB);
17147f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  llvm::PHINode *phi = Builder.CreatePHI(opTy);
17157f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  phi->reserveOperandSpace(2);
17167f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  phi->addIncoming(result, initialBB);
17177f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  phi->addIncoming(handlerResult, overflowBB);
17187f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
17197f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  return phi;
17202add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump}
17217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
17227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitAdd(const BinOpInfo &Ops) {
172358f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff  if (!Ops.Ty->isAnyPointerType()) {
1724f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    if (Ops.Ty->hasSignedIntegerRepresentation()) {
1725a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
1726a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Undefined:
1727a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateNSWAdd(Ops.LHS, Ops.RHS, "add");
1728a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Defined:
1729a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
1730a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Trapping:
1731a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return EmitOverflowCheckedBinOp(Ops);
1732a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      }
1733a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    }
1734a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
1735f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
173687415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFAdd(Ops.LHS, Ops.RHS, "add");
1737bf933a0cb628670490c15367b3f5ccb3193354a7Dan Gohman
17387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
17392add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  }
1740daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman
17417f215c12af4c3e7f81b24102a676aabfdb4e1566Chris Lattner  // Must have binary (not unary) expr here.  Unary pointer decrement doesn't
17429a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // use this path.
17439a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const BinaryOperator *BinOp = cast<BinaryOperator>(Ops.E);
17449a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner
174514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (Ops.Ty->isPointerType() &&
17466217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      Ops.Ty->getAs<PointerType>()->isVariableArrayType()) {
1747daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the addition needs to account for the VLA size
17489a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    CGF.ErrorUnsupported(BinOp, "VLA pointer addition");
1749daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  }
17509a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner
17518f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  Value *Ptr, *Idx;
17528f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  Expr *IdxExp;
17539a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const PointerType *PT = BinOp->getLHS()->getType()->getAs<PointerType>();
1754db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  const ObjCObjectPointerType *OPT =
17559a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    BinOp->getLHS()->getType()->getAs<ObjCObjectPointerType>();
175614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (PT || OPT) {
17578f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Ptr = Ops.LHS;
17588f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Idx = Ops.RHS;
17599a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    IdxExp = BinOp->getRHS();
176014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  } else {  // int + pointer
17619a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    PT = BinOp->getRHS()->getType()->getAs<PointerType>();
17629a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    OPT = BinOp->getRHS()->getType()->getAs<ObjCObjectPointerType>();
176314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    assert((PT || OPT) && "Invalid add expr");
17648f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Ptr = Ops.RHS;
17658f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Idx = Ops.LHS;
17669a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    IdxExp = BinOp->getLHS();
17678f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  }
17688f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner
17698f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
17707cabee5b18212bd3106aea8415b044b2b3b43518Sanjiv Gupta  if (Width < CGF.LLVMPointerWidth) {
17718f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    // Zero or sign extend the pointer value based on whether the index is
17728f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    // signed or not.
177377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    const llvm::Type *IdxType = CGF.IntPtrTy;
17749619662a1d42e2008b865d3459c0677e149dad1bChris Lattner    if (IdxExp->getType()->isSignedIntegerType())
17758f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner      Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
17768f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    else
17778f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner      Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
17788f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  }
177914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  const QualType ElementType = PT ? PT->getPointeeType() : OPT->getPointeeType();
1780db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Handle interface types, which are not represented with a concrete type.
1781c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (const ObjCObjectType *OIT = ElementType->getAs<ObjCObjectType>()) {
1782db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    llvm::Value *InterfaceSize =
17834a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson      llvm::ConstantInt::get(Idx->getType(),
1784199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck          CGF.getContext().getTypeSizeInChars(OIT).getQuantity());
17852a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Idx = Builder.CreateMul(Idx, InterfaceSize);
17863c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer    const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
17872a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
17882a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
17892a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    return Builder.CreateBitCast(Res, Ptr->getType());
1790db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
17912a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar
1792db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Explicitly handle GNU void* and function pointer arithmetic extensions. The
1793db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // GNU void* casts amount to no-ops since our void* type is i8*, but this is
1794db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // future proof.
1795b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar  if (ElementType->isVoidType() || ElementType->isFunctionType()) {
17963c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer    const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
1797b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
17982a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
1799b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    return Builder.CreateBitCast(Res, Ptr->getType());
1800db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
1801db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1802664f8934e06cf10de98083b4526aef7bce191a3fDan Gohman  return Builder.CreateInBoundsGEP(Ptr, Idx, "add.ptr");
18037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
18047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
18057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
18062add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  if (!isa<llvm::PointerType>(Ops.LHS->getType())) {
1807f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    if (Ops.Ty->hasSignedIntegerRepresentation()) {
1808a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
1809a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Undefined:
1810a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateNSWSub(Ops.LHS, Ops.RHS, "sub");
1811a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Defined:
1812a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
1813a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Trapping:
1814a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return EmitOverflowCheckedBinOp(Ops);
1815a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      }
1816a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    }
1817a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
1818f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
181987415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFSub(Ops.LHS, Ops.RHS, "sub");
18202eb91e4812d54a1cf634c265a16633a3d3edcf91Chris Lattner
18217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
18222add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  }
18231f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
18249a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // Must have binary (not unary) expr here.  Unary pointer increment doesn't
18259a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // use this path.
18269a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const BinaryOperator *BinOp = cast<BinaryOperator>(Ops.E);
18279a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner
18289a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  if (BinOp->getLHS()->getType()->isPointerType() &&
18299a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner      BinOp->getLHS()->getType()->getAs<PointerType>()->isVariableArrayType()) {
1830daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the addition needs to account for the VLA size for
1831daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // ptr-int
1832daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the division needs to account for the VLA size for
1833daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // ptr-ptr.
18349a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    CGF.ErrorUnsupported(BinOp, "VLA pointer subtraction");
1835daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  }
1836daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman
18379a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const QualType LHSType = BinOp->getLHS()->getType();
183814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  const QualType LHSElementType = LHSType->getPointeeType();
18398c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar  if (!isa<llvm::PointerType>(Ops.RHS->getType())) {
18408c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    // pointer - int
18418c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *Idx = Ops.RHS;
18428c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
18437cabee5b18212bd3106aea8415b044b2b3b43518Sanjiv Gupta    if (Width < CGF.LLVMPointerWidth) {
18448c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      // Zero or sign extend the pointer value based on whether the index is
18458c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      // signed or not.
184677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      const llvm::Type *IdxType = CGF.IntPtrTy;
18479a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner      if (BinOp->getRHS()->getType()->isSignedIntegerType())
18488c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar        Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
18498c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      else
18508c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar        Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
18518c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    }
18528c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Idx = Builder.CreateNeg(Idx, "sub.ptr.neg");
1853b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar
1854db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // Handle interface types, which are not represented with a concrete type.
1855c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (const ObjCObjectType *OIT = LHSElementType->getAs<ObjCObjectType>()) {
1856db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump      llvm::Value *InterfaceSize =
18574a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson        llvm::ConstantInt::get(Idx->getType(),
1858199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                               CGF.getContext().
1859199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                                 getTypeSizeInChars(OIT).getQuantity());
18602a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Idx = Builder.CreateMul(Idx, InterfaceSize);
18613c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
18622a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
18632a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Value *Res = Builder.CreateGEP(LHSCasted, Idx, "add.ptr");
18642a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      return Builder.CreateBitCast(Res, Ops.LHS->getType());
1865db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    }
18662a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar
1867b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    // Explicitly handle GNU void* and function pointer arithmetic
1868db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // extensions. The GNU void* casts amount to no-ops since our void* type is
1869db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // i8*, but this is future proof.
1870b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
18713c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
1872b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
1873b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      Value *Res = Builder.CreateGEP(LHSCasted, Idx, "sub.ptr");
1874b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      return Builder.CreateBitCast(Res, Ops.LHS->getType());
1875db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    }
1876db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1877664f8934e06cf10de98083b4526aef7bce191a3fDan Gohman    return Builder.CreateInBoundsGEP(Ops.LHS, Idx, "sub.ptr");
1878820b03398fdcc8f1f6c60ace55b708e311fa8ce4Daniel Dunbar  } else {
18798c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    // pointer - pointer
18808c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *LHS = Ops.LHS;
18818c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *RHS = Ops.RHS;
1882db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1883199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    CharUnits ElementSize;
1884820b03398fdcc8f1f6c60ace55b708e311fa8ce4Daniel Dunbar
1885e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // Handle GCC extension for pointer arithmetic on void* and function pointer
1886e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // types.
1887e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
1888199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck      ElementSize = CharUnits::One();
18898c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    } else {
1890199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck      ElementSize = CGF.getContext().getTypeSizeInChars(LHSElementType);
18918c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    }
1892db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
18938c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    const llvm::Type *ResultType = ConvertType(Ops.Ty);
18948c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    LHS = Builder.CreatePtrToInt(LHS, ResultType, "sub.ptr.lhs.cast");
18958c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
18968c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *BytesBetween = Builder.CreateSub(LHS, RHS, "sub.ptr.sub");
1897db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1898e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // Optimize out the shift for element size of 1.
1899199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    if (ElementSize.isOne())
1900e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner      return BytesBetween;
1901df1109434abd465a4db2e6f69ec2688866660367Dan Gohman
1902df1109434abd465a4db2e6f69ec2688866660367Dan Gohman    // Otherwise, do a full sdiv. This uses the "exact" form of sdiv, since
1903db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // pointer difference in C is only defined in the case where both operands
1904db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // are pointing to elements of an array.
1905199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    Value *BytesPerElt =
1906199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        llvm::ConstantInt::get(ResultType, ElementSize.getQuantity());
1907df1109434abd465a4db2e6f69ec2688866660367Dan Gohman    return Builder.CreateExactSDiv(BytesBetween, BytesPerElt, "sub.ptr.div");
19087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
19097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
19107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
19117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) {
19127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // LLVM requires the LHS and RHS to be the same type: promote or truncate the
19137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // RHS to the same size as the LHS.
19147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Ops.RHS;
19157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (Ops.LHS->getType() != RHS->getType())
19167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
1917db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1918be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  if (CGF.CatchUndefined
1919be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump      && isa<llvm::IntegerType>(Ops.LHS->getType())) {
1920be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    unsigned Width = cast<llvm::IntegerType>(Ops.LHS->getType())->getBitWidth();
1921be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
1922be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS,
1923be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump                                 llvm::ConstantInt::get(RHS->getType(), Width)),
192415037caa1542bb810ad54c653aeb80f61df7b00cMike Stump                             Cont, CGF.getTrapBB());
1925be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.EmitBlock(Cont);
1926be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  }
1927be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump
19287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateShl(Ops.LHS, RHS, "shl");
19297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
19307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
19317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitShr(const BinOpInfo &Ops) {
19327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // LLVM requires the LHS and RHS to be the same type: promote or truncate the
19337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // RHS to the same size as the LHS.
19347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Ops.RHS;
19357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (Ops.LHS->getType() != RHS->getType())
19367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
1937db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1938be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  if (CGF.CatchUndefined
1939be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump      && isa<llvm::IntegerType>(Ops.LHS->getType())) {
1940be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    unsigned Width = cast<llvm::IntegerType>(Ops.LHS->getType())->getBitWidth();
1941be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
1942be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS,
1943be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump                                 llvm::ConstantInt::get(RHS->getType(), Width)),
194415037caa1542bb810ad54c653aeb80f61df7b00cMike Stump                             Cont, CGF.getTrapBB());
1945be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.EmitBlock(Cont);
1946be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  }
1947be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump
1948f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  if (Ops.Ty->hasUnsignedIntegerRepresentation())
19497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateLShr(Ops.LHS, RHS, "shr");
19507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateAShr(Ops.LHS, RHS, "shr");
19517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
19527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
19537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
19547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                      unsigned SICmpOpc, unsigned FCmpOpc) {
19557f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
19564f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *Result;
19577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  QualType LHSTy = E->getLHS()->getType();
19580bab0cdab751248ca389a5592bcb70eac5d39260John McCall  if (const MemberPointerType *MPT = LHSTy->getAs<MemberPointerType>()) {
19592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    assert(E->getOpcode() == BO_EQ ||
19602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall           E->getOpcode() == BO_NE);
1961d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    Value *LHS = CGF.EmitScalarExpr(E->getLHS());
1962d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    Value *RHS = CGF.EmitScalarExpr(E->getRHS());
19630bab0cdab751248ca389a5592bcb70eac5d39260John McCall    Result = CGF.CGM.getCXXABI().EmitMemberPointerComparison(
19642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                   CGF, LHS, RHS, MPT, E->getOpcode() == BO_NE);
1965b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman  } else if (!LHSTy->isAnyComplexType()) {
19667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *LHS = Visit(E->getLHS());
19677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *RHS = Visit(E->getRHS());
1968db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1969f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (LHS->getType()->isFPOrFPVectorTy()) {
19707a66d7b6c0d84f8c9c74c687a338cf3cf6b9c808Nate Begeman      Result = Builder.CreateFCmp((llvm::CmpInst::Predicate)FCmpOpc,
19717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
1972f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    } else if (LHSTy->hasSignedIntegerRepresentation()) {
1973ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)SICmpOpc,
19747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
19757f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
1976ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      // Unsigned integers and pointers.
1977ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
19787f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
19797f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
19809c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner
19819c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    // If this is a vector comparison, sign extend the result to the appropriate
19829c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    // vector integer type and return it (don't convert to bool).
19839c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    if (LHSTy->isVectorType())
19849c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner      return Builder.CreateSExt(Result, ConvertType(E->getType()), "sext");
1985db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  } else {
19877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    // Complex Comparison: can only be an equality comparison.
19887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    CodeGenFunction::ComplexPairTy LHS = CGF.EmitComplexExpr(E->getLHS());
19897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    CodeGenFunction::ComplexPairTy RHS = CGF.EmitComplexExpr(E->getRHS());
1990db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1991183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    QualType CETy = LHSTy->getAs<ComplexType>()->getElementType();
1992db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19934f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner    Value *ResultR, *ResultI;
19947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    if (CETy->isRealFloatingType()) {
19957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultR = Builder.CreateFCmp((llvm::FCmpInst::Predicate)FCmpOpc,
19967f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.first, RHS.first, "cmp.r");
19977f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultI = Builder.CreateFCmp((llvm::FCmpInst::Predicate)FCmpOpc,
19987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.second, RHS.second, "cmp.i");
19997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
20007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      // Complex comparisons can only be equality comparisons.  As such, signed
20017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      // and unsigned opcodes are the same.
20027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultR = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
20037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.first, RHS.first, "cmp.r");
20047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultI = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
20057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.second, RHS.second, "cmp.i");
20067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
2007db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (E->getOpcode() == BO_EQ) {
20097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      Result = Builder.CreateAnd(ResultR, ResultI, "and.ri");
20107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
20112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      assert(E->getOpcode() == BO_NE &&
20127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner             "Complex comparison other than == or != ?");
20137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      Result = Builder.CreateOr(ResultR, ResultI, "or.ri");
20147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
20157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
201632f6209ea9a5a88ad3f8d7ad5e5b160b403d12daNuno Lopes
201732f6209ea9a5a88ad3f8d7ad5e5b160b403d12daNuno Lopes  return EmitScalarConversion(Result, CGF.getContext().BoolTy, E->getType());
20187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
20197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
20207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {
20217f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool Ignore = TestAndClearIgnoreResultAssign();
20227f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
20237f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // __block variables need to have the rhs evaluated first, plus this should
20247f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // improve codegen just a little.
20257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Visit(E->getRHS());
2026b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue LHS = EmitCheckedLValue(E->getLHS());
2027db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2028ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar  // Store the value into the LHS.  Bit-fields are handled specially
2029371d16f45aeec61c1d07687f763d92137e133642Daniel Dunbar  // because the result is altered by the store, i.e., [C99 6.5.16p1]
2030371d16f45aeec61c1d07687f763d92137e133642Daniel Dunbar  // 'An assignment expression has the value of the left operand after
2031daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  // the assignment...'.
2032d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHS.isBitField())
2033d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    CGF.EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, E->getType(),
2034d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                       &RHS);
2035d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  else
2036ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar    CGF.EmitStoreThroughLValue(RValue::get(RHS), LHS, E->getType());
2037d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
2038d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the result is clearly ignored, return now.
20397f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (Ignore)
20407f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return 0;
2041d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
2042d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Objective-C property assignment never reloads the value following a store.
2043d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHS.isPropertyRef() || LHS.isKVCRef())
2044d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
2045d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
2046d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the lvalue is non-volatile, return the computed value of the assignment.
2047d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (!LHS.isVolatileQualified())
2048d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
2049d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
2050d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Otherwise, reload the value.
20517f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  return EmitLoadOfLValue(LHS, E->getType());
20527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
20537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
20547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {
20557804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  const llvm::Type *ResTy = ConvertType(E->getType());
20567804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner
205720eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 0 && RHS, see if we can elide RHS, if so, just return 0.
205820eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 1 && X, just emit X without inserting the control flow.
205920eb09d562b80420a3328be789547af354bf3e36Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getLHS())) {
206020eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (Cond == 1) { // If we have 1 && X, just emit X.
20610946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner      Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
20627804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      // ZExt result to int or bool.
20637804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "land.ext");
20640946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    }
2065db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20667804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner    // 0 && RHS: If it is safe, just elide the RHS, and return 0/false.
206720eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (!CGF.ContainsLabel(E->getRHS()))
20687804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return llvm::Constant::getNullValue(ResTy);
20690946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  }
2070db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20719615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("land.end");
20729615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *RHSBlock  = CGF.createBasicBlock("land.rhs");
207320eb09d562b80420a3328be789547af354bf3e36Chris Lattner
2074f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Branch on the LHS first.  If it is false, go to the failure (cont) block.
2075f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBranchOnBoolExpr(E->getLHS(), RHSBlock, ContBlock);
2076f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
2077f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Any edges into the ContBlock are now from an (indeterminate number of)
2078f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // edges from this first condition.  All of these values will be false.  Start
2079f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // setting up the PHI node in the Cont Block for this.
20800032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext),
20810032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                            "", ContBlock);
2082f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  PN->reserveOperandSpace(2);  // Normal case, two inputs.
2083f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock);
2084f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner       PI != PE; ++PI)
20853b144ba615c32f3cfa5309060ed5e09c89ac2871Owen Anderson    PN->addIncoming(llvm::ConstantInt::getFalse(VMContext), *PI);
2086db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
208772119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
20887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
20897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
209072119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
2091db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Reaquire the RHS block, as there may be subblocks inserted.
20937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
2094f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
2095f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit an unconditional branch from this block to ContBlock.  Insert an entry
2096f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // into the phi node for the edge with the value of RHSCond.
20977f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(ContBlock);
20987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHSCond, RHSBlock);
2099db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // ZExt result to int.
21017804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  return Builder.CreateZExtOrBitCast(PN, ResTy, "land.ext");
21027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
21037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
21047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) {
21057804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  const llvm::Type *ResTy = ConvertType(E->getType());
21067804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner
210720eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 1 || RHS, see if we can elide RHS, if so, just return 1.
210820eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 0 || X, just emit X without inserting the control flow.
210920eb09d562b80420a3328be789547af354bf3e36Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getLHS())) {
211020eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (Cond == -1) { // If we have 0 || X, just emit X.
21110946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner      Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
21127804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      // ZExt result to int or bool.
21137804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "lor.ext");
21140946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    }
2115db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21167804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner    // 1 || RHS: If it is safe, just elide the RHS, and return 1/true.
211720eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (!CGF.ContainsLabel(E->getRHS()))
21187804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return llvm::ConstantInt::get(ResTy, 1);
21190946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  }
2120db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21219615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("lor.end");
21229615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("lor.rhs");
2123db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2124f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Branch on the LHS first.  If it is true, go to the success (cont) block.
2125f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBranchOnBoolExpr(E->getLHS(), ContBlock, RHSBlock);
2126f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
2127f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Any edges into the ContBlock are now from an (indeterminate number of)
2128f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // edges from this first condition.  All of these values will be true.  Start
2129f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // setting up the PHI node in the Cont Block for this.
21300032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext),
21310032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                            "", ContBlock);
2132f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  PN->reserveOperandSpace(2);  // Normal case, two inputs.
2133f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock);
2134f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner       PI != PE; ++PI)
21353b144ba615c32f3cfa5309060ed5e09c89ac2871Owen Anderson    PN->addIncoming(llvm::ConstantInt::getTrue(VMContext), *PI);
2136f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
213772119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
213833da07db112f4877f6ab13e20db08b9bb86a0c2eAnders Carlsson
2139f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit the RHS condition as a bool value.
21407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
21417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
2142db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
214372119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
2144db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Reaquire the RHS block, as there may be subblocks inserted.
21467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
2147db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2148f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit an unconditional branch from this block to ContBlock.  Insert an entry
2149f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // into the phi node for the edge with the value of RHSCond.
2150f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBlock(ContBlock);
21517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHSCond, RHSBlock);
2152db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // ZExt result to int.
21547804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  return Builder.CreateZExtOrBitCast(PN, ResTy, "lor.ext");
21557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
21567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
21577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinComma(const BinaryOperator *E) {
21587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitStmt(E->getLHS());
2159a448fb2da03ece39978784793eea68760e8205a1Daniel Dunbar  CGF.EnsureInsertPoint();
21607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Visit(E->getRHS());
21617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
21627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
21637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
21647f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                             Other Operators
21657f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
21667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
21679802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// isCheapEnoughToEvaluateUnconditionally - Return true if the specified
21689802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// expression is cheap enough and side-effect-free enough to evaluate
21699802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// unconditionally instead of conditionally.  This is used to convert control
21709802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// flow into selects in some cases.
2171df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stumpstatic bool isCheapEnoughToEvaluateUnconditionally(const Expr *E,
2172df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                                   CodeGenFunction &CGF) {
21739802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (const ParenExpr *PE = dyn_cast<ParenExpr>(E))
2174df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return isCheapEnoughToEvaluateUnconditionally(PE->getSubExpr(), CGF);
2175db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21769802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // TODO: Allow anything we can constant fold to an integer or fp constant.
21779802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (isa<IntegerLiteral>(E) || isa<CharacterLiteral>(E) ||
21789802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner      isa<FloatingLiteral>(E))
21799802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    return true;
2180db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21819802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // Non-volatile automatic variables too, to get "cond ? X : Y" where
21829802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // X and Y are local variables.
21839802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
21849802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2185df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      if (VD->hasLocalStorage() && !(CGF.getContext()
2186df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                     .getCanonicalType(VD->getType())
2187df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                     .isVolatileQualified()))
21889802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner        return true;
2189db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21909802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  return false;
21919802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner}
21929802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner
21939802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner
21947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::
21957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerVisitConditionalOperator(const ConditionalOperator *E) {
21967f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
219731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  // If the condition constant folds and can be elided, try to avoid emitting
219831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  // the condition and the dead arm.
219931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getCond())){
2200c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner    Expr *Live = E->getLHS(), *Dead = E->getRHS();
220131a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    if (Cond == -1)
2202c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner      std::swap(Live, Dead);
2203db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
220431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // If the dead side doesn't have labels we need, and if the Live side isn't
220531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // the gnu missing ?: extension (which we could handle, but don't bother
220631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // to), just emit the Live part.
220731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    if ((!Dead || !CGF.ContainsLabel(Dead)) &&  // No labels in dead part
220831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        Live)                                   // Live part isn't missing.
220931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      return Visit(Live);
2210c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner  }
2211db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
22126155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman  // OpenCL: If the condition is a vector, we can treat this condition like
22136155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman  // the select function.
22146155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman  if (CGF.getContext().getLangOptions().OpenCL
22156155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman      && E->getCond()->getType()->isVectorType()) {
22166155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *CondV = CGF.EmitScalarExpr(E->getCond());
22176155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *LHS = Visit(E->getLHS());
22186155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *RHS = Visit(E->getRHS());
22196155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman
22206155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    const llvm::Type *condType = ConvertType(E->getCond()->getType());
22216155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    const llvm::VectorType *vecTy = cast<llvm::VectorType>(condType);
22226155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman
22236155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    unsigned numElem = vecTy->getNumElements();
22246155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    const llvm::Type *elemType = vecTy->getElementType();
22256155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman
22266155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    std::vector<llvm::Constant*> Zvals;
22276155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    for (unsigned i = 0; i < numElem; ++i)
22286155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman      Zvals.push_back(llvm::ConstantInt::get(elemType,0));
22296155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman
22306155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *zeroVec = llvm::ConstantVector::get(Zvals);
22316155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *TestMSB = Builder.CreateICmpSLT(CondV, zeroVec);
22326155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *tmp = Builder.CreateSExt(TestMSB,
22336155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman                                          llvm::VectorType::get(elemType,
22346155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman                                                                numElem),
22356155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman                                          "sext");
22366155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *tmp2 = Builder.CreateNot(tmp);
22376155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman
22386155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    // Cast float to int to perform ANDs if necessary.
22396155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *RHSTmp = RHS;
22406155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *LHSTmp = LHS;
22416155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    bool wasCast = false;
22426155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    const llvm::VectorType *rhsVTy = cast<llvm::VectorType>(RHS->getType());
22436155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    if (rhsVTy->getElementType()->isFloatTy()) {
22446155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman      RHSTmp = Builder.CreateBitCast(RHS, tmp2->getType());
22456155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman      LHSTmp = Builder.CreateBitCast(LHS, tmp->getType());
22466155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman      wasCast = true;
22476155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    }
22486155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman
22496155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *tmp3 = Builder.CreateAnd(RHSTmp, tmp2);
22506155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *tmp4 = Builder.CreateAnd(LHSTmp, tmp);
22516155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    llvm::Value *tmp5 = Builder.CreateOr(tmp3, tmp4, "cond");
22526155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    if (wasCast)
22536155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman      tmp5 = Builder.CreateBitCast(tmp5, RHS->getType());
2254db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
22556155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman    return tmp5;
22566155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman  }
22576155d73ad1668be5335b1a060f6c49c03d4dca05Nate Begeman
22589802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // If this is a really simple expression (like x ? 4 : 5), emit this as a
22599802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // select instead of as control flow.  We can only do this if it is cheap and
2260531a550531c144a58438f187816abbf1879e1c4eChris Lattner  // safe to evaluate the LHS and RHS unconditionally.
2261df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump  if (E->getLHS() && isCheapEnoughToEvaluateUnconditionally(E->getLHS(),
2262df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                                            CGF) &&
2263df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      isCheapEnoughToEvaluateUnconditionally(E->getRHS(), CGF)) {
22649802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *CondV = CGF.EvaluateExprAsBool(E->getCond());
22659802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *LHS = Visit(E->getLHS());
22669802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *RHS = Visit(E->getRHS());
22679802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    return Builder.CreateSelect(CondV, LHS, RHS, "cond");
22689802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  }
2269db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2270be65abc8e41213ecb951f2f507fb2e13a151d30cDaniel Dunbar  llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
2271be65abc8e41213ecb951f2f507fb2e13a151d30cDaniel Dunbar  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
22729615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
2273af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian
2274db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // If we don't have the GNU missing condition extension, emit a branch on bool
2275db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // the normal way.
227612d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner  if (E->getLHS()) {
227712d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // Otherwise, just use EmitBranchOnBoolExpr to get small and simple code for
227812d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // the branch on bool.
227912d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
228012d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner  } else {
228112d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // Otherwise, for the ?: extension, evaluate the conditional and then
228212d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // convert it to bool the hard way.  We do this explicitly because we need
228312d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // the unconverted value for the missing middle value of the ?:.
2284af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    Expr *save = E->getSAVE();
2285af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    assert(save && "VisitConditionalOperator - save is null");
2286af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    // Intentianlly not doing direct assignment to ConditionalSaveExprs[save] !!
2287af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    Value *SaveVal = CGF.EmitScalarExpr(save);
2288af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    CGF.ConditionalSaveExprs[save] = SaveVal;
2289af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian    Value *CondVal = Visit(E->getCond());
229012d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // In some cases, EmitScalarConversion will delete the "CondVal" expression
229112d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // if there are no extra uses (an optimization).  Inhibit this by making an
229212d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // extra dead use, because we're going to add a use of CondVal later.  We
229312d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // don't use the builder for this, because we don't want it to get optimized
229412d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // away.  This leaves dead code, but the ?: extension isn't common.
229512d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    new llvm::BitCastInst(CondVal, CondVal->getType(), "dummy?:holder",
229612d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner                          Builder.GetInsertBlock());
2297db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2298035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    Value *CondBoolVal =
2299035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner      CGF.EmitScalarConversion(CondVal, E->getCond()->getType(),
2300035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner                               CGF.getContext().BoolTy);
2301035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    Builder.CreateCondBr(CondBoolVal, LHSBlock, RHSBlock);
2302035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner  }
2303fb6fa30a9b06670deb14f862dddbc49a12552939Anders Carlsson
230472119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
23057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(LHSBlock);
2306db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
23077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Handle the GNU extension for missing LHS.
2308af9b96828f9126d993c3e155b8453be62013b735Fariborz Jahanian  Value *LHS = Visit(E->getTrueExpr());
2309db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
231072119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
23117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  LHSBlock = Builder.GetInsertBlock();
2312d57a871339c7c98d58d93108b806f59bdf4e13e2Daniel Dunbar  CGF.EmitBranch(ContBlock);
2313db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
231472119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
23157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
2316db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2317856226c37ff10955c7f3f07ce6fa9522da23a3a5Eli Friedman  Value *RHS = Visit(E->getRHS());
231872119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
23197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
2320d57a871339c7c98d58d93108b806f59bdf4e13e2Daniel Dunbar  CGF.EmitBranch(ContBlock);
2321db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
23227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(ContBlock);
2323db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
232448daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  // If the LHS or RHS is a throw expression, it will be legitimately null.
232548daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  if (!LHS)
232648daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman    return RHS;
232748daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  if (!RHS)
232848daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman    return LHS;
2329db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
23307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Create a PHI node for the real part.
23317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  llvm::PHINode *PN = Builder.CreatePHI(LHS->getType(), "cond");
23327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->reserveOperandSpace(2);
23337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(LHS, LHSBlock);
23347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHS, RHSBlock);
23357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return PN;
23367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
23377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
23387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitChooseExpr(ChooseExpr *E) {
23397976932a1c256d447316ffac58e9821417725e34Eli Friedman  return Visit(E->getChosenSubExpr(CGF.getContext()));
23407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
23417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
23422202bce80fc72d067cbe67dc1512f7b45351fd31Chris LattnerValue *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE) {
23434fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedman  llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr());
2344ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType());
2345ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson
2346ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  // If EmitVAArg fails, we fall back to the LLVM instruction.
2347db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  if (!ArgPtr)
2348ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson    return Builder.CreateVAArg(ArgValue, ConvertType(VE->getType()));
2349ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson
23507f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // FIXME Volatility.
2351ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  return Builder.CreateLoad(ArgPtr);
23527c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
23537c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
2354df6b68c9487aed2042c7fc23db10a79f89083a11Mike StumpValue *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *BE) {
23550892099dbc640720400a1d9decd2733a09d733e5Mike Stump  return CGF.BuildBlockLiteralTmp(BE);
2356df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump}
2357df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump
23587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
23597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                         Entry Point into this File
23607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
23617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
2362db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitScalarExpr - Emit the computation of the specified expression of scalar
2363db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type, ignoring the result.
23647f79f9be5916c51c35da4f126b7c12596a101607Mike StumpValue *CodeGenFunction::EmitScalarExpr(const Expr *E, bool IgnoreResultAssign) {
23657f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  assert(E && !hasAggregateLLVMType(E->getType()) &&
23667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner         "Invalid scalar expression to emit");
2367db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
23687f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  return ScalarExprEmitter(*this, IgnoreResultAssign)
23697f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    .Visit(const_cast<Expr*>(E));
23707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
23713707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
23723707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// EmitScalarConversion - Emit a conversion from the specified type to the
23733707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// specified destination type, both of which are LLVM scalar types.
23744f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *CodeGenFunction::EmitScalarConversion(Value *Src, QualType SrcTy,
23754f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                             QualType DstTy) {
23763707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  assert(!hasAggregateLLVMType(SrcTy) && !hasAggregateLLVMType(DstTy) &&
23773707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner         "Invalid scalar expression to emit");
23783707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  return ScalarExprEmitter(*this).EmitScalarConversion(Src, SrcTy, DstTy);
23793707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner}
23804f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
2381db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitComplexToScalarConversion - Emit a conversion from the specified complex
2382db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type to the specified destination type, where the destination type is an
2383db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// LLVM scalar type.
23844f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *CodeGenFunction::EmitComplexToScalarConversion(ComplexPairTy Src,
23854f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                      QualType SrcTy,
23864f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                      QualType DstTy) {
23879b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  assert(SrcTy->isAnyComplexType() && !hasAggregateLLVMType(DstTy) &&
23884f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner         "Invalid complex -> scalar conversion");
23894f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  return ScalarExprEmitter(*this).EmitComplexToScalarConversion(Src, SrcTy,
23904f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                                DstTy);
23914f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner}
2392cc23acae84c6d5c37b4805edbcd95ee5d821c400Anders Carlsson
23938c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
23948c11a65c18ae607b7073e1e451264492d2297726Chris Lattnerllvm::Value *CodeGenFunction::
23958c11a65c18ae607b7073e1e451264492d2297726Chris LattnerEmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
23968c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                        bool isInc, bool isPre) {
23978c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  return ScalarExprEmitter(*this).EmitScalarPrePostIncDec(E, LV, isInc, isPre);
23988c11a65c18ae607b7073e1e451264492d2297726Chris Lattner}
23998c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2400820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz JahanianLValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
2401820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  llvm::Value *V;
2402820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // object->isa or (*object).isa
2403820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // Generate code as for: *(Class*)object
24045ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  // build Class* type
24055ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  const llvm::Type *ClassPtrTy = ConvertType(E->getType());
24065ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian
2407820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  Expr *BaseExpr = E->getBase();
24085ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  if (BaseExpr->isLvalue(getContext()) != Expr::LV_Valid) {
24095ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    V = CreateTempAlloca(ClassPtrTy, "resval");
24105ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    llvm::Value *Src = EmitScalarExpr(BaseExpr);
24115ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    Builder.CreateStore(Src, V);
24129f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    V = ScalarExprEmitter(*this).EmitLoadOfLValue(
24139f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar      MakeAddrLValue(V, E->getType()), E->getType());
24149f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar  } else {
24159f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    if (E->isArrow())
24169f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar      V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
24179f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    else
24189f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar      V = EmitLValue(BaseExpr).getAddress();
24195ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  }
2420820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian
2421820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // build Class* type
2422820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  ClassPtrTy = ClassPtrTy->getPointerTo();
2423820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  V = Builder.CreateBitCast(V, ClassPtrTy);
24249f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar  return MakeAddrLValue(V, E->getType());
2425820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian}
2426820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian
24276a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
24286a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas GregorLValue CodeGenFunction::EmitCompoundAssignOperatorLValue(
24296a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                                            const CompoundAssignOperator *E) {
24306a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  ScalarExprEmitter Scalar(*this);
2431d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  Value *Result = 0;
24326a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  switch (E->getOpcode()) {
24336a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor#define COMPOUND_OP(Op)                                                       \
24342de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_##Op##Assign:                                                     \
24356a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor      return Scalar.EmitCompoundAssignLValue(E, &ScalarExprEmitter::Emit##Op, \
2436d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                             Result)
24376a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Mul);
24386a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Div);
24396a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Rem);
24406a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Add);
24416a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Sub);
24426a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Shl);
24436a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Shr);
24446a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(And);
24456a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Xor);
24466a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Or);
24476a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor#undef COMPOUND_OP
24486a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
24492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_PtrMemD:
24502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_PtrMemI:
24512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Mul:
24522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Div:
24532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Rem:
24542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Add:
24552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Sub:
24562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shl:
24572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shr:
24582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LT:
24592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_GT:
24602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LE:
24612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_GE:
24622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_EQ:
24632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_NE:
24642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_And:
24652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Xor:
24662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Or:
24672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LAnd:
24682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LOr:
24692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Assign:
24702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Comma:
24716a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor    assert(false && "Not valid compound assignment operators");
24726a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor    break;
24736a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  }
24746a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
24756a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  llvm_unreachable("Unhandled compound assignment operator");
24766a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor}
2477