CGExprScalar.cpp revision 5baba9d98364a3525d6afa15a04cdad82fd6dd30
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
147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "CodeGenFunction.h"
15f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian#include "CGObjCRuntime.h"
167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "CodeGenModule.h"
17de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "clang/AST/ASTContext.h"
1898c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar#include "clang/AST/DeclObjC.h"
1919cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h"
20de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "clang/AST/StmtVisitor.h"
2125ddea7f7835c4b1804e458a5c866cde0097430aChris Lattner#include "clang/Basic/TargetInfo.h"
227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "llvm/Constants.h"
237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#include "llvm/Function.h"
2485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson#include "llvm/GlobalVariable.h"
257c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson#include "llvm/Intrinsics.h"
262add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump#include "llvm/Module.h"
27f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner#include "llvm/Support/CFG.h"
284e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump#include "llvm/Target/TargetData.h"
29c89bf69c9289d2b2305f2c267daacc7312391898Chris Lattner#include <cstdarg>
306aad91a43e26118c824d976661077819265d9bc0Ted Kremenek
317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerusing namespace clang;
327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerusing namespace CodeGen;
337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerusing llvm::Value;
347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                         Scalar Expression Emitter
377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerstruct BinOpInfo {
407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *LHS;
417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS;
421f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  QualType Ty;  // Computation Type.
439a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinaryOperator::Opcode Opcode; // Opcode of BinOp to perform
449a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const Expr *E;      // Entire expr, for error unsupported.  May not be binop.
457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner};
467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnernamespace {
4885b4521e34dcd4a0a4a1f0819e1123128e5a3125Benjamin Kramerclass ScalarExprEmitter
497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  : public StmtVisitor<ScalarExprEmitter, Value*> {
507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CodeGenFunction &CGF;
5145d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar  CGBuilderTy &Builder;
527f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool IgnoreResultAssign;
53a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson  llvm::LLVMContext &VMContext;
547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerpublic:
557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
567f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  ScalarExprEmitter(CodeGenFunction &cgf, bool ira=false)
57db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    : CGF(cgf), Builder(CGF.Builder), IgnoreResultAssign(ira),
58a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson      VMContext(cgf.getLLVMContext()) {
597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
60db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //                               Utilities
637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
647f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
657f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool TestAndClearIgnoreResultAssign() {
669c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    bool I = IgnoreResultAssign;
679c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    IgnoreResultAssign = false;
689c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    return I;
699c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner  }
707f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  const llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); }
727f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); }
73b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue EmitCheckedLValue(const Expr *E) { return CGF.EmitCheckedLValue(E); }
747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
757f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitLoadOfLValue(LValue LV, QualType T) {
769b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return CGF.EmitLoadOfLValue(LV, T).getScalarVal();
777f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
78db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
797f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// EmitLoadOfLValue - Given an expression with complex type that represents a
807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// value l-value, this method emits the address of the l-value, then loads
817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// and returns the result.
827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitLoadOfLValue(const Expr *E) {
83b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump    return EmitLoadOfLValue(EmitCheckedLValue(E), E->getType());
847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
85db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
869abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  /// EmitConversionToBool - Convert the specified expression value to a
873420d0de2c52fedf771d7ef20522f6080233e377Chris Lattner  /// boolean (i1) truth value.  This is equivalent to "Val != 0".
889abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  Value *EmitConversionToBool(Value *Src, QualType DstTy);
89db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
903707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// EmitScalarConversion - Emit a conversion from the specified type to the
913707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// specified destination type, both of which are LLVM scalar types.
924f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *EmitScalarConversion(Value *Src, QualType SrcTy, QualType DstTy);
934f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
944f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  /// EmitComplexToScalarConversion - Emit a conversion from the specified
95db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  /// complex type to the specified destination type, where the destination type
96db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  /// is an LLVM scalar type.
974f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *EmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
984f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                       QualType SrcTy, QualType DstTy);
99df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump
100a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  /// EmitNullValue - Emit a value that corresponds to null for the given type.
101a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  Value *EmitNullValue(QualType Ty);
102a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson
1037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
1047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //                            Visitor Methods
1057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
1067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitStmt(Stmt *S) {
1087a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek    S->dump(CGF.getContext().getSourceManager());
1097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    assert(0 && "Stmt can't have complex result type!");
1107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return 0;
1117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitExpr(Expr *S);
113f51dc64f90851f636302dbaaf3f52c0524cdac36Fariborz Jahanian
1147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr()); }
1157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Leaves.
1177f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitIntegerLiteral(const IntegerLiteral *E) {
1184a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(VMContext, E->getValue());
1197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitFloatingLiteral(const FloatingLiteral *E) {
121bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson    return llvm::ConstantFP::get(VMContext, E->getValue());
1227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitCharacterLiteral(const CharacterLiteral *E) {
1244a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
125e7579b57eb3eabfd3545b86320fb67466730e9fcNate Begeman  }
126e7579b57eb3eabfd3545b86320fb67466730e9fcNate Begeman  Value *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
1274a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
1287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
129ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  Value *VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E) {
130a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson    return EmitNullValue(E->getType());
1317267f7832e5f0c7f951765e201c5a2650eb1637bArgyrios Kyrtzidis  }
1323f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  Value *VisitGNUNullExpr(const GNUNullExpr *E) {
133a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson    return EmitNullValue(E->getType());
1343f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
1357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
1364a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()),
137ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff                                  CGF.getContext().typesAreCompatible(
138ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff                                    E->getArgType1(), E->getArgType2()));
1397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1400027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  Value *VisitOffsetOfExpr(OffsetOfExpr *E);
1410518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  Value *VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
1420ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar  Value *VisitAddrLabelExpr(const AddrLabelExpr *E) {
143d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    llvm::Value *V = CGF.GetAddrOfLabel(E->getLabel());
144d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    return Builder.CreateBitCast(V, ConvertType(E->getType()));
1450ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar  }
146db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // l-values.
1487f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitDeclRefExpr(DeclRefExpr *E) {
14928665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    Expr::EvalResult Result;
15028665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    if (E->Evaluate(Result, CGF.getContext()) && Result.Val.isInt()) {
15128665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      assert(!Result.HasSideEffects && "Constant declref with side-effect?!");
15225c2c8fb9309050612009a6571e2660e75531348Devang Patel      llvm::ConstantInt *CI
15325c2c8fb9309050612009a6571e2660e75531348Devang Patel        = llvm::ConstantInt::get(VMContext, Result.Val.getInt());
15425c2c8fb9309050612009a6571e2660e75531348Devang Patel      CGF.EmitDeclRefExprDbgValue(E, CI);
15525c2c8fb9309050612009a6571e2660e75531348Devang Patel      return CI;
15628665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    }
1577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLoadOfLValue(E);
1587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
159db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
160db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    return CGF.EmitObjCSelectorExpr(E);
1619c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
162db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
163db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    return CGF.EmitObjCProtocolExpr(E);
1649c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
165db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1669c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar    return EmitLoadOfLValue(E);
1679c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
1680a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar  Value *VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
16985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar    return EmitLoadOfLValue(E);
1709c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
17109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian  Value *VisitObjCImplicitSetterGetterRefExpr(
17209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                        ObjCImplicitSetterGetterRefExpr *E) {
17343f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian    return EmitLoadOfLValue(E);
17443f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian  }
1759c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  Value *VisitObjCMessageExpr(ObjCMessageExpr *E) {
1769c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar    return CGF.EmitObjCMessageExpr(E).getScalarVal();
1770a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar  }
1780a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar
17983dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian  Value *VisitObjCIsaExpr(ObjCIsaExpr *E) {
180820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian    LValue LV = CGF.EmitObjCIsaExpr(E);
181820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian    Value *V = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
18283dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian    return V;
18383dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian  }
18483dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian
1857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
186d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value *VisitShuffleVectorExpr(ShuffleVectorExpr *E);
18728665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  Value *VisitMemberExpr(MemberExpr *E);
188213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  Value *VisitExtVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); }
189be20bb558cae5352898e6a913e29d24d20134841Chris Lattner  Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
190be20bb558cae5352898e6a913e29d24d20134841Chris Lattner    return EmitLoadOfLValue(E);
191be20bb558cae5352898e6a913e29d24d20134841Chris Lattner  }
19235634f5ed67966c9f1fde38420e79cc6515cd673Devang Patel
1930533b3020ca39898751d4200feed776861dcd1ceNate Begeman  Value *VisitInitListExpr(InitListExpr *E);
194db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1953498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  Value *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
1963cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson    return CGF.CGM.EmitNullConstant(E->getType());
1973498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  }
198d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Value *VisitCastExpr(CastExpr *E) {
199c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman    // Make sure to evaluate VLA bounds now so that we have them for later.
200c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman    if (E->getType()->isVariablyModifiedType())
201c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman      CGF.EmitVLASize(E->getType());
202c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman
203592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson    return EmitCastExpr(E);
2047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
205d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Value *EmitCastExpr(CastExpr *E);
2067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
2077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitCallExpr(const CallExpr *E) {
208e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson    if (E->getCallReturnType()->isReferenceType())
209e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson      return EmitLoadOfLValue(E);
210db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2119b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return CGF.EmitCallExpr(E).getScalarVal();
2127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2138f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar
2143379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner  Value *VisitStmtExpr(const StmtExpr *E);
2154e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump
216a99038c0757a836c6faeeddaa5dfd249b32f6e9eMike Stump  Value *VisitBlockDeclRefExpr(const BlockDeclRefExpr *E);
217db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Unary Operators.
2197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPostDec(const UnaryOperator *E) {
2208c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2218c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, false, false);
2227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPostInc(const UnaryOperator *E) {
2248c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2258c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, true, false);
2267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPreDec(const UnaryOperator *E) {
2288c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2298c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, false, true);
2307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPreInc(const UnaryOperator *E) {
2328c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    LValue LV = EmitLValue(E->getSubExpr());
2338c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    return EmitScalarPrePostIncDec(E, LV, true, true);
2347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2358c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2368c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  llvm::Value *EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
2378c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                                       bool isInc, bool isPre);
2388c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2398c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryAddrOf(const UnaryOperator *E) {
241d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // If the sub-expression is an instance member reference,
242d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // EmitDeclRefLValue will magically emit it with the appropriate
243d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // value as the "address".
2447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLValue(E->getSubExpr()).getAddress();
2457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
2477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPlus(const UnaryOperator *E) {
2487f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    // This differs from gcc, though, most likely due to a bug in gcc.
2497f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    TestAndClearIgnoreResultAssign();
2507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Visit(E->getSubExpr());
2517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryMinus    (const UnaryOperator *E);
2537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryNot      (const UnaryOperator *E);
2547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryLNot     (const UnaryOperator *E);
25546f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Value *VisitUnaryReal     (const UnaryOperator *E);
25646f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Value *VisitUnaryImag     (const UnaryOperator *E);
2577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryExtension(const UnaryOperator *E) {
2587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Visit(E->getSubExpr());
2597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
2615f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson  // C++
26204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  Value *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
26304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    return Visit(DAE->getExpr());
26404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  }
2655f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson  Value *VisitCXXThisExpr(CXXThisExpr *TE) {
2665f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson    return CGF.LoadCXXThis();
267db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
268db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2697f6ad153565245026c7569314f65a4d4ff4ac41fAnders Carlsson  Value *VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
2703082463f4f387b725f4e4bf7d7b46269d445e4f5Anders Carlsson    return CGF.EmitCXXExprWithTemporaries(E).getScalarVal();
2717f6ad153565245026c7569314f65a4d4ff4ac41fAnders Carlsson  }
272a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson  Value *VisitCXXNewExpr(const CXXNewExpr *E) {
273a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson    return CGF.EmitCXXNewExpr(E);
274a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson  }
27560e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson  Value *VisitCXXDeleteExpr(const CXXDeleteExpr *E) {
27660e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson    CGF.EmitCXXDeleteExpr(E);
27760e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson    return 0;
27860e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson  }
2799dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman  Value *VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
2809dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman    return llvm::ConstantInt::get(Builder.getInt1Ty(),
2819dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman                                  E->EvaluateTrait(CGF.getContext()));
2829dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman  }
283db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
284a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  Value *VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E) {
285a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    // C++ [expr.pseudo]p1:
286db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    //   The result shall only be used as the operand for the function call
287a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   operator (), and the result of such a call has type void. The only
288a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   effect is the evaluation of the postfix-expression before the dot or
289a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   arrow.
290a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CGF.EmitScalarExpr(E->getBase());
291a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return 0;
292a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
293db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
294c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson  Value *VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) {
295a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson    return EmitNullValue(E->getType());
296c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson  }
297756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson
298756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson  Value *VisitCXXThrowExpr(const CXXThrowExpr *E) {
299756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson    CGF.EmitCXXThrowExpr(E);
300756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson    return 0;
301756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson  }
302756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson
3037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Binary Operators.
3047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitMul(const BinOpInfo &Ops) {
305f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    if (Ops.Ty->hasSignedIntegerRepresentation()) {
306a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
307a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Undefined:
308a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateNSWMul(Ops.LHS, Ops.RHS, "mul");
309a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Defined:
310a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul");
311a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Trapping:
312a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return EmitOverflowCheckedBinOp(Ops);
313a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      }
314a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    }
315a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
316f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
31787415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFMul(Ops.LHS, Ops.RHS, "mul");
3187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul");
3197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3202add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  /// Create a binary op that checks for overflow.
3212add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  /// Currently only supports +, - and *.
3222add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *EmitOverflowCheckedBinOp(const BinOpInfo &Ops);
3237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitDiv(const BinOpInfo &Ops);
3247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitRem(const BinOpInfo &Ops);
3257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitAdd(const BinOpInfo &Ops);
3267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitSub(const BinOpInfo &Ops);
3277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitShl(const BinOpInfo &Ops);
3287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitShr(const BinOpInfo &Ops);
3297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitAnd(const BinOpInfo &Ops) {
3307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateAnd(Ops.LHS, Ops.RHS, "and");
3317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitXor(const BinOpInfo &Ops) {
3337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateXor(Ops.LHS, Ops.RHS, "xor");
3347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitOr (const BinOpInfo &Ops) {
3367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateOr(Ops.LHS, Ops.RHS, "or");
3377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
3391f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  BinOpInfo EmitBinOps(const BinaryOperator *E);
3406a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E,
3416a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                            Value *(ScalarExprEmitter::*F)(const BinOpInfo &),
342d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                  Value *&Result);
3436a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
3443ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *EmitCompoundAssign(const CompoundAssignOperator *E,
3451f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner                            Value *(ScalarExprEmitter::*F)(const BinOpInfo &));
3461f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
3471f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  // Binary operators and binary compound assignment operators.
3481f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner#define HANDLEBINOP(OP) \
3493ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *VisitBin ## OP(const BinaryOperator *E) {                         \
3503ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner    return Emit ## OP(EmitBinOps(E));                                      \
3513ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  }                                                                        \
3523ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *VisitBin ## OP ## Assign(const CompoundAssignOperator *E) {       \
3533ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner    return EmitCompoundAssign(E, &ScalarExprEmitter::Emit ## OP);          \
3541f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  }
3557177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Mul)
3567177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Div)
3577177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Rem)
3587177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Add)
3597177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Sub)
3607177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Shl)
3617177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Shr)
3627177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(And)
3637177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Xor)
3647177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Or)
3651f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner#undef HANDLEBINOP
3668c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar
3677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Comparisons.
3687f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitCompare(const BinaryOperator *E, unsigned UICmpOpc,
3697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                     unsigned SICmpOpc, unsigned FCmpOpc);
3707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#define VISITCOMP(CODE, UI, SI, FP) \
3717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *VisitBin##CODE(const BinaryOperator *E) { \
3727f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      return EmitCompare(E, llvm::ICmpInst::UI, llvm::ICmpInst::SI, \
3737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                         llvm::FCmpInst::FP); }
3747177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(LT, ICMP_ULT, ICMP_SLT, FCMP_OLT)
3757177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(GT, ICMP_UGT, ICMP_SGT, FCMP_OGT)
3767177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(LE, ICMP_ULE, ICMP_SLE, FCMP_OLE)
3777177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(GE, ICMP_UGE, ICMP_SGE, FCMP_OGE)
3787177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(EQ, ICMP_EQ , ICMP_EQ , FCMP_OEQ)
3797177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(NE, ICMP_NE , ICMP_NE , FCMP_UNE)
3807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#undef VISITCOMP
381db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
3827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinAssign     (const BinaryOperator *E);
3837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
3847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinLAnd       (const BinaryOperator *E);
3857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinLOr        (const BinaryOperator *E);
3867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinComma      (const BinaryOperator *E);
3877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
38825b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman  Value *VisitBinPtrMemD(const Expr *E) { return EmitLoadOfLValue(E); }
38925b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman  Value *VisitBinPtrMemI(const Expr *E) { return EmitLoadOfLValue(E); }
39025b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman
3917f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Other Operators.
392df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump  Value *VisitBlockExpr(const BlockExpr *BE);
3937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitConditionalOperator(const ConditionalOperator *CO);
3947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitChooseExpr(ChooseExpr *CE);
3957c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  Value *VisitVAArgExpr(VAArgExpr *VE);
3967f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitObjCStringLiteral(const ObjCStringLiteral *E) {
3977f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return CGF.EmitObjCStringLiteral(E);
3987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner};
4007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}  // end anonymous namespace.
4017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
4027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
4037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                                Utilities
4047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
4057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
4069abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner/// EmitConversionToBool - Convert the specified expression value to a
4073420d0de2c52fedf771d7ef20522f6080233e377Chris Lattner/// boolean (i1) truth value.  This is equivalent to "Val != 0".
4089abc84e7ac4db891209fe67cc3a8c9690dc886efChris LattnerValue *ScalarExprEmitter::EmitConversionToBool(Value *Src, QualType SrcType) {
409467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(SrcType.isCanonical() && "EmitScalarConversion strips typedefs");
410db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4119abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  if (SrcType->isRealFloatingType()) {
4129abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    // Compare against 0.0 for fp scalars.
413c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson    llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
4149abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    return Builder.CreateFCmpUNE(Src, Zero, "tobool");
4159abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  }
416db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4170bab0cdab751248ca389a5592bcb70eac5d39260John McCall  if (const MemberPointerType *MPT = dyn_cast<MemberPointerType>(SrcType))
4180bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitMemberPointerIsNotNull(CGF, Src, MPT);
419db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
420d1d66bcd6914ff82abdfa88dd25bb0b74cde3b99Daniel Dunbar  assert((SrcType->isIntegerType() || isa<llvm::PointerType>(Src->getType())) &&
4219abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner         "Unknown scalar type to convert");
422db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4239abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Because of the type rules of C, we often end up computing a logical value,
4249abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // then zero extending it to int, then wanting it as a logical value again.
4259abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Optimize this common case.
4269abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  if (llvm::ZExtInst *ZI = dyn_cast<llvm::ZExtInst>(Src)) {
4270032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    if (ZI->getOperand(0)->getType() ==
4280032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson        llvm::Type::getInt1Ty(CGF.getLLVMContext())) {
4299abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner      Value *Result = ZI->getOperand(0);
430356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // If there aren't any more uses, zap the instruction to save space.
431356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // Note that there can be more uses, for example if this
432356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // is the result of an assignment.
433356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      if (ZI->use_empty())
434356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman        ZI->eraseFromParent();
4359abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner      return Result;
4369abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    }
4379abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  }
438db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4399abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Compare against an integer or pointer null.
440c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson  llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
4419abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  return Builder.CreateICmpNE(Src, Zero, "tobool");
4429abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner}
4439abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner
4443707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// EmitScalarConversion - Emit a conversion from the specified type to the
4453707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// specified destination type, both of which are LLVM scalar types.
4464f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
4474f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                               QualType DstType) {
4489619662a1d42e2008b865d3459c0677e149dad1bChris Lattner  SrcType = CGF.getContext().getCanonicalType(SrcType);
4499619662a1d42e2008b865d3459c0677e149dad1bChris Lattner  DstType = CGF.getContext().getCanonicalType(DstType);
4503707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (SrcType == DstType) return Src;
451db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
452cf289083ab007264fa3ea96d92f133339aee5d2dChris Lattner  if (DstType->isVoidType()) return 0;
453db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4543707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Handle conversions to bool first, they are special: comparisons against 0.
455ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  if (DstType->isBooleanType())
456ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    return EmitConversionToBool(Src, SrcType);
457db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4583707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  const llvm::Type *DstTy = ConvertType(DstType);
4593707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
4603707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Ignore conversions like int -> uint.
4613707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (Src->getType() == DstTy)
4623707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    return Src;
4633707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
464db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Handle pointer conversions next: pointers can only be converted to/from
465db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // other pointers and integers. Check for pointer types in terms of LLVM, as
466db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // some native types (like Obj-C id) may map to a pointer type.
467270cc66683b22d6bb0b4644f5a40f84d45edf119Daniel Dunbar  if (isa<llvm::PointerType>(DstTy)) {
4683707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // The source value may be an integer, or a pointer.
469191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    if (isa<llvm::PointerType>(Src->getType()))
4703707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner      return Builder.CreateBitCast(Src, DstTy, "conv");
471191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
4723707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    assert(SrcType->isIntegerType() && "Not ptr->ptr or int->ptr conversion?");
47325615424741bcce31fe52c896f76268f0307f00dEli Friedman    // First, convert to the correct width so that we control the kind of
47425615424741bcce31fe52c896f76268f0307f00dEli Friedman    // extension.
47577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    const llvm::Type *MiddleTy = CGF.IntPtrTy;
47625615424741bcce31fe52c896f76268f0307f00dEli Friedman    bool InputSigned = SrcType->isSignedIntegerType();
47725615424741bcce31fe52c896f76268f0307f00dEli Friedman    llvm::Value* IntResult =
47825615424741bcce31fe52c896f76268f0307f00dEli Friedman        Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
47925615424741bcce31fe52c896f76268f0307f00dEli Friedman    // Then, cast to pointer.
48025615424741bcce31fe52c896f76268f0307f00dEli Friedman    return Builder.CreateIntToPtr(IntResult, DstTy, "conv");
4813707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
482db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
483270cc66683b22d6bb0b4644f5a40f84d45edf119Daniel Dunbar  if (isa<llvm::PointerType>(Src->getType())) {
4843707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // Must be an ptr to int cast.
4853707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?");
48650b5a30db40322880340e957ad7d6d8d60bb4c5bAnders Carlsson    return Builder.CreatePtrToInt(Src, DstTy, "conv");
4873707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
488db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
489213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // A scalar can be splatted to an extended vector of the same element type
4902ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  if (DstType->isExtVectorType() && !SrcType->isVectorType()) {
4916fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Cast the scalar to element type
492183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    QualType EltTy = DstType->getAs<ExtVectorType>()->getElementType();
4936fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::Value *Elt = EmitScalarConversion(Src, SrcType, EltTy);
4946fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman
4956fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Insert the element in element zero of an undef vector
49603e205031b08669f05c41eed5b896fc94c4a12bbOwen Anderson    llvm::Value *UnV = llvm::UndefValue::get(DstTy);
49777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    llvm::Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, 0);
4986fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp");
4996fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman
5006fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Splat the element across to all elements
5016fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::SmallVector<llvm::Constant*, 16> Args;
5026fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();
5036fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    for (unsigned i = 0; i < NumElements; i++)
50477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 0));
505db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5064a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], NumElements);
5076fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::Value *Yay = Builder.CreateShuffleVector(UnV, UnV, Mask, "splat");
5086fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    return Yay;
5096fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman  }
5104119d1aeca8016654d381ce079864058d1709571Nate Begeman
5113b1ae004d0ee88fc029dad876ec5695f178ef3f6Chris Lattner  // Allow bitcast from vector to integer/fp of the same size.
5127019a9ea3f5d6f8cdf5e2e31f74b4df53e3ffcddAnders Carlsson  if (isa<llvm::VectorType>(Src->getType()) ||
5133b1ae004d0ee88fc029dad876ec5695f178ef3f6Chris Lattner      isa<llvm::VectorType>(DstTy))
5147019a9ea3f5d6f8cdf5e2e31f74b4df53e3ffcddAnders Carlsson    return Builder.CreateBitCast(Src, DstTy, "conv");
515db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5163707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Finally, we have the arithmetic types: real int/float.
5173707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (isa<llvm::IntegerType>(Src->getType())) {
5183707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    bool InputSigned = SrcType->isSignedIntegerType();
519b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    if (isa<llvm::IntegerType>(DstTy))
520b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateIntCast(Src, DstTy, InputSigned, "conv");
521b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else if (InputSigned)
522b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateSIToFP(Src, DstTy, "conv");
523b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else
524b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateUIToFP(Src, DstTy, "conv");
5253707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
526db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
527f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  assert(Src->getType()->isFloatingPointTy() && "Unknown real conversion");
5283707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (isa<llvm::IntegerType>(DstTy)) {
529b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    if (DstType->isSignedIntegerType())
530b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateFPToSI(Src, DstTy, "conv");
531b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else
532b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateFPToUI(Src, DstTy, "conv");
5333707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
5343707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
535f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  assert(DstTy->isFloatingPointTy() && "Unknown real conversion");
536b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson  if (DstTy->getTypeID() < Src->getType()->getTypeID())
537b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    return Builder.CreateFPTrunc(Src, DstTy, "conv");
538b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson  else
539b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    return Builder.CreateFPExt(Src, DstTy, "conv");
5403707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner}
5413707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
542db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitComplexToScalarConversion - Emit a conversion from the specified complex
543db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type to the specified destination type, where the destination type is an
544db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// LLVM scalar type.
5454f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *ScalarExprEmitter::
5464f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerEmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
5474f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                              QualType SrcTy, QualType DstTy) {
548ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  // Get the source element type.
549183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  SrcTy = SrcTy->getAs<ComplexType>()->getElementType();
550db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
551ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  // Handle conversions to bool first, they are special: comparisons against 0.
552ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  if (DstTy->isBooleanType()) {
553ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    //  Complex != 0  -> (Real != 0) | (Imag != 0)
554ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    Src.first  = EmitScalarConversion(Src.first, SrcTy, DstTy);
555ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    Src.second = EmitScalarConversion(Src.second, SrcTy, DstTy);
556ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    return Builder.CreateOr(Src.first, Src.second, "tobool");
557ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  }
558db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5594f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // C99 6.3.1.7p2: "When a value of complex type is converted to a real type,
5604f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // the imaginary part of the complex value is discarded and the value of the
5614f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // real part is converted according to the conversion rules for the
562db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // corresponding real type.
5634f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  return EmitScalarConversion(Src.first, SrcTy, DstTy);
5644f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner}
5654f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
566a40a9f31218c743e366322e34b59f0d4d4414198Anders CarlssonValue *ScalarExprEmitter::EmitNullValue(QualType Ty) {
5670bab0cdab751248ca389a5592bcb70eac5d39260John McCall  if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>())
5680bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitNullMemberPointer(MPT);
5690bab0cdab751248ca389a5592bcb70eac5d39260John McCall
5700bab0cdab751248ca389a5592bcb70eac5d39260John McCall  return llvm::Constant::getNullValue(ConvertType(Ty));
571a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson}
5724f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
5737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
5747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                            Visitor Methods
5757f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
5767f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
5777f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitExpr(Expr *E) {
578488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar  CGF.ErrorUnsupported(E, "scalar expression");
5797f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (E->getType()->isVoidType())
5807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return 0;
58103e205031b08669f05c41eed5b896fc94c4a12bbOwen Anderson  return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
5827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
5837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
584d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanValue *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
58537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  // Vector Mask Case
58637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  if (E->getNumSubExprs() == 2 ||
5873f4cb120fe574f7b80864f52a1999502a4f3a83dRafael Espindola      (E->getNumSubExprs() == 3 && E->getExpr(2)->getType()->isVectorType())) {
58877b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *LHS = CGF.EmitScalarExpr(E->getExpr(0));
58977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *RHS = CGF.EmitScalarExpr(E->getExpr(1));
59077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *Mask;
59137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
59237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *LTy = cast<llvm::VectorType>(LHS->getType());
59337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    unsigned LHSElts = LTy->getNumElements();
59437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
59537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    if (E->getNumSubExprs() == 3) {
59637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Mask = CGF.EmitScalarExpr(E->getExpr(2));
59737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
59837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      // Shuffle LHS & RHS into one input vector.
59937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      llvm::SmallVector<llvm::Constant*, 32> concat;
60037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      for (unsigned i = 0; i != LHSElts; ++i) {
60177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        concat.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 2*i));
60277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        concat.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 2*i+1));
60337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      }
60437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
60537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Value* CV = llvm::ConstantVector::get(concat.begin(), concat.size());
60637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      LHS = Builder.CreateShuffleVector(LHS, RHS, CV, "concat");
60737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      LHSElts *= 2;
60837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    } else {
60937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Mask = RHS;
61037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    }
61137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
61237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *MTy = cast<llvm::VectorType>(Mask->getType());
61337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    llvm::Constant* EltMask;
61437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
61537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // Treat vec3 like vec4.
61637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    if ((LHSElts == 6) && (E->getNumSubExprs() == 3))
61737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      EltMask = llvm::ConstantInt::get(MTy->getElementType(),
61837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                       (1 << llvm::Log2_32(LHSElts+2))-1);
61937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    else if ((LHSElts == 3) && (E->getNumSubExprs() == 2))
62037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      EltMask = llvm::ConstantInt::get(MTy->getElementType(),
62137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                       (1 << llvm::Log2_32(LHSElts+1))-1);
62237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    else
62337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      EltMask = llvm::ConstantInt::get(MTy->getElementType(),
62437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                       (1 << llvm::Log2_32(LHSElts))-1);
62537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
62637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // Mask off the high bits of each shuffle index.
62737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    llvm::SmallVector<llvm::Constant *, 32> MaskV;
62837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    for (unsigned i = 0, e = MTy->getNumElements(); i != e; ++i)
62937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      MaskV.push_back(EltMask);
63037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
63137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    Value* MaskBits = llvm::ConstantVector::get(MaskV.begin(), MaskV.size());
63237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    Mask = Builder.CreateAnd(Mask, MaskBits, "mask");
63337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
63437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // newv = undef
63537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // mask = mask & maskbits
63637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    // for each elt
63737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    //   n = extract mask i
63837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    //   x = extract val n
63937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    //   newv = insert newv, x, i
64037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *RTy = llvm::VectorType::get(LTy->getElementType(),
64137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                                        MTy->getNumElements());
64237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    Value* NewV = llvm::UndefValue::get(RTy);
64337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    for (unsigned i = 0, e = MTy->getNumElements(); i != e; ++i) {
64477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Value *Indx = llvm::ConstantInt::get(CGF.Int32Ty, i);
64537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Indx = Builder.CreateExtractElement(Mask, Indx, "shuf_idx");
64677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Indx = Builder.CreateZExt(Indx, CGF.Int32Ty, "idx_zext");
64737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
64837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      // Handle vec3 special since the index will be off by one for the RHS.
64937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      if ((LHSElts == 6) && (E->getNumSubExprs() == 3)) {
65037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        Value *cmpIndx, *newIndx;
65177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        cmpIndx = Builder.CreateICmpUGT(Indx,
65277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner                                        llvm::ConstantInt::get(CGF.Int32Ty, 3),
65337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                        "cmp_shuf_idx");
65477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        newIndx = Builder.CreateSub(Indx, llvm::ConstantInt::get(CGF.Int32Ty,1),
65537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman                                    "shuf_idx_adj");
65637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        Indx = Builder.CreateSelect(cmpIndx, newIndx, Indx, "sel_shuf_idx");
65737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      }
65837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      Value *VExt = Builder.CreateExtractElement(LHS, Indx, "shuf_elt");
65937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      NewV = Builder.CreateInsertElement(NewV, VExt, Indx, "shuf_ins");
66037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    }
66137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    return NewV;
662d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
66337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
664d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value* V1 = CGF.EmitScalarExpr(E->getExpr(0));
665d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value* V2 = CGF.EmitScalarExpr(E->getExpr(1));
66637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
66737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  // Handle vec3 special since the index will be off by one for the RHS.
66837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  llvm::SmallVector<llvm::Constant*, 32> indices;
66937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  for (unsigned i = 2; i < E->getNumSubExprs(); i++) {
67037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    llvm::Constant *C = cast<llvm::Constant>(CGF.EmitScalarExpr(E->getExpr(i)));
67137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    const llvm::VectorType *VTy = cast<llvm::VectorType>(V1->getType());
67237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    if (VTy->getNumElements() == 3) {
67337b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      if (llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C)) {
67437b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        uint64_t cVal = CI->getZExtValue();
67537b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        if (cVal > 3) {
67637b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman          C = llvm::ConstantInt::get(C->getType(), cVal-1);
67737b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman        }
67837b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman      }
67937b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    }
68037b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman    indices.push_back(C);
68137b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman  }
68237b6a5731a47f811d754f0d48aa93edf30e30513Nate Begeman
6834a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson  Value* SV = llvm::ConstantVector::get(indices.begin(), indices.size());
684d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  return Builder.CreateShuffleVector(V1, V2, SV, "shuffle");
685d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}
68628665272c36cccb1014a6ea1217354b0519e2b59Eli FriedmanValue *ScalarExprEmitter::VisitMemberExpr(MemberExpr *E) {
68728665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  Expr::EvalResult Result;
68828665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  if (E->Evaluate(Result, CGF.getContext()) && Result.Val.isInt()) {
68928665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    if (E->isArrow())
69028665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      CGF.EmitScalarExpr(E->getBase());
69128665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    else
69228665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      EmitLValue(E->getBase());
69328665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    return llvm::ConstantInt::get(VMContext, Result.Val.getInt());
69428665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  }
69528665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  return EmitLoadOfLValue(E);
69628665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman}
697d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
6987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
6997f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
7007f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
7017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Emit subscript expressions in rvalue context's.  For most cases, this just
7027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // loads the lvalue formed by the subscript expr.  However, we have to be
7037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // careful, because the base of a vector subscript is occasionally an rvalue,
7047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // so we can't get it as an lvalue.
7057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (!E->getBase()->getType()->isVectorType())
7067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLoadOfLValue(E);
707db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
7087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Handle the vector case.  The base must be a vector, the index must be an
7097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // integer value.
7107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Base = Visit(E->getBase());
7117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Idx  = Visit(E->getIdx());
712daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  bool IdxSigned = E->getIdx()->getType()->isSignedIntegerType();
71377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner  Idx = Builder.CreateIntCast(Idx, CGF.Int32Ty, IdxSigned, "vecidxcast");
7147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateExtractElement(Base, Idx, "vecext");
7157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
7167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
7170533b3020ca39898751d4200feed776861dcd1ceNate Begemanstatic llvm::Constant *getMaskElt(llvm::ShuffleVectorInst *SVI, unsigned Idx,
7180533b3020ca39898751d4200feed776861dcd1ceNate Begeman                                  unsigned Off, const llvm::Type *I32Ty) {
7190533b3020ca39898751d4200feed776861dcd1ceNate Begeman  int MV = SVI->getMaskValue(Idx);
7200533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (MV == -1)
7210533b3020ca39898751d4200feed776861dcd1ceNate Begeman    return llvm::UndefValue::get(I32Ty);
7220533b3020ca39898751d4200feed776861dcd1ceNate Begeman  return llvm::ConstantInt::get(I32Ty, Off+MV);
7230533b3020ca39898751d4200feed776861dcd1ceNate Begeman}
7240533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7250533b3020ca39898751d4200feed776861dcd1ceNate BegemanValue *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {
7260533b3020ca39898751d4200feed776861dcd1ceNate Begeman  bool Ignore = TestAndClearIgnoreResultAssign();
7270533b3020ca39898751d4200feed776861dcd1ceNate Begeman  (void)Ignore;
7280533b3020ca39898751d4200feed776861dcd1ceNate Begeman  assert (Ignore == false && "init list ignored");
7290533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned NumInitElements = E->getNumInits();
7300533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7310533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (E->hadArrayRangeDesignator())
7320533b3020ca39898751d4200feed776861dcd1ceNate Begeman    CGF.ErrorUnsupported(E, "GNU array range designator extension");
7330533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7340533b3020ca39898751d4200feed776861dcd1ceNate Begeman  const llvm::VectorType *VType =
7350533b3020ca39898751d4200feed776861dcd1ceNate Begeman    dyn_cast<llvm::VectorType>(ConvertType(E->getType()));
7360533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7370533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // We have a scalar in braces. Just use the first element.
7380533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (!VType)
7390533b3020ca39898751d4200feed776861dcd1ceNate Begeman    return Visit(E->getInit(0));
7400533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7410533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned ResElts = VType->getNumElements();
7420533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7430533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Loop over initializers collecting the Value for each, and remembering
7440533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // whether the source was swizzle (ExtVectorElementExpr).  This will allow
7450533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // us to fold the shuffle for the swizzle into the shuffle for the vector
7460533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // initializer, since LLVM optimizers generally do not want to touch
7470533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // shuffles.
7480533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned CurIdx = 0;
7490533b3020ca39898751d4200feed776861dcd1ceNate Begeman  bool VIsUndefShuffle = false;
7500533b3020ca39898751d4200feed776861dcd1ceNate Begeman  llvm::Value *V = llvm::UndefValue::get(VType);
7510533b3020ca39898751d4200feed776861dcd1ceNate Begeman  for (unsigned i = 0; i != NumInitElements; ++i) {
7520533b3020ca39898751d4200feed776861dcd1ceNate Begeman    Expr *IE = E->getInit(i);
7530533b3020ca39898751d4200feed776861dcd1ceNate Begeman    Value *Init = Visit(IE);
7540533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::SmallVector<llvm::Constant*, 16> Args;
7550533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7560533b3020ca39898751d4200feed776861dcd1ceNate Begeman    const llvm::VectorType *VVT = dyn_cast<llvm::VectorType>(Init->getType());
7570533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7580533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // Handle scalar elements.  If the scalar initializer is actually one
7590533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // element of a different vector of the same width, use shuffle instead of
7600533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // extract+insert.
7610533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (!VVT) {
7620533b3020ca39898751d4200feed776861dcd1ceNate Begeman      if (isa<ExtVectorElementExpr>(IE)) {
7630533b3020ca39898751d4200feed776861dcd1ceNate Begeman        llvm::ExtractElementInst *EI = cast<llvm::ExtractElementInst>(Init);
7640533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7650533b3020ca39898751d4200feed776861dcd1ceNate Begeman        if (EI->getVectorOperandType()->getNumElements() == ResElts) {
7660533b3020ca39898751d4200feed776861dcd1ceNate Begeman          llvm::ConstantInt *C = cast<llvm::ConstantInt>(EI->getIndexOperand());
7670533b3020ca39898751d4200feed776861dcd1ceNate Begeman          Value *LHS = 0, *RHS = 0;
7680533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (CurIdx == 0) {
7690533b3020ca39898751d4200feed776861dcd1ceNate Begeman            // insert into undef -> shuffle (src, undef)
7700533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(C);
7710533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = 1; j != ResElts; ++j)
77277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner              Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
7730533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7740533b3020ca39898751d4200feed776861dcd1ceNate Begeman            LHS = EI->getVectorOperand();
7750533b3020ca39898751d4200feed776861dcd1ceNate Begeman            RHS = V;
7760533b3020ca39898751d4200feed776861dcd1ceNate Begeman            VIsUndefShuffle = true;
7770533b3020ca39898751d4200feed776861dcd1ceNate Begeman          } else if (VIsUndefShuffle) {
7780533b3020ca39898751d4200feed776861dcd1ceNate Begeman            // insert into undefshuffle && size match -> shuffle (v, src)
7790533b3020ca39898751d4200feed776861dcd1ceNate Begeman            llvm::ShuffleVectorInst *SVV = cast<llvm::ShuffleVectorInst>(V);
7800533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = 0; j != CurIdx; ++j)
78177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner              Args.push_back(getMaskElt(SVV, j, 0, CGF.Int32Ty));
78277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner            Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty,
7830533b3020ca39898751d4200feed776861dcd1ceNate Begeman                                                  ResElts + C->getZExtValue()));
7840533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = CurIdx + 1; j != ResElts; ++j)
78577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner              Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
7860533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7870533b3020ca39898751d4200feed776861dcd1ceNate Begeman            LHS = cast<llvm::ShuffleVectorInst>(V)->getOperand(0);
7880533b3020ca39898751d4200feed776861dcd1ceNate Begeman            RHS = EI->getVectorOperand();
7890533b3020ca39898751d4200feed776861dcd1ceNate Begeman            VIsUndefShuffle = false;
7900533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
7910533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (!Args.empty()) {
7920533b3020ca39898751d4200feed776861dcd1ceNate Begeman            llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
7930533b3020ca39898751d4200feed776861dcd1ceNate Begeman            V = Builder.CreateShuffleVector(LHS, RHS, Mask);
7940533b3020ca39898751d4200feed776861dcd1ceNate Begeman            ++CurIdx;
7950533b3020ca39898751d4200feed776861dcd1ceNate Begeman            continue;
7960533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
7970533b3020ca39898751d4200feed776861dcd1ceNate Begeman        }
7980533b3020ca39898751d4200feed776861dcd1ceNate Begeman      }
79977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, CurIdx);
8000533b3020ca39898751d4200feed776861dcd1ceNate Begeman      V = Builder.CreateInsertElement(V, Init, Idx, "vecinit");
8010533b3020ca39898751d4200feed776861dcd1ceNate Begeman      VIsUndefShuffle = false;
8020533b3020ca39898751d4200feed776861dcd1ceNate Begeman      ++CurIdx;
8030533b3020ca39898751d4200feed776861dcd1ceNate Begeman      continue;
8040533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
8050533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8060533b3020ca39898751d4200feed776861dcd1ceNate Begeman    unsigned InitElts = VVT->getNumElements();
8070533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8080533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // If the initializer is an ExtVecEltExpr (a swizzle), and the swizzle's
8090533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // input is the same width as the vector being constructed, generate an
8100533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // optimized shuffle of the swizzle input into the result.
811a99f08351b6df3bb0f2947e038747717a60fd93aNate Begeman    unsigned Offset = (CurIdx == 0) ? 0 : ResElts;
8120533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (isa<ExtVectorElementExpr>(IE)) {
8130533b3020ca39898751d4200feed776861dcd1ceNate Begeman      llvm::ShuffleVectorInst *SVI = cast<llvm::ShuffleVectorInst>(Init);
8140533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Value *SVOp = SVI->getOperand(0);
8150533b3020ca39898751d4200feed776861dcd1ceNate Begeman      const llvm::VectorType *OpTy = cast<llvm::VectorType>(SVOp->getType());
8160533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8170533b3020ca39898751d4200feed776861dcd1ceNate Begeman      if (OpTy->getNumElements() == ResElts) {
8180533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = 0; j != CurIdx; ++j) {
8190533b3020ca39898751d4200feed776861dcd1ceNate Begeman          // If the current vector initializer is a shuffle with undef, merge
8200533b3020ca39898751d4200feed776861dcd1ceNate Begeman          // this shuffle directly into it.
8210533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (VIsUndefShuffle) {
8220533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(getMaskElt(cast<llvm::ShuffleVectorInst>(V), j, 0,
82377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner                                      CGF.Int32Ty));
8240533b3020ca39898751d4200feed776861dcd1ceNate Begeman          } else {
82577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner            Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j));
8260533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
8270533b3020ca39898751d4200feed776861dcd1ceNate Begeman        }
8280533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = 0, je = InitElts; j != je; ++j)
82977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner          Args.push_back(getMaskElt(SVI, j, Offset, CGF.Int32Ty));
8300533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = CurIdx + InitElts; j != ResElts; ++j)
83177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner          Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
8320533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8330533b3020ca39898751d4200feed776861dcd1ceNate Begeman        if (VIsUndefShuffle)
8340533b3020ca39898751d4200feed776861dcd1ceNate Begeman          V = cast<llvm::ShuffleVectorInst>(V)->getOperand(0);
8350533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8360533b3020ca39898751d4200feed776861dcd1ceNate Begeman        Init = SVOp;
8370533b3020ca39898751d4200feed776861dcd1ceNate Begeman      }
8380533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
8390533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8400533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // Extend init to result vector length, and then shuffle its contribution
8410533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // to the vector initializer into V.
8420533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (Args.empty()) {
8430533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != InitElts; ++j)
84477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j));
8450533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = InitElts; j != ResElts; ++j)
84677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
8470533b3020ca39898751d4200feed776861dcd1ceNate Begeman      llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
8480533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Init = Builder.CreateShuffleVector(Init, llvm::UndefValue::get(VVT),
849a99f08351b6df3bb0f2947e038747717a60fd93aNate Begeman                                         Mask, "vext");
8500533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8510533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Args.clear();
8520533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != CurIdx; ++j)
85377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j));
8540533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != InitElts; ++j)
85577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, j+Offset));
8560533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = CurIdx + InitElts; j != ResElts; ++j)
85777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner        Args.push_back(llvm::UndefValue::get(CGF.Int32Ty));
8580533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
8590533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8600533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // If V is undef, make sure it ends up on the RHS of the shuffle to aid
8610533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // merging subsequent shuffles into this one.
8620533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (CurIdx == 0)
8630533b3020ca39898751d4200feed776861dcd1ceNate Begeman      std::swap(V, Init);
8640533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
8650533b3020ca39898751d4200feed776861dcd1ceNate Begeman    V = Builder.CreateShuffleVector(V, Init, Mask, "vecinit");
8660533b3020ca39898751d4200feed776861dcd1ceNate Begeman    VIsUndefShuffle = isa<llvm::UndefValue>(Init);
8670533b3020ca39898751d4200feed776861dcd1ceNate Begeman    CurIdx += InitElts;
8680533b3020ca39898751d4200feed776861dcd1ceNate Begeman  }
8690533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8700533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // FIXME: evaluate codegen vs. shuffling against constant null vector.
8710533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Emit remaining default initializers.
8720533b3020ca39898751d4200feed776861dcd1ceNate Begeman  const llvm::Type *EltTy = VType->getElementType();
8730533b3020ca39898751d4200feed776861dcd1ceNate Begeman
8740533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Emit remaining default initializers
8750533b3020ca39898751d4200feed776861dcd1ceNate Begeman  for (/* Do not initialize i*/; CurIdx < ResElts; ++CurIdx) {
87677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, CurIdx);
8770533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::Value *Init = llvm::Constant::getNullValue(EltTy);
8780533b3020ca39898751d4200feed776861dcd1ceNate Begeman    V = Builder.CreateInsertElement(V, Init, Idx, "vecinit");
8790533b3020ca39898751d4200feed776861dcd1ceNate Begeman  }
8800533b3020ca39898751d4200feed776861dcd1ceNate Begeman  return V;
8810533b3020ca39898751d4200feed776861dcd1ceNate Begeman}
8820533b3020ca39898751d4200feed776861dcd1ceNate Begeman
883a3697c9c155bda93fd2802f37084b620f4738822Anders Carlssonstatic bool ShouldNullCheckClassCastValue(const CastExpr *CE) {
884a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  const Expr *E = CE->getSubExpr();
88523cba801e11b03929c44f8cf54578305963a3476John McCall
88623cba801e11b03929c44f8cf54578305963a3476John McCall  if (CE->getCastKind() == CastExpr::CK_UncheckedDerivedToBase)
88723cba801e11b03929c44f8cf54578305963a3476John McCall    return false;
888a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
889a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  if (isa<CXXThisExpr>(E)) {
890a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    // We always assume that 'this' is never null.
891a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    return false;
892a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
893a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
894a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(CE)) {
895906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl    // And that glvalue casts are never null.
8965baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall    if (ICE->getValueKind() != VK_RValue)
897a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson      return false;
898a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
899a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
900a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  return true;
901a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson}
902a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
903504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// VisitCastExpr - Emit code for an explicit or implicit cast.  Implicit casts
904504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// have to handle a more broad range of conversions than explicit casts, as they
905504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// handle things like function to ptr-to-function decay etc.
906d888962cff03b543fbe9ac6051ec6addf5b993b4Eli FriedmanValue *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
907d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Expr *E = CE->getSubExpr();
908592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson  QualType DestTy = CE->getType();
909592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson  CastExpr::CastKind Kind = CE->getCastKind();
910592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson
911504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson  if (!DestTy->isVoidType())
912504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson    TestAndClearIgnoreResultAssign();
913db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
9148c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // Since almost all cast kinds apply to scalars, this switch doesn't have
9158c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // a default case, so the compiler will warn on a missing case.  The cases
9168c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // are in the same order as in the CastKind enum.
917504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson  switch (Kind) {
9187f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  case CastExpr::CK_Unknown:
919d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    // FIXME: All casts should have a known kind!
920ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    //assert(0 && "Unknown cast kind!");
921504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson    break;
922ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
923569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor  case CastExpr::CK_LValueBitCast:
924569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor  case CastExpr::CK_ObjCObjectLValueCast: {
925e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor    Value *V = EmitLValue(E).getAddress();
926e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor    V = Builder.CreateBitCast(V,
927e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor                          ConvertType(CGF.getContext().getPointerType(DestTy)));
9289f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy), DestTy);
929e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor  }
930e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor
93192ef5d75720c032808181133e4d7c5f82230237eFariborz Jahanian  case CastExpr::CK_AnyPointerToObjCPointerCast:
9323b27f1a80e4e433b503efd344c909eeafaa9033cFariborz Jahanian  case CastExpr::CK_AnyPointerToBlockPointerCast:
933cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson  case CastExpr::CK_BitCast: {
934cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
935cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson    return Builder.CreateBitCast(Src, ConvertType(DestTy));
936cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson  }
937ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_NoOp:
9380ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlsson  case CastExpr::CK_UserDefinedConversion:
939ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return Visit(const_cast<Expr*>(E));
940db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
941a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  case CastExpr::CK_BaseToDerived: {
942a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    const CXXRecordDecl *DerivedClassDecl =
943a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson      DestTy->getCXXRecordDeclForPointerType();
944a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
945a04efdf635d35d88e65041fad007225d8c8d64a5Anders Carlsson    return CGF.GetAddressOfDerivedClass(Visit(E), DerivedClassDecl,
946f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                        CE->path_begin(), CE->path_end(),
947a04efdf635d35d88e65041fad007225d8c8d64a5Anders Carlsson                                        ShouldNullCheckClassCastValue(CE));
948a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
94923cba801e11b03929c44f8cf54578305963a3476John McCall  case CastExpr::CK_UncheckedDerivedToBase:
950191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson  case CastExpr::CK_DerivedToBase: {
951191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    const RecordType *DerivedClassTy =
952191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson      E->getType()->getAs<PointerType>()->getPointeeType()->getAs<RecordType>();
953191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    CXXRecordDecl *DerivedClassDecl =
954191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson      cast<CXXRecordDecl>(DerivedClassTy->getDecl());
955191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
95634a2d384c745ebc39cae45dc1c0c4a6a7012e09bAnders Carlsson    return CGF.GetAddressOfBaseClass(Visit(E), DerivedClassDecl,
957f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                     CE->path_begin(), CE->path_end(),
95834a2d384c745ebc39cae45dc1c0c4a6a7012e09bAnders Carlsson                                     ShouldNullCheckClassCastValue(CE));
959191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson  }
9608c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_Dynamic: {
9618c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    Value *V = Visit(const_cast<Expr*>(E));
9628c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    const CXXDynamicCastExpr *DCE = cast<CXXDynamicCastExpr>(CE);
9638c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    return CGF.EmitDynamicCast(V, DCE);
9648c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  }
965d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  case CastExpr::CK_ToUnion:
966ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    assert(0 && "Should be unreachable!");
967ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    break;
968d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
969ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_ArrayToPointerDecay: {
970ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    assert(E->getType()->isArrayType() &&
971ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman           "Array to pointer decay must have array source type!");
972ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
973ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    Value *V = EmitLValue(E).getAddress();  // Bitfields can't be arrays.
974ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
975ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Note that VLA pointers are always decayed, so we don't need to do
976ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // anything here.
977ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    if (!E->getType()->isVariableArrayType()) {
978ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      assert(isa<llvm::PointerType>(V->getType()) && "Expected pointer");
979ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      assert(isa<llvm::ArrayType>(cast<llvm::PointerType>(V->getType())
980ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman                                 ->getElementType()) &&
981ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman             "Expected pointer to array");
982ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      V = Builder.CreateStructGEP(V, 0, "arraydecay");
983ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    }
984ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
985ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return V;
986ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
987ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_FunctionToPointerDecay:
988ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return EmitLValue(E).getAddress();
989ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
9900bab0cdab751248ca389a5592bcb70eac5d39260John McCall  case CastExpr::CK_NullToMemberPointer: {
991d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // If the subexpression's type is the C++0x nullptr_t, emit the
992d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // subexpression, which may have side effects.
993d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    if (E->getType()->isNullPtrType())
994d608cdb7c044365cf4e8764ade1e11e99c176078John McCall      (void) Visit(E);
995d608cdb7c044365cf4e8764ade1e11e99c176078John McCall
9960bab0cdab751248ca389a5592bcb70eac5d39260John McCall    const MemberPointerType *MPT = CE->getType()->getAs<MemberPointerType>();
9970bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitNullMemberPointer(MPT);
9980bab0cdab751248ca389a5592bcb70eac5d39260John McCall  }
999191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
10008c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_BaseToDerivedMemberPointer:
1001d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  case CastExpr::CK_DerivedToBaseMemberPointer: {
1002d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    Value *Src = Visit(E);
1003d608cdb7c044365cf4e8764ade1e11e99c176078John McCall
1004d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // Note that the AST doesn't distinguish between checked and
1005d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // unchecked member pointer conversions, so we always have to
1006d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // implement checked conversions here.  This is inefficient when
1007d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // actual control flow may be required in order to perform the
1008d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // check, which it is for data member pointers (but not member
1009d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    // function pointers on Itanium and ARM).
10100bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitMemberPointerConversion(CGF, CE, Src);
1011d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  }
10120bab0cdab751248ca389a5592bcb70eac5d39260John McCall
1013d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
10148c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_ConstructorConversion:
1015d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    assert(0 && "Should be unreachable!");
10168c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    break;
10178c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman
10187f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  case CastExpr::CK_IntegralToPointer: {
10197f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
102089f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
102182debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    // First, convert to the correct width so that we control the kind of
102282debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    // extension.
102377b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    const llvm::Type *MiddleTy = CGF.IntPtrTy;
102482debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    bool InputSigned = E->getType()->isSignedIntegerType();
102582debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    llvm::Value* IntResult =
102682debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson      Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
102789f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
102882debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return Builder.CreateIntToPtr(IntResult, ConvertType(DestTy));
10297f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  }
10307f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  case CastExpr::CK_PointerToIntegral: {
10317f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
103289f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
103389f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar    // Handle conversion to bool correctly.
103489f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar    if (DestTy->isBooleanType())
103589f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar      return EmitScalarConversion(Visit(E), E->getType(), DestTy);
103689f176d89aefe8a23bbf0ace9b329562f4970d5fDaniel Dunbar
10377f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    return Builder.CreatePtrToInt(Src, ConvertType(DestTy));
10387f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  }
1039ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_ToVoid: {
1040569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor    if (E->Classify(CGF.getContext()).isGLValue())
1041569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor      CGF.EmitLValue(E);
1042569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor    else
1043569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor      CGF.EmitAnyExpr(E, 0, false, true);
1044ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return 0;
1045ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
1046ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_VectorSplat: {
1047ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    const llvm::Type *DstTy = ConvertType(DestTy);
1048ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    Value *Elt = Visit(const_cast<Expr*>(E));
1049ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1050ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Insert the element in element zero of an undef vector
1051ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Value *UnV = llvm::UndefValue::get(DstTy);
105277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    llvm::Value *Idx = llvm::ConstantInt::get(CGF.Int32Ty, 0);
1053ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp");
1054ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1055ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Splat the element across to all elements
1056ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::SmallVector<llvm::Constant*, 16> Args;
1057ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();
1058ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    for (unsigned i = 0; i < NumElements; i++)
105977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      Args.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 0));
1060ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
1061ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], NumElements);
1062ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Value *Yay = Builder.CreateShuffleVector(UnV, UnV, Mask, "splat");
1063ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return Yay;
1064ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
10658c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_IntegralCast:
10668c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_IntegralToFloating:
10678c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_FloatingToIntegral:
10688c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_FloatingCast:
1069d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    return EmitScalarConversion(Visit(E), E->getType(), DestTy);
1070ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
10710bab0cdab751248ca389a5592bcb70eac5d39260John McCall  case CastExpr::CK_MemberPointerToBoolean: {
10720bab0cdab751248ca389a5592bcb70eac5d39260John McCall    llvm::Value *MemPtr = Visit(E);
10730bab0cdab751248ca389a5592bcb70eac5d39260John McCall    const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>();
10740bab0cdab751248ca389a5592bcb70eac5d39260John McCall    return CGF.CGM.getCXXABI().EmitMemberPointerIsNotNull(CGF, MemPtr, MPT);
1075e9776247577715ad3a19461769a3488a445a8cbdAnders Carlsson  }
10760bab0cdab751248ca389a5592bcb70eac5d39260John McCall  }
10770bab0cdab751248ca389a5592bcb70eac5d39260John McCall
107858a2e944faa16f1f61439acd2e71b19f50189511Chris Lattner  // Handle cases where the source is an non-complex type.
1079db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
108019a1d7c646729eb858b15583e647262a22de3637Chris Lattner  if (!CGF.hasAggregateLLVMType(E->getType())) {
10813707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    Value *Src = Visit(const_cast<Expr*>(E));
10823707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
10833707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // Use EmitScalarConversion to perform the conversion.
10843707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    return EmitScalarConversion(Src, E->getType(), DestTy);
10853707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
1086db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
10879b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (E->getType()->isAnyComplexType()) {
108819a1d7c646729eb858b15583e647262a22de3637Chris Lattner    // Handle cases where the source is a complex type.
10897f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreImag = true;
10907f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreImagAssign = true;
10917f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreReal = IgnoreResultAssign;
10927f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreRealAssign = IgnoreResultAssign;
10937f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    if (DestTy->isBooleanType())
10947f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreImagAssign = IgnoreImag = false;
10957f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    else if (DestTy->isVoidType()) {
10967f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreReal = IgnoreImag = false;
10977f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreRealAssign = IgnoreImagAssign = true;
10987f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    }
10997f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CodeGenFunction::ComplexPairTy V
11007f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      = CGF.EmitComplexExpr(E, IgnoreReal, IgnoreImag, IgnoreRealAssign,
11017f79f9be5916c51c35da4f126b7c12596a101607Mike Stump                            IgnoreImagAssign);
11027f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return EmitComplexToScalarConversion(V, E->getType(), DestTy);
110319a1d7c646729eb858b15583e647262a22de3637Chris Lattner  }
110410b00cfe6422906b223724048b9b2123968d3baaChris Lattner
110519a1d7c646729eb858b15583e647262a22de3637Chris Lattner  // Okay, this is a cast from an aggregate.  It must be a cast to void.  Just
110619a1d7c646729eb858b15583e647262a22de3637Chris Lattner  // evaluate the result and return.
11077f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  CGF.EmitAggExpr(E, 0, false, true);
110819a1d7c646729eb858b15583e647262a22de3637Chris Lattner  return 0;
11097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
11107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
11113379320c10001d7e1ee5d7e7142c417f797cfe82Chris LattnerValue *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) {
111291d723da7b68be5245c3ac58aa2a36d04658cfb8Chris Lattner  return CGF.EmitCompoundStmt(*E->getSubStmt(),
111391d723da7b68be5245c3ac58aa2a36d04658cfb8Chris Lattner                              !E->getType()->isVoidType()).getScalarVal();
11143379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner}
11153379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner
1116a99038c0757a836c6faeeddaa5dfd249b32f6e9eMike StumpValue *ScalarExprEmitter::VisitBlockDeclRefExpr(const BlockDeclRefExpr *E) {
1117f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian  llvm::Value *V = CGF.GetAddrOfBlockDecl(E);
1118f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian  if (E->getType().isObjCGCWeak())
1119f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian    return CGF.CGM.getObjCRuntime().EmitObjCWeakRead(CGF, V);
11202da84ff228a231adbd3f6f236b857f752d02959aDaniel Dunbar  return Builder.CreateLoad(V, "tmp");
11214e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump}
11223379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner
11237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
11247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                             Unary Operators
11257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
11267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
11278c11a65c18ae607b7073e1e451264492d2297726Chris Lattnerllvm::Value *ScalarExprEmitter::
11288c11a65c18ae607b7073e1e451264492d2297726Chris LattnerEmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
11298c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                        bool isInc, bool isPre) {
11308c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
11318c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  QualType ValTy = E->getSubExpr()->getType();
11328c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  llvm::Value *InVal = EmitLoadOfLValue(LV, ValTy);
11338c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
11348c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  int AmountVal = isInc ? 1 : -1;
11358c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
11368c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  if (ValTy->isPointerType() &&
11378c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      ValTy->getAs<PointerType>()->isVariableArrayType()) {
11388c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // The amount of the addition/subtraction needs to account for the VLA size
11398c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    CGF.ErrorUnsupported(E, "VLA pointer inc/dec");
11408c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  }
11418c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
11428c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  llvm::Value *NextVal;
11438c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  if (const llvm::PointerType *PT =
11448c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      dyn_cast<llvm::PointerType>(InVal->getType())) {
114577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    llvm::Constant *Inc = llvm::ConstantInt::get(CGF.Int32Ty, AmountVal);
11468c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    if (!isa<llvm::FunctionType>(PT->getElementType())) {
11478c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      QualType PTEE = ValTy->getPointeeType();
11488c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      if (const ObjCObjectType *OIT = PTEE->getAs<ObjCObjectType>()) {
11498c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        // Handle interface types, which are not represented with a concrete
11508c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        // type.
11518c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        int size = CGF.getContext().getTypeSize(OIT) / 8;
11528c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        if (!isInc)
11538c11a65c18ae607b7073e1e451264492d2297726Chris Lattner          size = -size;
11548c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        Inc = llvm::ConstantInt::get(Inc->getType(), size);
11558c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
11568c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        InVal = Builder.CreateBitCast(InVal, i8Ty);
11578c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        NextVal = Builder.CreateGEP(InVal, Inc, "add.ptr");
11588c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        llvm::Value *lhs = LV.getAddress();
11598c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        lhs = Builder.CreateBitCast(lhs, llvm::PointerType::getUnqual(i8Ty));
11609f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar        LV = CGF.MakeAddrLValue(lhs, ValTy);
11618c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      } else
11628c11a65c18ae607b7073e1e451264492d2297726Chris Lattner        NextVal = Builder.CreateInBoundsGEP(InVal, Inc, "ptrincdec");
11638c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    } else {
11648c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
11658c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateBitCast(InVal, i8Ty, "tmp");
11668c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateGEP(NextVal, Inc, "ptrincdec");
11678c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateBitCast(NextVal, InVal->getType());
11688c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    }
11698c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  } else if (InVal->getType()->isIntegerTy(1) && isInc) {
11708c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Bool++ is an interesting case, due to promotion rules, we get:
11718c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Bool++ -> Bool = Bool+1 -> Bool = (int)Bool+1 ->
11728c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Bool = ((int)Bool+1) != 0
11738c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // An interesting aspect of this is that increment is always true.
11748c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Decrement does not have this property.
11758c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    NextVal = llvm::ConstantInt::getTrue(VMContext);
11768c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  } else if (isa<llvm::IntegerType>(InVal->getType())) {
11778c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    NextVal = llvm::ConstantInt::get(InVal->getType(), AmountVal);
11788c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
1179640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner    if (!ValTy->isSignedIntegerType())
1180640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      // Unsigned integer inc is always two's complement.
11818c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
1182640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner    else {
1183640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
1184640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      case LangOptions::SOB_Undefined:
1185640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        NextVal = Builder.CreateNSWAdd(InVal, NextVal, isInc ? "inc" : "dec");
1186640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        break;
1187640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      case LangOptions::SOB_Defined:
1188640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
1189640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        break;
1190640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      case LangOptions::SOB_Trapping:
1191640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOpInfo BinOp;
1192640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.LHS = InVal;
1193640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.RHS = NextVal;
1194640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.Ty = E->getType();
1195640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.Opcode = BinaryOperator::Add;
1196640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner        BinOp.E = E;
1197401be6bddcf05ac2828730e0bb4e8b81931f8296John McCall        NextVal = EmitOverflowCheckedBinOp(BinOp);
1198401be6bddcf05ac2828730e0bb4e8b81931f8296John McCall        break;
1199640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner      }
1200640d3267228415328c0feb2bcc35757230ab4db7Chris Lattner    }
12018c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  } else {
12028c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    // Add the inc/dec to the real part.
12038c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    if (InVal->getType()->isFloatTy())
12048c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal =
12058c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      llvm::ConstantFP::get(VMContext,
12068c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                            llvm::APFloat(static_cast<float>(AmountVal)));
12078c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    else if (InVal->getType()->isDoubleTy())
12088c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal =
12098c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      llvm::ConstantFP::get(VMContext,
12108c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                            llvm::APFloat(static_cast<double>(AmountVal)));
12118c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    else {
12128c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      llvm::APFloat F(static_cast<float>(AmountVal));
12138c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      bool ignored;
12148c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      F.convert(CGF.Target.getLongDoubleFormat(), llvm::APFloat::rmTowardZero,
12158c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                &ignored);
12168c11a65c18ae607b7073e1e451264492d2297726Chris Lattner      NextVal = llvm::ConstantFP::get(VMContext, F);
12178c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    }
12188c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    NextVal = Builder.CreateFAdd(InVal, NextVal, isInc ? "inc" : "dec");
12198c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  }
12208c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12218c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  // Store the updated result through the lvalue.
12228c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  if (LV.isBitField())
12238c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    CGF.EmitStoreThroughBitfieldLValue(RValue::get(NextVal), LV, ValTy, &NextVal);
12248c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  else
12258c11a65c18ae607b7073e1e451264492d2297726Chris Lattner    CGF.EmitStoreThroughLValue(RValue::get(NextVal), LV, ValTy);
12268c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12278c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  // If this is a postinc, return the value read from memory, otherwise use the
12288c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  // updated value.
12298c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  return isPre ? NextVal : InVal;
12308c11a65c18ae607b7073e1e451264492d2297726Chris Lattner}
12318c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12328c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12338c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
12347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
12357f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
12369a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // Emit unary minus with EmitSub so we handle overflow cases etc.
12379a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinOpInfo BinOp;
12384ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner  BinOp.RHS = Visit(E->getSubExpr());
12394ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner
12404ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner  if (BinOp.RHS->getType()->isFPOrFPVectorTy())
12414ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner    BinOp.LHS = llvm::ConstantFP::getZeroValueForNegation(BinOp.RHS->getType());
12424ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner  else
12434ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner    BinOp.LHS = llvm::Constant::getNullValue(BinOp.RHS->getType());
12449a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinOp.Ty = E->getType();
12459a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinOp.Opcode = BinaryOperator::Sub;
12469a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  BinOp.E = E;
12479a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  return EmitSub(BinOp);
12487f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
12497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
12507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
12517f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
12527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Op = Visit(E->getSubExpr());
12537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateNot(Op, "neg");
12547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
12557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
12567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryLNot(const UnaryOperator *E) {
12577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Compare operand to zero.
12587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *BoolVal = CGF.EvaluateExprAsBool(E->getSubExpr());
1259db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
12607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Invert value.
12617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // TODO: Could dynamically modify easy computations here.  For example, if
12627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // the operand is an icmp ne, turn into icmp eq.
12637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  BoolVal = Builder.CreateNot(BoolVal, "lnot");
1264db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
12659f84d88a302ea38cf0695ce8cdace47178d2fff4Anders Carlsson  // ZExt result to the expr type.
12669f84d88a302ea38cf0695ce8cdace47178d2fff4Anders Carlsson  return Builder.CreateZExt(BoolVal, ConvertType(E->getType()), "lnot.ext");
12677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
12687f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
12690027d2bb24db629a33a71d04a5fb90a14c15a680Eli FriedmanValue *ScalarExprEmitter::VisitOffsetOfExpr(OffsetOfExpr *E) {
12700027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  // Try folding the offsetof to a constant.
12710027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  Expr::EvalResult EvalResult;
12720027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  if (E->Evaluate(EvalResult, CGF.getContext()))
12730027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    return llvm::ConstantInt::get(VMContext, EvalResult.Val.getInt());
12740027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
12750027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  // Loop over the components of the offsetof to compute the value.
12760027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  unsigned n = E->getNumComponents();
12770027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  const llvm::Type* ResultType = ConvertType(E->getType());
12780027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  llvm::Value* Result = llvm::Constant::getNullValue(ResultType);
12790027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  QualType CurrentType = E->getTypeSourceInfo()->getType();
12800027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  for (unsigned i = 0; i != n; ++i) {
12810027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    OffsetOfExpr::OffsetOfNode ON = E->getComponent(i);
128216fd39fb11cce33d58ecdd39f25540b85c1542b4Eli Friedman    llvm::Value *Offset = 0;
12830027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    switch (ON.getKind()) {
12840027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Array: {
12850027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the index
12860027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Expr *IdxExpr = E->getIndexExpr(ON.getArrayExprIndex());
12870027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      llvm::Value* Idx = CGF.EmitScalarExpr(IdxExpr);
12880027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      bool IdxSigned = IdxExpr->getType()->isSignedIntegerType();
12890027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Idx = Builder.CreateIntCast(Idx, ResultType, IdxSigned, "conv");
12900027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
12910027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Save the element type
12920027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CurrentType =
12930027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman          CGF.getContext().getAsArrayType(CurrentType)->getElementType();
12940027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
12950027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the element size
12960027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      llvm::Value* ElemSize = llvm::ConstantInt::get(ResultType,
12970027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman          CGF.getContext().getTypeSizeInChars(CurrentType).getQuantity());
12980027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
12990027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Multiply out to compute the result
13000027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Offset = Builder.CreateMul(Idx, ElemSize);
13010027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      break;
13020027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
13030027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13040027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Field: {
13050027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      FieldDecl *MemberDecl = ON.getField();
13060027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      RecordDecl *RD = CurrentType->getAs<RecordType>()->getDecl();
13070027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD);
13080027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13090027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the index of the field in its parent.
13100027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      unsigned i = 0;
13110027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // FIXME: It would be nice if we didn't have to loop here!
13120027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      for (RecordDecl::field_iterator Field = RD->field_begin(),
13130027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman                                      FieldEnd = RD->field_end();
13140027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman           Field != FieldEnd; (void)++Field, ++i) {
13150027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman        if (*Field == MemberDecl)
13160027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman          break;
13170027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      }
13180027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      assert(i < RL.getFieldCount() && "offsetof field in wrong type");
13190027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13200027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the offset to the field
13210027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      int64_t OffsetInt = RL.getFieldOffset(i) /
13220027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman                          CGF.getContext().getCharWidth();
13230027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Offset = llvm::ConstantInt::get(ResultType, OffsetInt);
13240027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13250027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Save the element type.
13260027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CurrentType = MemberDecl->getType();
13270027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      break;
13280027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
132916fd39fb11cce33d58ecdd39f25540b85c1542b4Eli Friedman
13300027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Identifier:
13316d4e44b462fe9e870a40358522379400ccc6e3c2Eli Friedman      llvm_unreachable("dependent __builtin_offsetof");
133216fd39fb11cce33d58ecdd39f25540b85c1542b4Eli Friedman
13330027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    case OffsetOfExpr::OffsetOfNode::Base: {
13340027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      if (ON.getBase()->isVirtual()) {
13350027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman        CGF.ErrorUnsupported(E, "virtual base in offsetof");
13360027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman        continue;
13370027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      }
13380027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13390027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      RecordDecl *RD = CurrentType->getAs<RecordType>()->getDecl();
13400027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD);
13410027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13420027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Save the element type.
13430027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CurrentType = ON.getBase()->getType();
13440027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman
13450027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      // Compute the offset to the base.
13460027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      const RecordType *BaseRT = CurrentType->getAs<RecordType>();
13470027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      CXXRecordDecl *BaseRD = cast<CXXRecordDecl>(BaseRT->getDecl());
13480027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      int64_t OffsetInt = RL.getBaseClassOffset(BaseRD) /
13490027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman                          CGF.getContext().getCharWidth();
13500027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      Offset = llvm::ConstantInt::get(ResultType, OffsetInt);
13510027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman      break;
13520027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
13530027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    }
13540027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman    Result = Builder.CreateAdd(Result, Offset);
13550027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  }
13560027d2bb24db629a33a71d04a5fb90a14c15a680Eli Friedman  return Result;
13578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
13588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
13590518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeOfAlignOfExpr - Return the size or alignment of the type of
13600518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// argument of the sizeof expression as an integer.
13610518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlValue *
13620518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlScalarExprEmitter::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
13630518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType TypeToSize = E->getTypeOfArgument();
1364f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  if (E->isSizeOf()) {
1365db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    if (const VariableArrayType *VAT =
1366f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman          CGF.getContext().getAsVariableArrayType(TypeToSize)) {
1367f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman      if (E->isArgumentType()) {
1368f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman        // sizeof(type) - make sure to emit the VLA size.
1369f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman        CGF.EmitVLASize(TypeToSize);
13708f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman      } else {
13718f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        // C99 6.5.3.4p2: If the argument is an expression of type
13728f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        // VLA, it is evaluated.
13738f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        CGF.EmitAnyExpr(E->getArgumentExpr());
1374f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman      }
1375db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
137696f214776c0f69069fee4d67557c8c7f416009a8Anders Carlsson      return CGF.GetVLASize(VAT);
1377b50525ba0e996bc072cdb76152fcfe0bc64bb72aAnders Carlsson    }
13785d46315ca3cbbfe0d0f5f65520b618fb05dd4446Anders Carlsson  }
1379f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1380db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // If this isn't sizeof(vla), the result must be constant; use the constant
1381db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // folding logic so we don't have to duplicate it here.
1382f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  Expr::EvalResult Result;
1383f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  E->Evaluate(Result, CGF.getContext());
13844a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson  return llvm::ConstantInt::get(VMContext, Result.Val.getInt());
13857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
13867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
138746f93d021a1778442c1c4a53f0b94a68bfae3be5Chris LattnerValue *ScalarExprEmitter::VisitUnaryReal(const UnaryOperator *E) {
138846f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Expr *Op = E->getSubExpr();
13899b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (Op->getType()->isAnyComplexType())
13907f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return CGF.EmitComplexExpr(Op, false, true, false, true).first;
139146f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  return Visit(Op);
139246f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner}
139346f93d021a1778442c1c4a53f0b94a68bfae3be5Chris LattnerValue *ScalarExprEmitter::VisitUnaryImag(const UnaryOperator *E) {
139446f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Expr *Op = E->getSubExpr();
13959b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (Op->getType()->isAnyComplexType())
13967f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return CGF.EmitComplexExpr(Op, true, false, true, false).second;
1397db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
13987f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // __imag on a scalar returns zero.  Emit the subexpr to ensure side
13997f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // effects are evaluated, but not the actual value.
14007f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (E->isLvalue(CGF.getContext()) == Expr::LV_Valid)
14017f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CGF.EmitLValue(Op);
14027f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  else
14037f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CGF.EmitScalarExpr(Op, true);
1404c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson  return llvm::Constant::getNullValue(ConvertType(E->getType()));
140546f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner}
140646f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner
14077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
14087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                           Binary Operators
14097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
14107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
14117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerBinOpInfo ScalarExprEmitter::EmitBinOps(const BinaryOperator *E) {
14127f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
14137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  BinOpInfo Result;
14147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.LHS = Visit(E->getLHS());
14157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.RHS = Visit(E->getRHS());
14161f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  Result.Ty  = E->getType();
14179a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  Result.Opcode = E->getOpcode();
14187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.E = E;
14197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Result;
14207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
14217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
14226a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas GregorLValue ScalarExprEmitter::EmitCompoundAssignLValue(
14236a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                                              const CompoundAssignOperator *E,
14246a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                        Value *(ScalarExprEmitter::*Func)(const BinOpInfo &),
1425d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                                   Value *&Result) {
142654d76db0aa7107597cac0b80d8e138a37e6d1de9Benjamin Kramer  QualType LHSTy = E->getLHS()->getType();
14271f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  BinOpInfo OpInfo;
14286a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
1429ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  if (E->getComputationResultType()->isAnyComplexType()) {
1430db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // This needs to go through the complex expression emitter, but it's a tad
1431db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // complicated to do that... I'm leaving it out for now.  (Note that we do
1432db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // actually need the imaginary part of the RHS for multiplication and
1433db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // division.)
1434ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman    CGF.ErrorUnsupported(E, "complex compound assignment");
1435d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    Result = llvm::UndefValue::get(CGF.ConvertType(E->getType()));
14366a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor    return LValue();
14371f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  }
14386a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
1439cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  // Emit the RHS first.  __block variables need to have the rhs evaluated
1440cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  // first, plus this should improve codegen a little.
1441cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.RHS = Visit(E->getRHS());
1442cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.Ty = E->getComputationResultType();
14439a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  OpInfo.Opcode = E->getOpcode();
1444cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.E = E;
1445ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  // Load/convert the LHS.
1446b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue LHSLV = EmitCheckedLValue(E->getLHS());
1447ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  OpInfo.LHS = EmitLoadOfLValue(LHSLV, LHSTy);
1448ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  OpInfo.LHS = EmitScalarConversion(OpInfo.LHS, LHSTy,
1449ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman                                    E->getComputationLHSType());
14506a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
14511f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  // Expand the binary operator.
1452d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  Result = (this->*Func)(OpInfo);
14536a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
14548c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar  // Convert the result back to the LHS type.
1455ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  Result = EmitScalarConversion(Result, E->getComputationResultType(), LHSTy);
14566a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
1457db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Store the result value into the LHS lvalue. Bit-fields are handled
1458db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // specially because the result is altered by the store, i.e., [C99 6.5.16p1]
1459db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // 'An assignment expression has the value of the left operand after the
1460db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // assignment...'.
1461d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHSLV.isBitField())
1462d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    CGF.EmitStoreThroughBitfieldLValue(RValue::get(Result), LHSLV, LHSTy,
1463d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                       &Result);
1464d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  else
1465ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar    CGF.EmitStoreThroughLValue(RValue::get(Result), LHSLV, LHSTy);
1466d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
14676a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  return LHSLV;
14686a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor}
14696a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
14706a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas GregorValue *ScalarExprEmitter::EmitCompoundAssign(const CompoundAssignOperator *E,
14716a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                      Value *(ScalarExprEmitter::*Func)(const BinOpInfo &)) {
14726a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  bool Ignore = TestAndClearIgnoreResultAssign();
1473d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  Value *RHS;
1474d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  LValue LHS = EmitCompoundAssignLValue(E, Func, RHS);
1475d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1476d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the result is clearly ignored, return now.
14777f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (Ignore)
14787f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return 0;
1479d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1480d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Objective-C property assignment never reloads the value following a store.
1481d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHS.isPropertyRef() || LHS.isKVCRef())
1482d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
1483d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1484d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the lvalue is non-volatile, return the computed value of the assignment.
1485d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (!LHS.isVolatileQualified())
1486d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
1487d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1488d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Otherwise, reload the value.
1489d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  return EmitLoadOfLValue(LHS, E->getType());
14901f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner}
14911f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
14921f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
14937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitDiv(const BinOpInfo &Ops) {
1494f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  if (Ops.LHS->getType()->isFPOrFPVectorTy())
14957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateFDiv(Ops.LHS, Ops.RHS, "div");
1496f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  else if (Ops.Ty->hasUnsignedIntegerRepresentation())
14977f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateUDiv(Ops.LHS, Ops.RHS, "div");
14987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  else
14997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSDiv(Ops.LHS, Ops.RHS, "div");
15007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
15017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
15027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitRem(const BinOpInfo &Ops) {
15037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Rem in C can't be a floating point type: C99 6.5.5p2.
15041f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  if (Ops.Ty->isUnsignedIntegerType())
15057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateURem(Ops.LHS, Ops.RHS, "rem");
15067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  else
15077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSRem(Ops.LHS, Ops.RHS, "rem");
15087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
15097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
15102add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike StumpValue *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {
15112add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  unsigned IID;
15122add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  unsigned OpID = 0;
15135d8b2cf9fd704f6ca5e33525803a65421c0b440eMike Stump
15149a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  switch (Ops.Opcode) {
1515035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::Add:
1516035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::AddAssign:
1517035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 1;
1518035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::sadd_with_overflow;
1519035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
1520035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::Sub:
1521035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::SubAssign:
1522035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 2;
1523035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::ssub_with_overflow;
1524035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
1525035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::Mul:
1526035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::MulAssign:
1527035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 3;
1528035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::smul_with_overflow;
1529035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
1530035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  default:
1531035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    assert(false && "Unsupported operation for overflow detection");
1532ab4eff620a9ce0ea62cdf29529a66c2c98d116f5Daniel Dunbar    IID = 0;
1533035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  }
1534035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  OpID <<= 1;
1535035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  OpID |= 1;
1536035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump
15372add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  const llvm::Type *opTy = CGF.CGM.getTypes().ConvertType(Ops.Ty);
15382add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
15392add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::Function *intrinsic = CGF.CGM.getIntrinsic(IID, &opTy, 1);
15402add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
15412add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *resultAndOverflow = Builder.CreateCall2(intrinsic, Ops.LHS, Ops.RHS);
15422add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *result = Builder.CreateExtractValue(resultAndOverflow, 0);
15432add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *overflow = Builder.CreateExtractValue(resultAndOverflow, 1);
15442add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
15452add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // Branch in case of overflow.
154693a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  llvm::BasicBlock *overflowBB = CGF.createBasicBlock("overflow", CGF.CurFn);
154793a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  llvm::BasicBlock *continueBB = CGF.createBasicBlock("nooverflow", CGF.CurFn);
15482add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
15492add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.CreateCondBr(overflow, overflowBB, continueBB);
15502add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
155193a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  // Handle overflow with llvm.trap.
155293a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  // TODO: it would be better to generate one of these blocks per function.
15532add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.SetInsertPoint(overflowBB);
155493a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  llvm::Function *Trap = CGF.CGM.getIntrinsic(llvm::Intrinsic::trap);
155593a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  Builder.CreateCall(Trap);
155693a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  Builder.CreateUnreachable();
155793a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner
155893a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  // Continue on.
15592add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.SetInsertPoint(continueBB);
156093a00357f2795404c6709d9e06b4f717c82e6efbChris Lattner  return result;
15612add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump}
15627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
15637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitAdd(const BinOpInfo &Ops) {
156458f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff  if (!Ops.Ty->isAnyPointerType()) {
1565f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    if (Ops.Ty->hasSignedIntegerRepresentation()) {
1566a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
1567a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Undefined:
1568a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateNSWAdd(Ops.LHS, Ops.RHS, "add");
1569a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Defined:
1570a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
1571a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Trapping:
1572a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return EmitOverflowCheckedBinOp(Ops);
1573a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      }
1574a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    }
1575a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
1576f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
157787415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFAdd(Ops.LHS, Ops.RHS, "add");
1578bf933a0cb628670490c15367b3f5ccb3193354a7Dan Gohman
15797f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
15802add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  }
1581daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman
15827f215c12af4c3e7f81b24102a676aabfdb4e1566Chris Lattner  // Must have binary (not unary) expr here.  Unary pointer decrement doesn't
15839a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // use this path.
15849a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const BinaryOperator *BinOp = cast<BinaryOperator>(Ops.E);
15859a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner
158614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (Ops.Ty->isPointerType() &&
15876217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      Ops.Ty->getAs<PointerType>()->isVariableArrayType()) {
1588daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the addition needs to account for the VLA size
15899a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    CGF.ErrorUnsupported(BinOp, "VLA pointer addition");
1590daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  }
15919a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner
15928f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  Value *Ptr, *Idx;
15938f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  Expr *IdxExp;
15949a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const PointerType *PT = BinOp->getLHS()->getType()->getAs<PointerType>();
1595db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  const ObjCObjectPointerType *OPT =
15969a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    BinOp->getLHS()->getType()->getAs<ObjCObjectPointerType>();
159714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (PT || OPT) {
15988f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Ptr = Ops.LHS;
15998f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Idx = Ops.RHS;
16009a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    IdxExp = BinOp->getRHS();
160114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  } else {  // int + pointer
16029a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    PT = BinOp->getRHS()->getType()->getAs<PointerType>();
16039a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    OPT = BinOp->getRHS()->getType()->getAs<ObjCObjectPointerType>();
160414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    assert((PT || OPT) && "Invalid add expr");
16058f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Ptr = Ops.RHS;
16068f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Idx = Ops.LHS;
16079a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    IdxExp = BinOp->getLHS();
16088f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  }
16098f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner
16108f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
16117cabee5b18212bd3106aea8415b044b2b3b43518Sanjiv Gupta  if (Width < CGF.LLVMPointerWidth) {
16128f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    // Zero or sign extend the pointer value based on whether the index is
16138f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    // signed or not.
161477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner    const llvm::Type *IdxType = CGF.IntPtrTy;
16159619662a1d42e2008b865d3459c0677e149dad1bChris Lattner    if (IdxExp->getType()->isSignedIntegerType())
16168f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner      Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
16178f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    else
16188f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner      Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
16198f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  }
162014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  const QualType ElementType = PT ? PT->getPointeeType() : OPT->getPointeeType();
1621db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Handle interface types, which are not represented with a concrete type.
1622c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (const ObjCObjectType *OIT = ElementType->getAs<ObjCObjectType>()) {
1623db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    llvm::Value *InterfaceSize =
16244a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson      llvm::ConstantInt::get(Idx->getType(),
1625199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck          CGF.getContext().getTypeSizeInChars(OIT).getQuantity());
16262a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Idx = Builder.CreateMul(Idx, InterfaceSize);
16273c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer    const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
16282a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
16292a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
16302a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    return Builder.CreateBitCast(Res, Ptr->getType());
1631db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
16322a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar
1633db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Explicitly handle GNU void* and function pointer arithmetic extensions. The
1634db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // GNU void* casts amount to no-ops since our void* type is i8*, but this is
1635db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // future proof.
1636b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar  if (ElementType->isVoidType() || ElementType->isFunctionType()) {
16373c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer    const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
1638b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
16392a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
1640b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    return Builder.CreateBitCast(Res, Ptr->getType());
1641db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
1642db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1643664f8934e06cf10de98083b4526aef7bce191a3fDan Gohman  return Builder.CreateInBoundsGEP(Ptr, Idx, "add.ptr");
16447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
16457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
16467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
16472add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  if (!isa<llvm::PointerType>(Ops.LHS->getType())) {
1648f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    if (Ops.Ty->hasSignedIntegerRepresentation()) {
1649a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      switch (CGF.getContext().getLangOptions().getSignedOverflowBehavior()) {
1650a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Undefined:
1651a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateNSWSub(Ops.LHS, Ops.RHS, "sub");
1652a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Defined:
1653a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
1654a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      case LangOptions::SOB_Trapping:
1655a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner        return EmitOverflowCheckedBinOp(Ops);
1656a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      }
1657a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    }
1658a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
1659f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
166087415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFSub(Ops.LHS, Ops.RHS, "sub");
16612eb91e4812d54a1cf634c265a16633a3d3edcf91Chris Lattner
16627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
16632add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  }
16641f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
16659a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // Must have binary (not unary) expr here.  Unary pointer increment doesn't
16669a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  // use this path.
16679a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const BinaryOperator *BinOp = cast<BinaryOperator>(Ops.E);
16689a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner
16699a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  if (BinOp->getLHS()->getType()->isPointerType() &&
16709a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner      BinOp->getLHS()->getType()->getAs<PointerType>()->isVariableArrayType()) {
1671daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the addition needs to account for the VLA size for
1672daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // ptr-int
1673daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the division needs to account for the VLA size for
1674daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // ptr-ptr.
16759a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner    CGF.ErrorUnsupported(BinOp, "VLA pointer subtraction");
1676daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  }
1677daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman
16789a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner  const QualType LHSType = BinOp->getLHS()->getType();
167914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  const QualType LHSElementType = LHSType->getPointeeType();
16808c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar  if (!isa<llvm::PointerType>(Ops.RHS->getType())) {
16818c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    // pointer - int
16828c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *Idx = Ops.RHS;
16838c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
16847cabee5b18212bd3106aea8415b044b2b3b43518Sanjiv Gupta    if (Width < CGF.LLVMPointerWidth) {
16858c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      // Zero or sign extend the pointer value based on whether the index is
16868c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      // signed or not.
168777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner      const llvm::Type *IdxType = CGF.IntPtrTy;
16889a20723df5904f2da9e4da14bf127366609b5cd8Chris Lattner      if (BinOp->getRHS()->getType()->isSignedIntegerType())
16898c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar        Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
16908c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      else
16918c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar        Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
16928c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    }
16938c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Idx = Builder.CreateNeg(Idx, "sub.ptr.neg");
1694b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar
1695db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // Handle interface types, which are not represented with a concrete type.
1696c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (const ObjCObjectType *OIT = LHSElementType->getAs<ObjCObjectType>()) {
1697db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump      llvm::Value *InterfaceSize =
16984a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson        llvm::ConstantInt::get(Idx->getType(),
1699199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                               CGF.getContext().
1700199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                                 getTypeSizeInChars(OIT).getQuantity());
17012a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Idx = Builder.CreateMul(Idx, InterfaceSize);
17023c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
17032a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
17042a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Value *Res = Builder.CreateGEP(LHSCasted, Idx, "add.ptr");
17052a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      return Builder.CreateBitCast(Res, Ops.LHS->getType());
1706db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    }
17072a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar
1708b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    // Explicitly handle GNU void* and function pointer arithmetic
1709db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // extensions. The GNU void* casts amount to no-ops since our void* type is
1710db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // i8*, but this is future proof.
1711b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
17123c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
1713b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
1714b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      Value *Res = Builder.CreateGEP(LHSCasted, Idx, "sub.ptr");
1715b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      return Builder.CreateBitCast(Res, Ops.LHS->getType());
1716db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    }
1717db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1718664f8934e06cf10de98083b4526aef7bce191a3fDan Gohman    return Builder.CreateInBoundsGEP(Ops.LHS, Idx, "sub.ptr");
1719820b03398fdcc8f1f6c60ace55b708e311fa8ce4Daniel Dunbar  } else {
17208c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    // pointer - pointer
17218c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *LHS = Ops.LHS;
17228c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *RHS = Ops.RHS;
1723db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1724199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    CharUnits ElementSize;
1725820b03398fdcc8f1f6c60ace55b708e311fa8ce4Daniel Dunbar
1726e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // Handle GCC extension for pointer arithmetic on void* and function pointer
1727e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // types.
1728e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
1729199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck      ElementSize = CharUnits::One();
17308c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    } else {
1731199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck      ElementSize = CGF.getContext().getTypeSizeInChars(LHSElementType);
17328c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    }
1733db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
17348c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    const llvm::Type *ResultType = ConvertType(Ops.Ty);
17358c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    LHS = Builder.CreatePtrToInt(LHS, ResultType, "sub.ptr.lhs.cast");
17368c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
17378c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *BytesBetween = Builder.CreateSub(LHS, RHS, "sub.ptr.sub");
1738db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1739e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // Optimize out the shift for element size of 1.
1740199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    if (ElementSize.isOne())
1741e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner      return BytesBetween;
1742df1109434abd465a4db2e6f69ec2688866660367Dan Gohman
1743df1109434abd465a4db2e6f69ec2688866660367Dan Gohman    // Otherwise, do a full sdiv. This uses the "exact" form of sdiv, since
1744db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // pointer difference in C is only defined in the case where both operands
1745db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // are pointing to elements of an array.
1746199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    Value *BytesPerElt =
1747199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        llvm::ConstantInt::get(ResultType, ElementSize.getQuantity());
1748df1109434abd465a4db2e6f69ec2688866660367Dan Gohman    return Builder.CreateExactSDiv(BytesBetween, BytesPerElt, "sub.ptr.div");
17497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
17507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
17517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
17527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) {
17537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // LLVM requires the LHS and RHS to be the same type: promote or truncate the
17547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // RHS to the same size as the LHS.
17557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Ops.RHS;
17567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (Ops.LHS->getType() != RHS->getType())
17577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
1758db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1759be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  if (CGF.CatchUndefined
1760be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump      && isa<llvm::IntegerType>(Ops.LHS->getType())) {
1761be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    unsigned Width = cast<llvm::IntegerType>(Ops.LHS->getType())->getBitWidth();
1762be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
1763be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS,
1764be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump                                 llvm::ConstantInt::get(RHS->getType(), Width)),
176515037caa1542bb810ad54c653aeb80f61df7b00cMike Stump                             Cont, CGF.getTrapBB());
1766be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.EmitBlock(Cont);
1767be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  }
1768be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump
17697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateShl(Ops.LHS, RHS, "shl");
17707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
17717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
17727f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitShr(const BinOpInfo &Ops) {
17737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // LLVM requires the LHS and RHS to be the same type: promote or truncate the
17747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // RHS to the same size as the LHS.
17757f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Ops.RHS;
17767f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (Ops.LHS->getType() != RHS->getType())
17777f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
1778db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1779be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  if (CGF.CatchUndefined
1780be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump      && isa<llvm::IntegerType>(Ops.LHS->getType())) {
1781be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    unsigned Width = cast<llvm::IntegerType>(Ops.LHS->getType())->getBitWidth();
1782be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
1783be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS,
1784be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump                                 llvm::ConstantInt::get(RHS->getType(), Width)),
178515037caa1542bb810ad54c653aeb80f61df7b00cMike Stump                             Cont, CGF.getTrapBB());
1786be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.EmitBlock(Cont);
1787be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  }
1788be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump
1789f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  if (Ops.Ty->hasUnsignedIntegerRepresentation())
17907f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateLShr(Ops.LHS, RHS, "shr");
17917f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateAShr(Ops.LHS, RHS, "shr");
17927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
17937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
17947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
17957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                      unsigned SICmpOpc, unsigned FCmpOpc) {
17967f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
17974f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *Result;
17987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  QualType LHSTy = E->getLHS()->getType();
17990bab0cdab751248ca389a5592bcb70eac5d39260John McCall  if (const MemberPointerType *MPT = LHSTy->getAs<MemberPointerType>()) {
1800e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall    assert(E->getOpcode() == BinaryOperator::EQ ||
1801e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall           E->getOpcode() == BinaryOperator::NE);
1802d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    Value *LHS = CGF.EmitScalarExpr(E->getLHS());
1803d608cdb7c044365cf4e8764ade1e11e99c176078John McCall    Value *RHS = CGF.EmitScalarExpr(E->getRHS());
18040bab0cdab751248ca389a5592bcb70eac5d39260John McCall    Result = CGF.CGM.getCXXABI().EmitMemberPointerComparison(
18050bab0cdab751248ca389a5592bcb70eac5d39260John McCall                   CGF, LHS, RHS, MPT, E->getOpcode() == BinaryOperator::NE);
1806b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman  } else if (!LHSTy->isAnyComplexType()) {
18077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *LHS = Visit(E->getLHS());
18087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *RHS = Visit(E->getRHS());
1809db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1810f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (LHS->getType()->isFPOrFPVectorTy()) {
18117a66d7b6c0d84f8c9c74c687a338cf3cf6b9c808Nate Begeman      Result = Builder.CreateFCmp((llvm::CmpInst::Predicate)FCmpOpc,
18127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
1813f60946222721d9ba3c059563935c17b84703187aDouglas Gregor    } else if (LHSTy->hasSignedIntegerRepresentation()) {
1814ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)SICmpOpc,
18157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
18167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
1817ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      // Unsigned integers and pointers.
1818ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
18197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
18207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
18219c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner
18229c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    // If this is a vector comparison, sign extend the result to the appropriate
18239c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    // vector integer type and return it (don't convert to bool).
18249c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    if (LHSTy->isVectorType())
18259c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner      return Builder.CreateSExt(Result, ConvertType(E->getType()), "sext");
1826db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
18277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  } else {
18287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    // Complex Comparison: can only be an equality comparison.
18297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    CodeGenFunction::ComplexPairTy LHS = CGF.EmitComplexExpr(E->getLHS());
18307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    CodeGenFunction::ComplexPairTy RHS = CGF.EmitComplexExpr(E->getRHS());
1831db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1832183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    QualType CETy = LHSTy->getAs<ComplexType>()->getElementType();
1833db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
18344f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner    Value *ResultR, *ResultI;
18357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    if (CETy->isRealFloatingType()) {
18367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultR = Builder.CreateFCmp((llvm::FCmpInst::Predicate)FCmpOpc,
18377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.first, RHS.first, "cmp.r");
18387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultI = Builder.CreateFCmp((llvm::FCmpInst::Predicate)FCmpOpc,
18397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.second, RHS.second, "cmp.i");
18407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
18417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      // Complex comparisons can only be equality comparisons.  As such, signed
18427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      // and unsigned opcodes are the same.
18437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultR = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
18447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.first, RHS.first, "cmp.r");
18457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultI = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
18467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.second, RHS.second, "cmp.i");
18477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
1848db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
18497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    if (E->getOpcode() == BinaryOperator::EQ) {
18507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      Result = Builder.CreateAnd(ResultR, ResultI, "and.ri");
18517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
18527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      assert(E->getOpcode() == BinaryOperator::NE &&
18537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner             "Complex comparison other than == or != ?");
18547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      Result = Builder.CreateOr(ResultR, ResultI, "or.ri");
18557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
18567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
185732f6209ea9a5a88ad3f8d7ad5e5b160b403d12daNuno Lopes
185832f6209ea9a5a88ad3f8d7ad5e5b160b403d12daNuno Lopes  return EmitScalarConversion(Result, CGF.getContext().BoolTy, E->getType());
18597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
18607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
18617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {
18627f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool Ignore = TestAndClearIgnoreResultAssign();
18637f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
18647f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // __block variables need to have the rhs evaluated first, plus this should
18657f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // improve codegen just a little.
18667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Visit(E->getRHS());
1867b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue LHS = EmitCheckedLValue(E->getLHS());
1868db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1869ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar  // Store the value into the LHS.  Bit-fields are handled specially
1870371d16f45aeec61c1d07687f763d92137e133642Daniel Dunbar  // because the result is altered by the store, i.e., [C99 6.5.16p1]
1871371d16f45aeec61c1d07687f763d92137e133642Daniel Dunbar  // 'An assignment expression has the value of the left operand after
1872daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  // the assignment...'.
1873d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHS.isBitField())
1874d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    CGF.EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, E->getType(),
1875d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                       &RHS);
1876d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  else
1877ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar    CGF.EmitStoreThroughLValue(RValue::get(RHS), LHS, E->getType());
1878d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1879d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the result is clearly ignored, return now.
18807f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (Ignore)
18817f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return 0;
1882d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1883d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Objective-C property assignment never reloads the value following a store.
1884d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (LHS.isPropertyRef() || LHS.isKVCRef())
1885d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
1886d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1887d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // If the lvalue is non-volatile, return the computed value of the assignment.
1888d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  if (!LHS.isVolatileQualified())
1889d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar    return RHS;
1890d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar
1891d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  // Otherwise, reload the value.
18927f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  return EmitLoadOfLValue(LHS, E->getType());
18937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
18947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
18957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {
18967804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  const llvm::Type *ResTy = ConvertType(E->getType());
18977804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner
189820eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 0 && RHS, see if we can elide RHS, if so, just return 0.
189920eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 1 && X, just emit X without inserting the control flow.
190020eb09d562b80420a3328be789547af354bf3e36Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getLHS())) {
190120eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (Cond == 1) { // If we have 1 && X, just emit X.
19020946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner      Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
19037804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      // ZExt result to int or bool.
19047804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "land.ext");
19050946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    }
1906db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19077804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner    // 0 && RHS: If it is safe, just elide the RHS, and return 0/false.
190820eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (!CGF.ContainsLabel(E->getRHS()))
19097804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return llvm::Constant::getNullValue(ResTy);
19100946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  }
1911db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19129615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("land.end");
19139615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *RHSBlock  = CGF.createBasicBlock("land.rhs");
191420eb09d562b80420a3328be789547af354bf3e36Chris Lattner
1915f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Branch on the LHS first.  If it is false, go to the failure (cont) block.
1916f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBranchOnBoolExpr(E->getLHS(), RHSBlock, ContBlock);
1917f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
1918f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Any edges into the ContBlock are now from an (indeterminate number of)
1919f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // edges from this first condition.  All of these values will be false.  Start
1920f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // setting up the PHI node in the Cont Block for this.
19210032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext),
19220032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                            "", ContBlock);
1923f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  PN->reserveOperandSpace(2);  // Normal case, two inputs.
1924f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock);
1925f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner       PI != PE; ++PI)
19263b144ba615c32f3cfa5309060ed5e09c89ac2871Owen Anderson    PN->addIncoming(llvm::ConstantInt::getFalse(VMContext), *PI);
1927db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
192872119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
19297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
19307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
193172119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
1932db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Reaquire the RHS block, as there may be subblocks inserted.
19347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
1935f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
1936f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit an unconditional branch from this block to ContBlock.  Insert an entry
1937f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // into the phi node for the edge with the value of RHSCond.
19387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(ContBlock);
19397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHSCond, RHSBlock);
1940db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // ZExt result to int.
19427804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  return Builder.CreateZExtOrBitCast(PN, ResTy, "land.ext");
19437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
19447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
19457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) {
19467804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  const llvm::Type *ResTy = ConvertType(E->getType());
19477804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner
194820eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 1 || RHS, see if we can elide RHS, if so, just return 1.
194920eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 0 || X, just emit X without inserting the control flow.
195020eb09d562b80420a3328be789547af354bf3e36Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getLHS())) {
195120eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (Cond == -1) { // If we have 0 || X, just emit X.
19520946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner      Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
19537804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      // ZExt result to int or bool.
19547804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "lor.ext");
19550946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    }
1956db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19577804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner    // 1 || RHS: If it is safe, just elide the RHS, and return 1/true.
195820eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (!CGF.ContainsLabel(E->getRHS()))
19597804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return llvm::ConstantInt::get(ResTy, 1);
19600946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  }
1961db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19629615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("lor.end");
19639615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("lor.rhs");
1964db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1965f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Branch on the LHS first.  If it is true, go to the success (cont) block.
1966f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBranchOnBoolExpr(E->getLHS(), ContBlock, RHSBlock);
1967f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
1968f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Any edges into the ContBlock are now from an (indeterminate number of)
1969f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // edges from this first condition.  All of these values will be true.  Start
1970f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // setting up the PHI node in the Cont Block for this.
19710032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext),
19720032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                            "", ContBlock);
1973f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  PN->reserveOperandSpace(2);  // Normal case, two inputs.
1974f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock);
1975f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner       PI != PE; ++PI)
19763b144ba615c32f3cfa5309060ed5e09c89ac2871Owen Anderson    PN->addIncoming(llvm::ConstantInt::getTrue(VMContext), *PI);
1977f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
197872119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
197933da07db112f4877f6ab13e20db08b9bb86a0c2eAnders Carlsson
1980f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit the RHS condition as a bool value.
19817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
19827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
1983db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
198472119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
1985db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Reaquire the RHS block, as there may be subblocks inserted.
19877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
1988db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1989f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit an unconditional branch from this block to ContBlock.  Insert an entry
1990f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // into the phi node for the edge with the value of RHSCond.
1991f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBlock(ContBlock);
19927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHSCond, RHSBlock);
1993db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
19947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // ZExt result to int.
19957804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  return Builder.CreateZExtOrBitCast(PN, ResTy, "lor.ext");
19967f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
19977f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
19987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinComma(const BinaryOperator *E) {
19997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitStmt(E->getLHS());
2000a448fb2da03ece39978784793eea68760e8205a1Daniel Dunbar  CGF.EnsureInsertPoint();
20017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Visit(E->getRHS());
20027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
20037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
20047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
20057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                             Other Operators
20067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
20077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
20089802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// isCheapEnoughToEvaluateUnconditionally - Return true if the specified
20099802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// expression is cheap enough and side-effect-free enough to evaluate
20109802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// unconditionally instead of conditionally.  This is used to convert control
20119802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// flow into selects in some cases.
2012df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stumpstatic bool isCheapEnoughToEvaluateUnconditionally(const Expr *E,
2013df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                                   CodeGenFunction &CGF) {
20149802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (const ParenExpr *PE = dyn_cast<ParenExpr>(E))
2015df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return isCheapEnoughToEvaluateUnconditionally(PE->getSubExpr(), CGF);
2016db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20179802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // TODO: Allow anything we can constant fold to an integer or fp constant.
20189802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (isa<IntegerLiteral>(E) || isa<CharacterLiteral>(E) ||
20199802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner      isa<FloatingLiteral>(E))
20209802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    return true;
2021db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20229802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // Non-volatile automatic variables too, to get "cond ? X : Y" where
20239802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // X and Y are local variables.
20249802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
20259802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2026df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      if (VD->hasLocalStorage() && !(CGF.getContext()
2027df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                     .getCanonicalType(VD->getType())
2028df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                     .isVolatileQualified()))
20299802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner        return true;
2030db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20319802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  return false;
20329802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner}
20339802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner
20349802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner
20357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::
20367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerVisitConditionalOperator(const ConditionalOperator *E) {
20377f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
203831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  // If the condition constant folds and can be elided, try to avoid emitting
203931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  // the condition and the dead arm.
204031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getCond())){
2041c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner    Expr *Live = E->getLHS(), *Dead = E->getRHS();
204231a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    if (Cond == -1)
2043c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner      std::swap(Live, Dead);
2044db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
204531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // If the dead side doesn't have labels we need, and if the Live side isn't
204631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // the gnu missing ?: extension (which we could handle, but don't bother
204731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // to), just emit the Live part.
204831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    if ((!Dead || !CGF.ContainsLabel(Dead)) &&  // No labels in dead part
204931a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        Live)                                   // Live part isn't missing.
205031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      return Visit(Live);
2051c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner  }
2052db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2053db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20549802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // If this is a really simple expression (like x ? 4 : 5), emit this as a
20559802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // select instead of as control flow.  We can only do this if it is cheap and
2056531a550531c144a58438f187816abbf1879e1c4eChris Lattner  // safe to evaluate the LHS and RHS unconditionally.
2057df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump  if (E->getLHS() && isCheapEnoughToEvaluateUnconditionally(E->getLHS(),
2058df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                                            CGF) &&
2059df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      isCheapEnoughToEvaluateUnconditionally(E->getRHS(), CGF)) {
20609802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *CondV = CGF.EvaluateExprAsBool(E->getCond());
20619802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *LHS = Visit(E->getLHS());
20629802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *RHS = Visit(E->getRHS());
20639802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    return Builder.CreateSelect(CondV, LHS, RHS, "cond");
20649802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  }
2065db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
20665d743fa747281dbecbc0d557035ca44f8a26a342Douglas Gregor  if (!E->getLHS() && CGF.getContext().getLangOptions().CPlusPlus) {
20675d743fa747281dbecbc0d557035ca44f8a26a342Douglas Gregor    // Does not support GNU missing condition extension in C++ yet (see #7726)
20685d743fa747281dbecbc0d557035ca44f8a26a342Douglas Gregor    CGF.ErrorUnsupported(E, "conditional operator with missing LHS");
20695d743fa747281dbecbc0d557035ca44f8a26a342Douglas Gregor    return llvm::UndefValue::get(ConvertType(E->getType()));
20705d743fa747281dbecbc0d557035ca44f8a26a342Douglas Gregor  }
20715d743fa747281dbecbc0d557035ca44f8a26a342Douglas Gregor
2072be65abc8e41213ecb951f2f507fb2e13a151d30cDaniel Dunbar  llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
2073be65abc8e41213ecb951f2f507fb2e13a151d30cDaniel Dunbar  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
20749615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
2075035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner  Value *CondVal = 0;
2076035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner
2077db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // If we don't have the GNU missing condition extension, emit a branch on bool
2078db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // the normal way.
207912d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner  if (E->getLHS()) {
208012d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // Otherwise, just use EmitBranchOnBoolExpr to get small and simple code for
208112d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // the branch on bool.
208212d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
208312d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner  } else {
208412d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // Otherwise, for the ?: extension, evaluate the conditional and then
208512d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // convert it to bool the hard way.  We do this explicitly because we need
208612d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // the unconverted value for the missing middle value of the ?:.
2087035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    CondVal = CGF.EmitScalarExpr(E->getCond());
2088db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
208912d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // In some cases, EmitScalarConversion will delete the "CondVal" expression
209012d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // if there are no extra uses (an optimization).  Inhibit this by making an
209112d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // extra dead use, because we're going to add a use of CondVal later.  We
209212d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // don't use the builder for this, because we don't want it to get optimized
209312d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // away.  This leaves dead code, but the ?: extension isn't common.
209412d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    new llvm::BitCastInst(CondVal, CondVal->getType(), "dummy?:holder",
209512d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner                          Builder.GetInsertBlock());
2096db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2097035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    Value *CondBoolVal =
2098035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner      CGF.EmitScalarConversion(CondVal, E->getCond()->getType(),
2099035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner                               CGF.getContext().BoolTy);
2100035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    Builder.CreateCondBr(CondBoolVal, LHSBlock, RHSBlock);
2101035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner  }
2102fb6fa30a9b06670deb14f862dddbc49a12552939Anders Carlsson
210372119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
21047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(LHSBlock);
2105db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Handle the GNU extension for missing LHS.
2107a21ddb30e56026967d58e26c5212744e1831305bChris Lattner  Value *LHS;
2108a21ddb30e56026967d58e26c5212744e1831305bChris Lattner  if (E->getLHS())
2109856226c37ff10955c7f3f07ce6fa9522da23a3a5Eli Friedman    LHS = Visit(E->getLHS());
2110a21ddb30e56026967d58e26c5212744e1831305bChris Lattner  else    // Perform promotions, to handle cases like "short ?: int"
2111a21ddb30e56026967d58e26c5212744e1831305bChris Lattner    LHS = EmitScalarConversion(CondVal, E->getCond()->getType(), E->getType());
2112db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
211372119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
21147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  LHSBlock = Builder.GetInsertBlock();
2115d57a871339c7c98d58d93108b806f59bdf4e13e2Daniel Dunbar  CGF.EmitBranch(ContBlock);
2116db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
211772119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
21187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
2119db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2120856226c37ff10955c7f3f07ce6fa9522da23a3a5Eli Friedman  Value *RHS = Visit(E->getRHS());
212172119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
21227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
2123d57a871339c7c98d58d93108b806f59bdf4e13e2Daniel Dunbar  CGF.EmitBranch(ContBlock);
2124db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(ContBlock);
2126db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
212748daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  // If the LHS or RHS is a throw expression, it will be legitimately null.
212848daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  if (!LHS)
212948daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman    return RHS;
213048daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  if (!RHS)
213148daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman    return LHS;
2132db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Create a PHI node for the real part.
21347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  llvm::PHINode *PN = Builder.CreatePHI(LHS->getType(), "cond");
21357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->reserveOperandSpace(2);
21367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(LHS, LHSBlock);
21377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHS, RHSBlock);
21387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return PN;
21397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
21407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
21417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitChooseExpr(ChooseExpr *E) {
21427976932a1c256d447316ffac58e9821417725e34Eli Friedman  return Visit(E->getChosenSubExpr(CGF.getContext()));
21437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
21447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
21452202bce80fc72d067cbe67dc1512f7b45351fd31Chris LattnerValue *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE) {
21464fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedman  llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr());
2147ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType());
2148ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson
2149ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  // If EmitVAArg fails, we fall back to the LLVM instruction.
2150db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  if (!ArgPtr)
2151ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson    return Builder.CreateVAArg(ArgValue, ConvertType(VE->getType()));
2152ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson
21537f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // FIXME Volatility.
2154ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  return Builder.CreateLoad(ArgPtr);
21557c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
21567c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
2157df6b68c9487aed2042c7fc23db10a79f89083a11Mike StumpValue *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *BE) {
21580892099dbc640720400a1d9decd2733a09d733e5Mike Stump  return CGF.BuildBlockLiteralTmp(BE);
2159df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump}
2160df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump
21617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
21627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                         Entry Point into this File
21637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
21647f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
2165db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitScalarExpr - Emit the computation of the specified expression of scalar
2166db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type, ignoring the result.
21677f79f9be5916c51c35da4f126b7c12596a101607Mike StumpValue *CodeGenFunction::EmitScalarExpr(const Expr *E, bool IgnoreResultAssign) {
21687f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  assert(E && !hasAggregateLLVMType(E->getType()) &&
21697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner         "Invalid scalar expression to emit");
2170db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
21717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  return ScalarExprEmitter(*this, IgnoreResultAssign)
21727f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    .Visit(const_cast<Expr*>(E));
21737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
21743707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
21753707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// EmitScalarConversion - Emit a conversion from the specified type to the
21763707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// specified destination type, both of which are LLVM scalar types.
21774f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *CodeGenFunction::EmitScalarConversion(Value *Src, QualType SrcTy,
21784f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                             QualType DstTy) {
21793707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  assert(!hasAggregateLLVMType(SrcTy) && !hasAggregateLLVMType(DstTy) &&
21803707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner         "Invalid scalar expression to emit");
21813707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  return ScalarExprEmitter(*this).EmitScalarConversion(Src, SrcTy, DstTy);
21823707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner}
21834f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
2184db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitComplexToScalarConversion - Emit a conversion from the specified complex
2185db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type to the specified destination type, where the destination type is an
2186db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// LLVM scalar type.
21874f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *CodeGenFunction::EmitComplexToScalarConversion(ComplexPairTy Src,
21884f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                      QualType SrcTy,
21894f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                      QualType DstTy) {
21909b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  assert(SrcTy->isAnyComplexType() && !hasAggregateLLVMType(DstTy) &&
21914f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner         "Invalid complex -> scalar conversion");
21924f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  return ScalarExprEmitter(*this).EmitComplexToScalarConversion(Src, SrcTy,
21934f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                                DstTy);
21944f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner}
2195cc23acae84c6d5c37b4805edbcd95ee5d821c400Anders Carlsson
21968c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
21978c11a65c18ae607b7073e1e451264492d2297726Chris Lattnerllvm::Value *CodeGenFunction::
21988c11a65c18ae607b7073e1e451264492d2297726Chris LattnerEmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
21998c11a65c18ae607b7073e1e451264492d2297726Chris Lattner                        bool isInc, bool isPre) {
22008c11a65c18ae607b7073e1e451264492d2297726Chris Lattner  return ScalarExprEmitter(*this).EmitScalarPrePostIncDec(E, LV, isInc, isPre);
22018c11a65c18ae607b7073e1e451264492d2297726Chris Lattner}
22028c11a65c18ae607b7073e1e451264492d2297726Chris Lattner
2203820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz JahanianLValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
2204820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  llvm::Value *V;
2205820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // object->isa or (*object).isa
2206820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // Generate code as for: *(Class*)object
22075ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  // build Class* type
22085ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  const llvm::Type *ClassPtrTy = ConvertType(E->getType());
22095ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian
2210820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  Expr *BaseExpr = E->getBase();
22115ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  if (BaseExpr->isLvalue(getContext()) != Expr::LV_Valid) {
22125ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    V = CreateTempAlloca(ClassPtrTy, "resval");
22135ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    llvm::Value *Src = EmitScalarExpr(BaseExpr);
22145ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    Builder.CreateStore(Src, V);
22159f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    V = ScalarExprEmitter(*this).EmitLoadOfLValue(
22169f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar      MakeAddrLValue(V, E->getType()), E->getType());
22179f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar  } else {
22189f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    if (E->isArrow())
22199f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar      V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
22209f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar    else
22219f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar      V = EmitLValue(BaseExpr).getAddress();
22225ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  }
2223820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian
2224820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // build Class* type
2225820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  ClassPtrTy = ClassPtrTy->getPointerTo();
2226820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  V = Builder.CreateBitCast(V, ClassPtrTy);
22279f553f5b3bd45304dfda6bdc5cd2baac64b3315bDaniel Dunbar  return MakeAddrLValue(V, E->getType());
2228820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian}
2229820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian
22306a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
22316a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas GregorLValue CodeGenFunction::EmitCompoundAssignOperatorLValue(
22326a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor                                            const CompoundAssignOperator *E) {
22336a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  ScalarExprEmitter Scalar(*this);
2234d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar  Value *Result = 0;
22356a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  switch (E->getOpcode()) {
22366a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor#define COMPOUND_OP(Op)                                                       \
22376a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor    case BinaryOperator::Op##Assign:                                          \
22386a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor      return Scalar.EmitCompoundAssignLValue(E, &ScalarExprEmitter::Emit##Op, \
2239d7f7d0895dc43db20c43112a24684f11eed305deDaniel Dunbar                                             Result)
22406a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Mul);
22416a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Div);
22426a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Rem);
22436a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Add);
22446a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Sub);
22456a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Shl);
22466a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Shr);
22476a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(And);
22486a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Xor);
22496a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  COMPOUND_OP(Or);
22506a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor#undef COMPOUND_OP
22516a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
22526a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::PtrMemD:
22536a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::PtrMemI:
22546a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Mul:
22556a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Div:
22566a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Rem:
22576a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Add:
22586a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Sub:
22596a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Shl:
22606a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Shr:
22616a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::LT:
22626a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::GT:
22636a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::LE:
22646a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::GE:
22656a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::EQ:
22666a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::NE:
22676a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::And:
22686a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Xor:
22696a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Or:
22706a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::LAnd:
22716a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::LOr:
22726a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Assign:
22736a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  case BinaryOperator::Comma:
22746a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor    assert(false && "Not valid compound assignment operators");
22756a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor    break;
22766a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  }
22776a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor
22786a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor  llvm_unreachable("Unhandled compound assignment operator");
22796a03e345bb3c971750920e34a0d7d1ea7c9eceb7Douglas Gregor}
2280