CGExprScalar.cpp revision f177d9d6c27fbbcee8c00fd90b8306985c03c54a
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.
437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  const BinaryOperator *E;
447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner};
457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnernamespace {
4785b4521e34dcd4a0a4a1f0819e1123128e5a3125Benjamin Kramerclass ScalarExprEmitter
487f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  : public StmtVisitor<ScalarExprEmitter, Value*> {
497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CodeGenFunction &CGF;
5045d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar  CGBuilderTy &Builder;
517f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool IgnoreResultAssign;
52a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson  llvm::LLVMContext &VMContext;
537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerpublic:
547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
557f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  ScalarExprEmitter(CodeGenFunction &cgf, bool ira=false)
56db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    : CGF(cgf), Builder(CGF.Builder), IgnoreResultAssign(ira),
57a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson      VMContext(cgf.getLLVMContext()) {
587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
59db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //                               Utilities
627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
647f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool TestAndClearIgnoreResultAssign() {
659c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    bool I = IgnoreResultAssign;
669c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    IgnoreResultAssign = false;
679c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    return I;
689c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner  }
697f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  const llvm::Type *ConvertType(QualType T) { return CGF.ConvertType(T); }
717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  LValue EmitLValue(const Expr *E) { return CGF.EmitLValue(E); }
72b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue EmitCheckedLValue(const Expr *E) { return CGF.EmitCheckedLValue(E); }
737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitLoadOfLValue(LValue LV, QualType T) {
759b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return CGF.EmitLoadOfLValue(LV, T).getScalarVal();
767f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
77db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
787f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// EmitLoadOfLValue - Given an expression with complex type that represents a
797f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// value l-value, this method emits the address of the l-value, then loads
807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// and returns the result.
817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitLoadOfLValue(const Expr *E) {
82b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump    return EmitLoadOfLValue(EmitCheckedLValue(E), E->getType());
837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
84db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
859abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  /// EmitConversionToBool - Convert the specified expression value to a
863420d0de2c52fedf771d7ef20522f6080233e377Chris Lattner  /// boolean (i1) truth value.  This is equivalent to "Val != 0".
879abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  Value *EmitConversionToBool(Value *Src, QualType DstTy);
88db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
893707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// EmitScalarConversion - Emit a conversion from the specified type to the
903707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// specified destination type, both of which are LLVM scalar types.
914f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *EmitScalarConversion(Value *Src, QualType SrcTy, QualType DstTy);
924f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
934f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  /// EmitComplexToScalarConversion - Emit a conversion from the specified
94db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  /// complex type to the specified destination type, where the destination type
95db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  /// is an LLVM scalar type.
964f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *EmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
974f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                       QualType SrcTy, QualType DstTy);
98df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump
997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
1007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //                            Visitor Methods
1017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  //===--------------------------------------------------------------------===//
1027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitStmt(Stmt *S) {
1047a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek    S->dump(CGF.getContext().getSourceManager());
1057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    assert(0 && "Stmt can't have complex result type!");
1067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return 0;
1077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitExpr(Expr *S);
109f51dc64f90851f636302dbaaf3f52c0524cdac36Fariborz Jahanian
1107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr()); }
1117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Leaves.
1137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitIntegerLiteral(const IntegerLiteral *E) {
1144a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(VMContext, E->getValue());
1157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitFloatingLiteral(const FloatingLiteral *E) {
117bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson    return llvm::ConstantFP::get(VMContext, E->getValue());
1187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitCharacterLiteral(const CharacterLiteral *E) {
1204a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
121e7579b57eb3eabfd3545b86320fb67466730e9fcNate Begeman  }
122e7579b57eb3eabfd3545b86320fb67466730e9fcNate Begeman  Value *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
1234a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
1247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1257267f7832e5f0c7f951765e201c5a2650eb1637bArgyrios Kyrtzidis  Value *VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
126c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson    return llvm::Constant::getNullValue(ConvertType(E->getType()));
1277267f7832e5f0c7f951765e201c5a2650eb1637bArgyrios Kyrtzidis  }
1283f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  Value *VisitGNUNullExpr(const GNUNullExpr *E) {
129c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson    return llvm::Constant::getNullValue(ConvertType(E->getType()));
1303f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
1317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
1324a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson    return llvm::ConstantInt::get(ConvertType(E->getType()),
133ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff                                  CGF.getContext().typesAreCompatible(
134ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff                                    E->getArgType1(), E->getArgType2()));
1357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
1360518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  Value *VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
1370ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar  Value *VisitAddrLabelExpr(const AddrLabelExpr *E) {
138d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    llvm::Value *V = CGF.GetAddrOfLabel(E->getLabel());
139d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner    return Builder.CreateBitCast(V, ConvertType(E->getType()));
1400ffb125996336fc7602b162c0a9e392f1a93060fDaniel Dunbar  }
141db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // l-values.
1437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitDeclRefExpr(DeclRefExpr *E) {
14428665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    Expr::EvalResult Result;
14528665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    if (E->Evaluate(Result, CGF.getContext()) && Result.Val.isInt()) {
14628665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      assert(!Result.HasSideEffects && "Constant declref with side-effect?!");
14728665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      return llvm::ConstantInt::get(VMContext, Result.Val.getInt());
14828665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    }
1497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLoadOfLValue(E);
1507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
151db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
152db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    return CGF.EmitObjCSelectorExpr(E);
1539c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
154db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
155db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    return CGF.EmitObjCProtocolExpr(E);
1569c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
157db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1589c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar    return EmitLoadOfLValue(E);
1599c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
1600a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar  Value *VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
16185c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar    return EmitLoadOfLValue(E);
1629c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  }
16309105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian  Value *VisitObjCImplicitSetterGetterRefExpr(
16409105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                        ObjCImplicitSetterGetterRefExpr *E) {
16543f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian    return EmitLoadOfLValue(E);
16643f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian  }
1679c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar  Value *VisitObjCMessageExpr(ObjCMessageExpr *E) {
1689c3fc703b29a31d40bcf5027dbb4784dd393804eDaniel Dunbar    return CGF.EmitObjCMessageExpr(E).getScalarVal();
1690a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar  }
1700a04d77bde7e3a661c2b41b60630d125d09ed6efDaniel Dunbar
17183dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian  Value *VisitObjCIsaExpr(ObjCIsaExpr *E) {
172820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian    LValue LV = CGF.EmitObjCIsaExpr(E);
173820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian    Value *V = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
17483dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian    return V;
17583dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian  }
17683dc32594cde6bd083bd8b98b24bde2346585cadFariborz Jahanian
1777f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
178d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value *VisitShuffleVectorExpr(ShuffleVectorExpr *E);
17928665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  Value *VisitMemberExpr(MemberExpr *E);
180213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  Value *VisitExtVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); }
181be20bb558cae5352898e6a913e29d24d20134841Chris Lattner  Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
182be20bb558cae5352898e6a913e29d24d20134841Chris Lattner    return EmitLoadOfLValue(E);
183be20bb558cae5352898e6a913e29d24d20134841Chris Lattner  }
18435634f5ed67966c9f1fde38420e79cc6515cd673Devang Patel
1850533b3020ca39898751d4200feed776861dcd1ceNate Begeman  Value *VisitInitListExpr(InitListExpr *E);
186db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1873498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  Value *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
188c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson    return llvm::Constant::getNullValue(ConvertType(E->getType()));
1893498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  }
190d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Value *VisitCastExpr(CastExpr *E) {
191c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman    // Make sure to evaluate VLA bounds now so that we have them for later.
192c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman    if (E->getType()->isVariablyModifiedType())
193c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman      CGF.EmitVLASize(E->getType());
194c62aad8f45ec3dd893376bd1c51e5e8019a76d8eEli Friedman
195592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson    return EmitCastExpr(E);
1967f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
197d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Value *EmitCastExpr(CastExpr *E);
1987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitCallExpr(const CallExpr *E) {
200e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson    if (E->getCallReturnType()->isReferenceType())
201e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson      return EmitLoadOfLValue(E);
202db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2039b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return CGF.EmitCallExpr(E).getScalarVal();
2047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2058f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar
2063379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner  Value *VisitStmtExpr(const StmtExpr *E);
2074e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump
208a99038c0757a836c6faeeddaa5dfd249b32f6e9eMike Stump  Value *VisitBlockDeclRefExpr(const BlockDeclRefExpr *E);
209db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Unary Operators.
211dd36d328730d8c02915d0884541b45ec6ca0049dChris Lattner  Value *VisitPrePostIncDec(const UnaryOperator *E, bool isInc, bool isPre) {
212dd36d328730d8c02915d0884541b45ec6ca0049dChris Lattner    LValue LV = EmitLValue(E->getSubExpr());
213dd36d328730d8c02915d0884541b45ec6ca0049dChris Lattner    return CGF.EmitScalarPrePostIncDec(E, LV, isInc, isPre);
214dd36d328730d8c02915d0884541b45ec6ca0049dChris Lattner  }
2157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPostDec(const UnaryOperator *E) {
2167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return VisitPrePostIncDec(E, false, false);
2177f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPostInc(const UnaryOperator *E) {
2197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return VisitPrePostIncDec(E, true, false);
2207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPreDec(const UnaryOperator *E) {
2227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return VisitPrePostIncDec(E, false, true);
2237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPreInc(const UnaryOperator *E) {
2257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return VisitPrePostIncDec(E, true, true);
2267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryAddrOf(const UnaryOperator *E) {
2287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLValue(E->getSubExpr()).getAddress();
2297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
2317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryPlus(const UnaryOperator *E) {
2327f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    // This differs from gcc, though, most likely due to a bug in gcc.
2337f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    TestAndClearIgnoreResultAssign();
2347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Visit(E->getSubExpr());
2357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryMinus    (const UnaryOperator *E);
2377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryNot      (const UnaryOperator *E);
2387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryLNot     (const UnaryOperator *E);
23946f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Value *VisitUnaryReal     (const UnaryOperator *E);
24046f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Value *VisitUnaryImag     (const UnaryOperator *E);
2417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitUnaryExtension(const UnaryOperator *E) {
2427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Visit(E->getSubExpr());
2437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2445a1deb8d9c0722beae28d693fa137bbb942bd11fAnders Carlsson  Value *VisitUnaryOffsetOf(const UnaryOperator *E);
245db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2465f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson  // C++
24704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  Value *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
24804421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    return Visit(DAE->getExpr());
24904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  }
2505f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson  Value *VisitCXXThisExpr(CXXThisExpr *TE) {
2515f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson    return CGF.LoadCXXThis();
252db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
253db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
2547f6ad153565245026c7569314f65a4d4ff4ac41fAnders Carlsson  Value *VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
2553082463f4f387b725f4e4bf7d7b46269d445e4f5Anders Carlsson    return CGF.EmitCXXExprWithTemporaries(E).getScalarVal();
2567f6ad153565245026c7569314f65a4d4ff4ac41fAnders Carlsson  }
257a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson  Value *VisitCXXNewExpr(const CXXNewExpr *E) {
258a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson    return CGF.EmitCXXNewExpr(E);
259a00703dccbdc6cc4a293db38477dea7db5538c7eAnders Carlsson  }
26060e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson  Value *VisitCXXDeleteExpr(const CXXDeleteExpr *E) {
26160e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson    CGF.EmitCXXDeleteExpr(E);
26260e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson    return 0;
26360e282cc1e508be327b0481cecedc206873cb86aAnders Carlsson  }
2649dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman  Value *VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
2659dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman    return llvm::ConstantInt::get(Builder.getInt1Ty(),
2669dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman                                  E->EvaluateTrait(CGF.getContext()));
2679dfebdcdcdcc0cad8a3ef205d33b84f33233072bEli Friedman  }
268db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
269a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  Value *VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E) {
270a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    // C++ [expr.pseudo]p1:
271db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    //   The result shall only be used as the operand for the function call
272a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   operator (), and the result of such a call has type void. The only
273a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   effect is the evaluation of the postfix-expression before the dot or
274a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    //   arrow.
275a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CGF.EmitScalarExpr(E->getBase());
276a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return 0;
277a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
278db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
279c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson  Value *VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) {
280c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson    return llvm::Constant::getNullValue(ConvertType(E->getType()));
281c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson  }
282756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson
283756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson  Value *VisitCXXThrowExpr(const CXXThrowExpr *E) {
284756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson    CGF.EmitCXXThrowExpr(E);
285756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson    return 0;
286756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson  }
287756b5c4f9d52642d87d1948bee58f97a4f795b24Anders Carlsson
2887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Binary Operators.
2897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitMul(const BinOpInfo &Ops) {
290035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    if (CGF.getContext().getLangOptions().OverflowChecking
291035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump        && Ops.Ty->isSignedIntegerType())
2922add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump      return EmitOverflowCheckedBinOp(Ops);
293f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
29487415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFMul(Ops.LHS, Ops.RHS, "mul");
2957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul");
2967f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
2972add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  /// Create a binary op that checks for overflow.
2982add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  /// Currently only supports +, - and *.
2992add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *EmitOverflowCheckedBinOp(const BinOpInfo &Ops);
3007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitDiv(const BinOpInfo &Ops);
3017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitRem(const BinOpInfo &Ops);
3027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitAdd(const BinOpInfo &Ops);
3037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitSub(const BinOpInfo &Ops);
3047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitShl(const BinOpInfo &Ops);
3057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitShr(const BinOpInfo &Ops);
3067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitAnd(const BinOpInfo &Ops) {
3077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateAnd(Ops.LHS, Ops.RHS, "and");
3087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitXor(const BinOpInfo &Ops) {
3107f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateXor(Ops.LHS, Ops.RHS, "xor");
3117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitOr (const BinOpInfo &Ops) {
3137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateOr(Ops.LHS, Ops.RHS, "or");
3147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
3161f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  BinOpInfo EmitBinOps(const BinaryOperator *E);
3173ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *EmitCompoundAssign(const CompoundAssignOperator *E,
3181f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner                            Value *(ScalarExprEmitter::*F)(const BinOpInfo &));
3191f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
3201f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  // Binary operators and binary compound assignment operators.
3211f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner#define HANDLEBINOP(OP) \
3223ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *VisitBin ## OP(const BinaryOperator *E) {                         \
3233ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner    return Emit ## OP(EmitBinOps(E));                                      \
3243ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  }                                                                        \
3253ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner  Value *VisitBin ## OP ## Assign(const CompoundAssignOperator *E) {       \
3263ccf774256382ef9aa95028eaad82f54a3d0b0adChris Lattner    return EmitCompoundAssign(E, &ScalarExprEmitter::Emit ## OP);          \
3271f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  }
3287177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Mul)
3297177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Div)
3307177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Rem)
3317177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Add)
3327177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Sub)
3337177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Shl)
3347177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Shr)
3357177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(And)
3367177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Xor)
3377177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  HANDLEBINOP(Or)
3381f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner#undef HANDLEBINOP
3398c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar
3407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Comparisons.
3417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *EmitCompare(const BinaryOperator *E, unsigned UICmpOpc,
3427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                     unsigned SICmpOpc, unsigned FCmpOpc);
3437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#define VISITCOMP(CODE, UI, SI, FP) \
3447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *VisitBin##CODE(const BinaryOperator *E) { \
3457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      return EmitCompare(E, llvm::ICmpInst::UI, llvm::ICmpInst::SI, \
3467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                         llvm::FCmpInst::FP); }
3477177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(LT, ICMP_ULT, ICMP_SLT, FCMP_OLT)
3487177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(GT, ICMP_UGT, ICMP_SGT, FCMP_OGT)
3497177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(LE, ICMP_ULE, ICMP_SLE, FCMP_OLE)
3507177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(GE, ICMP_UGE, ICMP_SGE, FCMP_OGE)
3517177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(EQ, ICMP_EQ , ICMP_EQ , FCMP_OEQ)
3527177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  VISITCOMP(NE, ICMP_NE , ICMP_NE , FCMP_UNE)
3537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner#undef VISITCOMP
354db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
3557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinAssign     (const BinaryOperator *E);
3567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
3577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinLAnd       (const BinaryOperator *E);
3587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinLOr        (const BinaryOperator *E);
3597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitBinComma      (const BinaryOperator *E);
3607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
36125b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman  Value *VisitBinPtrMemD(const Expr *E) { return EmitLoadOfLValue(E); }
36225b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman  Value *VisitBinPtrMemI(const Expr *E) { return EmitLoadOfLValue(E); }
36325b825d1a48fb4d64cb553bef7a316469e89c46aEli Friedman
3647f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Other Operators.
365df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump  Value *VisitBlockExpr(const BlockExpr *BE);
3667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitConditionalOperator(const ConditionalOperator *CO);
3677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitChooseExpr(ChooseExpr *CE);
3687c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  Value *VisitVAArgExpr(VAArgExpr *VE);
3697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *VisitObjCStringLiteral(const ObjCStringLiteral *E) {
3707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return CGF.EmitObjCStringLiteral(E);
3717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
3727f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner};
3737f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}  // end anonymous namespace.
3747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
3757f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
3767f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                                Utilities
3777f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
3787f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
3799abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner/// EmitConversionToBool - Convert the specified expression value to a
3803420d0de2c52fedf771d7ef20522f6080233e377Chris Lattner/// boolean (i1) truth value.  This is equivalent to "Val != 0".
3819abc84e7ac4db891209fe67cc3a8c9690dc886efChris LattnerValue *ScalarExprEmitter::EmitConversionToBool(Value *Src, QualType SrcType) {
382467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(SrcType.isCanonical() && "EmitScalarConversion strips typedefs");
383db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
3849abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  if (SrcType->isRealFloatingType()) {
3859abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    // Compare against 0.0 for fp scalars.
386c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson    llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
3879abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    return Builder.CreateFCmpUNE(Src, Zero, "tobool");
3889abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  }
389db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
390237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson  if (SrcType->isMemberPointerType()) {
391237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    // Compare against -1.
392237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    llvm::Value *NegativeOne = llvm::Constant::getAllOnesValue(Src->getType());
393237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    return Builder.CreateICmpNE(Src, NegativeOne, "tobool");
394237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson  }
395db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
396d1d66bcd6914ff82abdfa88dd25bb0b74cde3b99Daniel Dunbar  assert((SrcType->isIntegerType() || isa<llvm::PointerType>(Src->getType())) &&
3979abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner         "Unknown scalar type to convert");
398db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
3999abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Because of the type rules of C, we often end up computing a logical value,
4009abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // then zero extending it to int, then wanting it as a logical value again.
4019abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Optimize this common case.
4029abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  if (llvm::ZExtInst *ZI = dyn_cast<llvm::ZExtInst>(Src)) {
4030032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    if (ZI->getOperand(0)->getType() ==
4040032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson        llvm::Type::getInt1Ty(CGF.getLLVMContext())) {
4059abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner      Value *Result = ZI->getOperand(0);
406356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // If there aren't any more uses, zap the instruction to save space.
407356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // Note that there can be more uses, for example if this
408356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      // is the result of an assignment.
409356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman      if (ZI->use_empty())
410356916ec84826a793b0353e5db0e9a7589b9ec5cEli Friedman        ZI->eraseFromParent();
4119abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner      return Result;
4129abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner    }
4139abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  }
414db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4159abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  // Compare against an integer or pointer null.
416c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson  llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
4179abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner  return Builder.CreateICmpNE(Src, Zero, "tobool");
4189abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner}
4199abc84e7ac4db891209fe67cc3a8c9690dc886efChris Lattner
4203707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// EmitScalarConversion - Emit a conversion from the specified type to the
4213707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// specified destination type, both of which are LLVM scalar types.
4224f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
4234f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                               QualType DstType) {
4249619662a1d42e2008b865d3459c0677e149dad1bChris Lattner  SrcType = CGF.getContext().getCanonicalType(SrcType);
4259619662a1d42e2008b865d3459c0677e149dad1bChris Lattner  DstType = CGF.getContext().getCanonicalType(DstType);
4263707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (SrcType == DstType) return Src;
427db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
428cf289083ab007264fa3ea96d92f133339aee5d2dChris Lattner  if (DstType->isVoidType()) return 0;
429db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4300032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::LLVMContext &VMContext = CGF.getLLVMContext();
4313707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
4323707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Handle conversions to bool first, they are special: comparisons against 0.
433ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  if (DstType->isBooleanType())
434ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    return EmitConversionToBool(Src, SrcType);
435db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4363707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  const llvm::Type *DstTy = ConvertType(DstType);
4373707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
4383707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Ignore conversions like int -> uint.
4393707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (Src->getType() == DstTy)
4403707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    return Src;
4413707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
442db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Handle pointer conversions next: pointers can only be converted to/from
443db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // other pointers and integers. Check for pointer types in terms of LLVM, as
444db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // some native types (like Obj-C id) may map to a pointer type.
445270cc66683b22d6bb0b4644f5a40f84d45edf119Daniel Dunbar  if (isa<llvm::PointerType>(DstTy)) {
4463707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // The source value may be an integer, or a pointer.
447191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    if (isa<llvm::PointerType>(Src->getType()))
4483707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner      return Builder.CreateBitCast(Src, DstTy, "conv");
449191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
4503707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    assert(SrcType->isIntegerType() && "Not ptr->ptr or int->ptr conversion?");
45125615424741bcce31fe52c896f76268f0307f00dEli Friedman    // First, convert to the correct width so that we control the kind of
45225615424741bcce31fe52c896f76268f0307f00dEli Friedman    // extension.
453db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    const llvm::Type *MiddleTy =
4540032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson          llvm::IntegerType::get(VMContext, CGF.LLVMPointerWidth);
45525615424741bcce31fe52c896f76268f0307f00dEli Friedman    bool InputSigned = SrcType->isSignedIntegerType();
45625615424741bcce31fe52c896f76268f0307f00dEli Friedman    llvm::Value* IntResult =
45725615424741bcce31fe52c896f76268f0307f00dEli Friedman        Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
45825615424741bcce31fe52c896f76268f0307f00dEli Friedman    // Then, cast to pointer.
45925615424741bcce31fe52c896f76268f0307f00dEli Friedman    return Builder.CreateIntToPtr(IntResult, DstTy, "conv");
4603707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
461db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
462270cc66683b22d6bb0b4644f5a40f84d45edf119Daniel Dunbar  if (isa<llvm::PointerType>(Src->getType())) {
4633707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // Must be an ptr to int cast.
4643707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    assert(isa<llvm::IntegerType>(DstTy) && "not ptr->int?");
46550b5a30db40322880340e957ad7d6d8d60bb4c5bAnders Carlsson    return Builder.CreatePtrToInt(Src, DstTy, "conv");
4663707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
467db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
468213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // A scalar can be splatted to an extended vector of the same element type
4692ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  if (DstType->isExtVectorType() && !SrcType->isVectorType()) {
4706fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Cast the scalar to element type
471183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    QualType EltTy = DstType->getAs<ExtVectorType>()->getElementType();
4726fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::Value *Elt = EmitScalarConversion(Src, SrcType, EltTy);
4736fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman
4746fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Insert the element in element zero of an undef vector
47503e205031b08669f05c41eed5b896fc94c4a12bbOwen Anderson    llvm::Value *UnV = llvm::UndefValue::get(DstTy);
4760032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    llvm::Value *Idx =
4770032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson        llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 0);
4786fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp");
4796fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman
4806fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // Splat the element across to all elements
4816fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::SmallVector<llvm::Constant*, 16> Args;
4826fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();
4836fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    for (unsigned i = 0; i < NumElements; i++)
4840032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      Args.push_back(llvm::ConstantInt::get(
4850032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                        llvm::Type::getInt32Ty(VMContext), 0));
486db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4874a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], NumElements);
4886fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    llvm::Value *Yay = Builder.CreateShuffleVector(UnV, UnV, Mask, "splat");
4896fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    return Yay;
4906fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman  }
4914119d1aeca8016654d381ce079864058d1709571Nate Begeman
4923b1ae004d0ee88fc029dad876ec5695f178ef3f6Chris Lattner  // Allow bitcast from vector to integer/fp of the same size.
4937019a9ea3f5d6f8cdf5e2e31f74b4df53e3ffcddAnders Carlsson  if (isa<llvm::VectorType>(Src->getType()) ||
4943b1ae004d0ee88fc029dad876ec5695f178ef3f6Chris Lattner      isa<llvm::VectorType>(DstTy))
4957019a9ea3f5d6f8cdf5e2e31f74b4df53e3ffcddAnders Carlsson    return Builder.CreateBitCast(Src, DstTy, "conv");
496db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
4973707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  // Finally, we have the arithmetic types: real int/float.
4983707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (isa<llvm::IntegerType>(Src->getType())) {
4993707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    bool InputSigned = SrcType->isSignedIntegerType();
500b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    if (isa<llvm::IntegerType>(DstTy))
501b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateIntCast(Src, DstTy, InputSigned, "conv");
502b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else if (InputSigned)
503b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateSIToFP(Src, DstTy, "conv");
504b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else
505b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateUIToFP(Src, DstTy, "conv");
5063707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
507db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
508f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  assert(Src->getType()->isFloatingPointTy() && "Unknown real conversion");
5093707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  if (isa<llvm::IntegerType>(DstTy)) {
510b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    if (DstType->isSignedIntegerType())
511b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateFPToSI(Src, DstTy, "conv");
512b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    else
513b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson      return Builder.CreateFPToUI(Src, DstTy, "conv");
5143707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
5153707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
516f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  assert(DstTy->isFloatingPointTy() && "Unknown real conversion");
517b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson  if (DstTy->getTypeID() < Src->getType()->getTypeID())
518b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    return Builder.CreateFPTrunc(Src, DstTy, "conv");
519b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson  else
520b5ce097bb741733e24efd7803f29849be227f8ceAnders Carlsson    return Builder.CreateFPExt(Src, DstTy, "conv");
5213707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner}
5223707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
523db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitComplexToScalarConversion - Emit a conversion from the specified complex
524db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type to the specified destination type, where the destination type is an
525db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// LLVM scalar type.
5264f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *ScalarExprEmitter::
5274f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerEmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
5284f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                              QualType SrcTy, QualType DstTy) {
529ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  // Get the source element type.
530183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  SrcTy = SrcTy->getAs<ComplexType>()->getElementType();
531db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
532ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  // Handle conversions to bool first, they are special: comparisons against 0.
533ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  if (DstTy->isBooleanType()) {
534ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    //  Complex != 0  -> (Real != 0) | (Imag != 0)
535ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    Src.first  = EmitScalarConversion(Src.first, SrcTy, DstTy);
536ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    Src.second = EmitScalarConversion(Src.second, SrcTy, DstTy);
537ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner    return Builder.CreateOr(Src.first, Src.second, "tobool");
538ed70f0a53610e5e4d4a62cfc0be48d8c1539b5ffChris Lattner  }
539db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5404f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // C99 6.3.1.7p2: "When a value of complex type is converted to a real type,
5414f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // the imaginary part of the complex value is discarded and the value of the
5424f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  // real part is converted according to the conversion rules for the
543db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // corresponding real type.
5444f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  return EmitScalarConversion(Src.first, SrcTy, DstTy);
5454f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner}
5464f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
5474f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
5487f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
5497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                            Visitor Methods
5507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
5517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
5527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitExpr(Expr *E) {
553488e993a135ce700b982bf099c3d6b856301d642Daniel Dunbar  CGF.ErrorUnsupported(E, "scalar expression");
5547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (E->getType()->isVoidType())
5557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return 0;
55603e205031b08669f05c41eed5b896fc94c4a12bbOwen Anderson  return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
5577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
5587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
559d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanValue *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
560d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  llvm::SmallVector<llvm::Constant*, 32> indices;
561d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  for (unsigned i = 2; i < E->getNumSubExprs(); i++) {
562d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    indices.push_back(cast<llvm::Constant>(CGF.EmitScalarExpr(E->getExpr(i))));
563d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
564d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value* V1 = CGF.EmitScalarExpr(E->getExpr(0));
565d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Value* V2 = CGF.EmitScalarExpr(E->getExpr(1));
5664a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson  Value* SV = llvm::ConstantVector::get(indices.begin(), indices.size());
567d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  return Builder.CreateShuffleVector(V1, V2, SV, "shuffle");
568d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}
56928665272c36cccb1014a6ea1217354b0519e2b59Eli FriedmanValue *ScalarExprEmitter::VisitMemberExpr(MemberExpr *E) {
57028665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  Expr::EvalResult Result;
57128665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  if (E->Evaluate(Result, CGF.getContext()) && Result.Val.isInt()) {
57228665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    if (E->isArrow())
57328665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      CGF.EmitScalarExpr(E->getBase());
57428665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    else
57528665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman      EmitLValue(E->getBase());
57628665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman    return llvm::ConstantInt::get(VMContext, Result.Val.getInt());
57728665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  }
57828665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman  return EmitLoadOfLValue(E);
57928665272c36cccb1014a6ea1217354b0519e2b59Eli Friedman}
580d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
5817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
5827f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
5837f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
5847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Emit subscript expressions in rvalue context's.  For most cases, this just
5857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // loads the lvalue formed by the subscript expr.  However, we have to be
5867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // careful, because the base of a vector subscript is occasionally an rvalue,
5877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // so we can't get it as an lvalue.
5887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (!E->getBase()->getType()->isVectorType())
5897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return EmitLoadOfLValue(E);
590db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
5917f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Handle the vector case.  The base must be a vector, the index must be an
5927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // integer value.
5937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Base = Visit(E->getBase());
5947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Idx  = Visit(E->getIdx());
595daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  bool IdxSigned = E->getIdx()->getType()->isSignedIntegerType();
5960032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  Idx = Builder.CreateIntCast(Idx,
597db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump                              llvm::Type::getInt32Ty(CGF.getLLVMContext()),
5980032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                              IdxSigned,
599515ff5a31d75df9f4f099458a31cd7a405cf513dEli Friedman                              "vecidxcast");
6007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateExtractElement(Base, Idx, "vecext");
6017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
6027f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
6030533b3020ca39898751d4200feed776861dcd1ceNate Begemanstatic llvm::Constant *getMaskElt(llvm::ShuffleVectorInst *SVI, unsigned Idx,
6040533b3020ca39898751d4200feed776861dcd1ceNate Begeman                                  unsigned Off, const llvm::Type *I32Ty) {
6050533b3020ca39898751d4200feed776861dcd1ceNate Begeman  int MV = SVI->getMaskValue(Idx);
6060533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (MV == -1)
6070533b3020ca39898751d4200feed776861dcd1ceNate Begeman    return llvm::UndefValue::get(I32Ty);
6080533b3020ca39898751d4200feed776861dcd1ceNate Begeman  return llvm::ConstantInt::get(I32Ty, Off+MV);
6090533b3020ca39898751d4200feed776861dcd1ceNate Begeman}
6100533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6110533b3020ca39898751d4200feed776861dcd1ceNate BegemanValue *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {
6120533b3020ca39898751d4200feed776861dcd1ceNate Begeman  bool Ignore = TestAndClearIgnoreResultAssign();
6130533b3020ca39898751d4200feed776861dcd1ceNate Begeman  (void)Ignore;
6140533b3020ca39898751d4200feed776861dcd1ceNate Begeman  assert (Ignore == false && "init list ignored");
6150533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned NumInitElements = E->getNumInits();
6160533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6170533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (E->hadArrayRangeDesignator())
6180533b3020ca39898751d4200feed776861dcd1ceNate Begeman    CGF.ErrorUnsupported(E, "GNU array range designator extension");
6190533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6200533b3020ca39898751d4200feed776861dcd1ceNate Begeman  const llvm::VectorType *VType =
6210533b3020ca39898751d4200feed776861dcd1ceNate Begeman    dyn_cast<llvm::VectorType>(ConvertType(E->getType()));
6220533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6230533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // We have a scalar in braces. Just use the first element.
6240533b3020ca39898751d4200feed776861dcd1ceNate Begeman  if (!VType)
6250533b3020ca39898751d4200feed776861dcd1ceNate Begeman    return Visit(E->getInit(0));
6260533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6270533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned ResElts = VType->getNumElements();
6280533b3020ca39898751d4200feed776861dcd1ceNate Begeman  const llvm::Type *I32Ty = llvm::Type::getInt32Ty(CGF.getLLVMContext());
6290533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6300533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Loop over initializers collecting the Value for each, and remembering
6310533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // whether the source was swizzle (ExtVectorElementExpr).  This will allow
6320533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // us to fold the shuffle for the swizzle into the shuffle for the vector
6330533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // initializer, since LLVM optimizers generally do not want to touch
6340533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // shuffles.
6350533b3020ca39898751d4200feed776861dcd1ceNate Begeman  unsigned CurIdx = 0;
6360533b3020ca39898751d4200feed776861dcd1ceNate Begeman  bool VIsUndefShuffle = false;
6370533b3020ca39898751d4200feed776861dcd1ceNate Begeman  llvm::Value *V = llvm::UndefValue::get(VType);
6380533b3020ca39898751d4200feed776861dcd1ceNate Begeman  for (unsigned i = 0; i != NumInitElements; ++i) {
6390533b3020ca39898751d4200feed776861dcd1ceNate Begeman    Expr *IE = E->getInit(i);
6400533b3020ca39898751d4200feed776861dcd1ceNate Begeman    Value *Init = Visit(IE);
6410533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::SmallVector<llvm::Constant*, 16> Args;
6420533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6430533b3020ca39898751d4200feed776861dcd1ceNate Begeman    const llvm::VectorType *VVT = dyn_cast<llvm::VectorType>(Init->getType());
6440533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6450533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // Handle scalar elements.  If the scalar initializer is actually one
6460533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // element of a different vector of the same width, use shuffle instead of
6470533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // extract+insert.
6480533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (!VVT) {
6490533b3020ca39898751d4200feed776861dcd1ceNate Begeman      if (isa<ExtVectorElementExpr>(IE)) {
6500533b3020ca39898751d4200feed776861dcd1ceNate Begeman        llvm::ExtractElementInst *EI = cast<llvm::ExtractElementInst>(Init);
6510533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6520533b3020ca39898751d4200feed776861dcd1ceNate Begeman        if (EI->getVectorOperandType()->getNumElements() == ResElts) {
6530533b3020ca39898751d4200feed776861dcd1ceNate Begeman          llvm::ConstantInt *C = cast<llvm::ConstantInt>(EI->getIndexOperand());
6540533b3020ca39898751d4200feed776861dcd1ceNate Begeman          Value *LHS = 0, *RHS = 0;
6550533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (CurIdx == 0) {
6560533b3020ca39898751d4200feed776861dcd1ceNate Begeman            // insert into undef -> shuffle (src, undef)
6570533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(C);
6580533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = 1; j != ResElts; ++j)
6590533b3020ca39898751d4200feed776861dcd1ceNate Begeman              Args.push_back(llvm::UndefValue::get(I32Ty));
6600533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6610533b3020ca39898751d4200feed776861dcd1ceNate Begeman            LHS = EI->getVectorOperand();
6620533b3020ca39898751d4200feed776861dcd1ceNate Begeman            RHS = V;
6630533b3020ca39898751d4200feed776861dcd1ceNate Begeman            VIsUndefShuffle = true;
6640533b3020ca39898751d4200feed776861dcd1ceNate Begeman          } else if (VIsUndefShuffle) {
6650533b3020ca39898751d4200feed776861dcd1ceNate Begeman            // insert into undefshuffle && size match -> shuffle (v, src)
6660533b3020ca39898751d4200feed776861dcd1ceNate Begeman            llvm::ShuffleVectorInst *SVV = cast<llvm::ShuffleVectorInst>(V);
6670533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = 0; j != CurIdx; ++j)
6680533b3020ca39898751d4200feed776861dcd1ceNate Begeman              Args.push_back(getMaskElt(SVV, j, 0, I32Ty));
6690533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(llvm::ConstantInt::get(I32Ty,
6700533b3020ca39898751d4200feed776861dcd1ceNate Begeman                                                  ResElts + C->getZExtValue()));
6710533b3020ca39898751d4200feed776861dcd1ceNate Begeman            for (unsigned j = CurIdx + 1; j != ResElts; ++j)
6720533b3020ca39898751d4200feed776861dcd1ceNate Begeman              Args.push_back(llvm::UndefValue::get(I32Ty));
6730533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6740533b3020ca39898751d4200feed776861dcd1ceNate Begeman            LHS = cast<llvm::ShuffleVectorInst>(V)->getOperand(0);
6750533b3020ca39898751d4200feed776861dcd1ceNate Begeman            RHS = EI->getVectorOperand();
6760533b3020ca39898751d4200feed776861dcd1ceNate Begeman            VIsUndefShuffle = false;
6770533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
6780533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (!Args.empty()) {
6790533b3020ca39898751d4200feed776861dcd1ceNate Begeman            llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
6800533b3020ca39898751d4200feed776861dcd1ceNate Begeman            V = Builder.CreateShuffleVector(LHS, RHS, Mask);
6810533b3020ca39898751d4200feed776861dcd1ceNate Begeman            ++CurIdx;
6820533b3020ca39898751d4200feed776861dcd1ceNate Begeman            continue;
6830533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
6840533b3020ca39898751d4200feed776861dcd1ceNate Begeman        }
6850533b3020ca39898751d4200feed776861dcd1ceNate Begeman      }
6860533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Value *Idx = llvm::ConstantInt::get(I32Ty, CurIdx);
6870533b3020ca39898751d4200feed776861dcd1ceNate Begeman      V = Builder.CreateInsertElement(V, Init, Idx, "vecinit");
6880533b3020ca39898751d4200feed776861dcd1ceNate Begeman      VIsUndefShuffle = false;
6890533b3020ca39898751d4200feed776861dcd1ceNate Begeman      ++CurIdx;
6900533b3020ca39898751d4200feed776861dcd1ceNate Begeman      continue;
6910533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
6920533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6930533b3020ca39898751d4200feed776861dcd1ceNate Begeman    unsigned InitElts = VVT->getNumElements();
6940533b3020ca39898751d4200feed776861dcd1ceNate Begeman
6950533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // If the initializer is an ExtVecEltExpr (a swizzle), and the swizzle's
6960533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // input is the same width as the vector being constructed, generate an
6970533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // optimized shuffle of the swizzle input into the result.
698a99f08351b6df3bb0f2947e038747717a60fd93aNate Begeman    unsigned Offset = (CurIdx == 0) ? 0 : ResElts;
6990533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (isa<ExtVectorElementExpr>(IE)) {
7000533b3020ca39898751d4200feed776861dcd1ceNate Begeman      llvm::ShuffleVectorInst *SVI = cast<llvm::ShuffleVectorInst>(Init);
7010533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Value *SVOp = SVI->getOperand(0);
7020533b3020ca39898751d4200feed776861dcd1ceNate Begeman      const llvm::VectorType *OpTy = cast<llvm::VectorType>(SVOp->getType());
7030533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7040533b3020ca39898751d4200feed776861dcd1ceNate Begeman      if (OpTy->getNumElements() == ResElts) {
7050533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = 0; j != CurIdx; ++j) {
7060533b3020ca39898751d4200feed776861dcd1ceNate Begeman          // If the current vector initializer is a shuffle with undef, merge
7070533b3020ca39898751d4200feed776861dcd1ceNate Begeman          // this shuffle directly into it.
7080533b3020ca39898751d4200feed776861dcd1ceNate Begeman          if (VIsUndefShuffle) {
7090533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(getMaskElt(cast<llvm::ShuffleVectorInst>(V), j, 0,
7100533b3020ca39898751d4200feed776861dcd1ceNate Begeman                                      I32Ty));
7110533b3020ca39898751d4200feed776861dcd1ceNate Begeman          } else {
7120533b3020ca39898751d4200feed776861dcd1ceNate Begeman            Args.push_back(llvm::ConstantInt::get(I32Ty, j));
7130533b3020ca39898751d4200feed776861dcd1ceNate Begeman          }
7140533b3020ca39898751d4200feed776861dcd1ceNate Begeman        }
7150533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = 0, je = InitElts; j != je; ++j)
7160533b3020ca39898751d4200feed776861dcd1ceNate Begeman          Args.push_back(getMaskElt(SVI, j, Offset, I32Ty));
7170533b3020ca39898751d4200feed776861dcd1ceNate Begeman        for (unsigned j = CurIdx + InitElts; j != ResElts; ++j)
7180533b3020ca39898751d4200feed776861dcd1ceNate Begeman          Args.push_back(llvm::UndefValue::get(I32Ty));
7190533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7200533b3020ca39898751d4200feed776861dcd1ceNate Begeman        if (VIsUndefShuffle)
7210533b3020ca39898751d4200feed776861dcd1ceNate Begeman          V = cast<llvm::ShuffleVectorInst>(V)->getOperand(0);
7220533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7230533b3020ca39898751d4200feed776861dcd1ceNate Begeman        Init = SVOp;
7240533b3020ca39898751d4200feed776861dcd1ceNate Begeman      }
7250533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
7260533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7270533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // Extend init to result vector length, and then shuffle its contribution
7280533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // to the vector initializer into V.
7290533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (Args.empty()) {
7300533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != InitElts; ++j)
7310533b3020ca39898751d4200feed776861dcd1ceNate Begeman        Args.push_back(llvm::ConstantInt::get(I32Ty, j));
7320533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = InitElts; j != ResElts; ++j)
7330533b3020ca39898751d4200feed776861dcd1ceNate Begeman        Args.push_back(llvm::UndefValue::get(I32Ty));
7340533b3020ca39898751d4200feed776861dcd1ceNate Begeman      llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
7350533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Init = Builder.CreateShuffleVector(Init, llvm::UndefValue::get(VVT),
736a99f08351b6df3bb0f2947e038747717a60fd93aNate Begeman                                         Mask, "vext");
7370533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7380533b3020ca39898751d4200feed776861dcd1ceNate Begeman      Args.clear();
7390533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != CurIdx; ++j)
7400533b3020ca39898751d4200feed776861dcd1ceNate Begeman        Args.push_back(llvm::ConstantInt::get(I32Ty, j));
7410533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = 0; j != InitElts; ++j)
742a99f08351b6df3bb0f2947e038747717a60fd93aNate Begeman        Args.push_back(llvm::ConstantInt::get(I32Ty, j+Offset));
7430533b3020ca39898751d4200feed776861dcd1ceNate Begeman      for (unsigned j = CurIdx + InitElts; j != ResElts; ++j)
7440533b3020ca39898751d4200feed776861dcd1ceNate Begeman        Args.push_back(llvm::UndefValue::get(I32Ty));
7450533b3020ca39898751d4200feed776861dcd1ceNate Begeman    }
7460533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7470533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // If V is undef, make sure it ends up on the RHS of the shuffle to aid
7480533b3020ca39898751d4200feed776861dcd1ceNate Begeman    // merging subsequent shuffles into this one.
7490533b3020ca39898751d4200feed776861dcd1ceNate Begeman    if (CurIdx == 0)
7500533b3020ca39898751d4200feed776861dcd1ceNate Begeman      std::swap(V, Init);
7510533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], ResElts);
7520533b3020ca39898751d4200feed776861dcd1ceNate Begeman    V = Builder.CreateShuffleVector(V, Init, Mask, "vecinit");
7530533b3020ca39898751d4200feed776861dcd1ceNate Begeman    VIsUndefShuffle = isa<llvm::UndefValue>(Init);
7540533b3020ca39898751d4200feed776861dcd1ceNate Begeman    CurIdx += InitElts;
7550533b3020ca39898751d4200feed776861dcd1ceNate Begeman  }
7560533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7570533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // FIXME: evaluate codegen vs. shuffling against constant null vector.
7580533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Emit remaining default initializers.
7590533b3020ca39898751d4200feed776861dcd1ceNate Begeman  const llvm::Type *EltTy = VType->getElementType();
7600533b3020ca39898751d4200feed776861dcd1ceNate Begeman
7610533b3020ca39898751d4200feed776861dcd1ceNate Begeman  // Emit remaining default initializers
7620533b3020ca39898751d4200feed776861dcd1ceNate Begeman  for (/* Do not initialize i*/; CurIdx < ResElts; ++CurIdx) {
7630533b3020ca39898751d4200feed776861dcd1ceNate Begeman    Value *Idx = llvm::ConstantInt::get(I32Ty, CurIdx);
7640533b3020ca39898751d4200feed776861dcd1ceNate Begeman    llvm::Value *Init = llvm::Constant::getNullValue(EltTy);
7650533b3020ca39898751d4200feed776861dcd1ceNate Begeman    V = Builder.CreateInsertElement(V, Init, Idx, "vecinit");
7660533b3020ca39898751d4200feed776861dcd1ceNate Begeman  }
7670533b3020ca39898751d4200feed776861dcd1ceNate Begeman  return V;
7680533b3020ca39898751d4200feed776861dcd1ceNate Begeman}
7690533b3020ca39898751d4200feed776861dcd1ceNate Begeman
770a3697c9c155bda93fd2802f37084b620f4738822Anders Carlssonstatic bool ShouldNullCheckClassCastValue(const CastExpr *CE) {
771a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  const Expr *E = CE->getSubExpr();
772a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
773a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  if (isa<CXXThisExpr>(E)) {
774a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    // We always assume that 'this' is never null.
775a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    return false;
776a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
777a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
778a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(CE)) {
779a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    // And that lvalue casts are never null.
780a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    if (ICE->isLvalueCast())
781a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson      return false;
782a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
783a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
784a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  return true;
785a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson}
786a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
787504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// VisitCastExpr - Emit code for an explicit or implicit cast.  Implicit casts
788504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// have to handle a more broad range of conversions than explicit casts, as they
789504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson// handle things like function to ptr-to-function decay etc.
790d888962cff03b543fbe9ac6051ec6addf5b993b4Eli FriedmanValue *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
791d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  Expr *E = CE->getSubExpr();
792592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson  QualType DestTy = CE->getType();
793592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson  CastExpr::CastKind Kind = CE->getCastKind();
794592a2bbc1945358ab8ebf0d74c57f0b23c4434c0Anders Carlsson
795504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson  if (!DestTy->isVoidType())
796504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson    TestAndClearIgnoreResultAssign();
797db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
7988c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // Since almost all cast kinds apply to scalars, this switch doesn't have
7998c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // a default case, so the compiler will warn on a missing case.  The cases
8008c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  // are in the same order as in the CastKind enum.
801504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson  switch (Kind) {
8027f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  case CastExpr::CK_Unknown:
803d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    // FIXME: All casts should have a known kind!
804ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    //assert(0 && "Unknown cast kind!");
805504bf55195ccbf84e016a0c7759669dee2975ba3Anders Carlsson    break;
806ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
80792ef5d75720c032808181133e4d7c5f82230237eFariborz Jahanian  case CastExpr::CK_AnyPointerToObjCPointerCast:
8083b27f1a80e4e433b503efd344c909eeafaa9033cFariborz Jahanian  case CastExpr::CK_AnyPointerToBlockPointerCast:
809cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson  case CastExpr::CK_BitCast: {
810cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
811cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson    return Builder.CreateBitCast(Src, ConvertType(DestTy));
812cb3c308ef0e63b2902911b985517309c26f975dcAnders Carlsson  }
813ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_NoOp:
8140ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlsson  case CastExpr::CK_UserDefinedConversion:
815ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return Visit(const_cast<Expr*>(E));
816db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
817a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  case CastExpr::CK_BaseToDerived: {
818a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    const CXXRecordDecl *BaseClassDecl =
819a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson      E->getType()->getCXXRecordDeclForPointerType();
820a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    const CXXRecordDecl *DerivedClassDecl =
821a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson      DestTy->getCXXRecordDeclForPointerType();
822a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
823a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
824a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson
825a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    bool NullCheckValue = ShouldNullCheckClassCastValue(CE);
826a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    return CGF.GetAddressOfDerivedClass(Src, BaseClassDecl, DerivedClassDecl,
827a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson                                        NullCheckValue);
828a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson  }
829191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson  case CastExpr::CK_DerivedToBase: {
830191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    const RecordType *DerivedClassTy =
831191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson      E->getType()->getAs<PointerType>()->getPointeeType()->getAs<RecordType>();
832191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    CXXRecordDecl *DerivedClassDecl =
833191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson      cast<CXXRecordDecl>(DerivedClassTy->getDecl());
834191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
835191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    const RecordType *BaseClassTy =
836191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson      DestTy->getAs<PointerType>()->getPointeeType()->getAs<RecordType>();
837191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(BaseClassTy->getDecl());
838191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
839191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
84032baf62b9a3aea3b63be6925b64aa182b0a2278eAnders Carlsson
841a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    bool NullCheckValue = ShouldNullCheckClassCastValue(CE);
842a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson    return CGF.GetAddressOfBaseClass(Src, DerivedClassDecl, BaseClassDecl,
843a3697c9c155bda93fd2802f37084b620f4738822Anders Carlsson                                     NullCheckValue);
844191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson  }
8458c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_Dynamic: {
8468c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    Value *V = Visit(const_cast<Expr*>(E));
8478c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    const CXXDynamicCastExpr *DCE = cast<CXXDynamicCastExpr>(CE);
8488c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    return CGF.EmitDynamicCast(V, DCE);
8498c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  }
850d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  case CastExpr::CK_ToUnion:
851ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    assert(0 && "Should be unreachable!");
852ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    break;
853d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
854ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_ArrayToPointerDecay: {
855ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    assert(E->getType()->isArrayType() &&
856ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman           "Array to pointer decay must have array source type!");
857ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
858ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    Value *V = EmitLValue(E).getAddress();  // Bitfields can't be arrays.
859ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
860ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Note that VLA pointers are always decayed, so we don't need to do
861ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // anything here.
862ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    if (!E->getType()->isVariableArrayType()) {
863ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      assert(isa<llvm::PointerType>(V->getType()) && "Expected pointer");
864ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      assert(isa<llvm::ArrayType>(cast<llvm::PointerType>(V->getType())
865ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman                                 ->getElementType()) &&
866ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman             "Expected pointer to array");
867ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      V = Builder.CreateStructGEP(V, 0, "arraydecay");
868ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    }
869ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
870ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return V;
871ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
872ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_FunctionToPointerDecay:
873ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return EmitLValue(E).getAddress();
874ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
875ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_NullToMemberPointer:
876ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return CGF.CGM.EmitNullConstant(DestTy);
877191dfe909d6cc18e9134ac23ac4daaedeceb862fAnders Carlsson
8788c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_BaseToDerivedMemberPointer:
879d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  case CastExpr::CK_DerivedToBaseMemberPointer: {
880d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    Value *Src = Visit(E);
881d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
882d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    // See if we need to adjust the pointer.
883d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    const CXXRecordDecl *BaseDecl =
884d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman      cast<CXXRecordDecl>(E->getType()->getAs<MemberPointerType>()->
885d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman                          getClass()->getAs<RecordType>()->getDecl());
886d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    const CXXRecordDecl *DerivedDecl =
887d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman      cast<CXXRecordDecl>(CE->getType()->getAs<MemberPointerType>()->
888d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman                          getClass()->getAs<RecordType>()->getDecl());
889d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    if (CE->getCastKind() == CastExpr::CK_DerivedToBaseMemberPointer)
890d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman      std::swap(DerivedDecl, BaseDecl);
891d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
892bb7e17b52ffaa4097b4c4d7935746d23539ffe2aAnders Carlsson    if (llvm::Constant *Adj =
893bb7e17b52ffaa4097b4c4d7935746d23539ffe2aAnders Carlsson          CGF.CGM.GetNonVirtualBaseClassOffset(DerivedDecl, BaseDecl)) {
894d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman      if (CE->getCastKind() == CastExpr::CK_DerivedToBaseMemberPointer)
895d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman        Src = Builder.CreateSub(Src, Adj, "adj");
896d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman      else
897d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman        Src = Builder.CreateAdd(Src, Adj, "adj");
898d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    }
899d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    return Src;
900d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman  }
901d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman
9028c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_ConstructorConversion:
903d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    assert(0 && "Should be unreachable!");
9048c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman    break;
9058c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman
9067f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  case CastExpr::CK_IntegralToPointer: {
9077f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
90882debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson
90982debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    // First, convert to the correct width so that we control the kind of
91082debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    // extension.
91182debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    const llvm::Type *MiddleTy =
91282debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson      llvm::IntegerType::get(VMContext, CGF.LLVMPointerWidth);
91382debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    bool InputSigned = E->getType()->isSignedIntegerType();
91482debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    llvm::Value* IntResult =
91582debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson      Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
91682debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson
91782debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return Builder.CreateIntToPtr(IntResult, ConvertType(DestTy));
9187f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  }
9197f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  case CastExpr::CK_PointerToIntegral: {
9207f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    Value *Src = Visit(const_cast<Expr*>(E));
9217f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    return Builder.CreatePtrToInt(Src, ConvertType(DestTy));
9227f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson  }
923ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_ToVoid: {
924ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    CGF.EmitAnyExpr(E, 0, false, true);
925ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return 0;
926ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
927ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  case CastExpr::CK_VectorSplat: {
928ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    const llvm::Type *DstTy = ConvertType(DestTy);
929ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    Value *Elt = Visit(const_cast<Expr*>(E));
930ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
931ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Insert the element in element zero of an undef vector
932ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Value *UnV = llvm::UndefValue::get(DstTy);
933ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Value *Idx =
934ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman        llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 0);
935ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    UnV = Builder.CreateInsertElement(UnV, Elt, Idx, "tmp");
936ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
937ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    // Splat the element across to all elements
938ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::SmallVector<llvm::Constant*, 16> Args;
939ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    unsigned NumElements = cast<llvm::VectorType>(DstTy)->getNumElements();
940ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    for (unsigned i = 0; i < NumElements; i++)
941ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman      Args.push_back(llvm::ConstantInt::get(
942ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman                                        llvm::Type::getInt32Ty(VMContext), 0));
943ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
944ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Constant *Mask = llvm::ConstantVector::get(&Args[0], NumElements);
945ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    llvm::Value *Yay = Builder.CreateShuffleVector(UnV, UnV, Mask, "splat");
946ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman    return Yay;
947ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman  }
9488c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_IntegralCast:
9498c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_IntegralToFloating:
9508c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_FloatingToIntegral:
9518c3e7e7ddafe26f236741fb25e2898be4f3230eaEli Friedman  case CastExpr::CK_FloatingCast:
952d888962cff03b543fbe9ac6051ec6addf5b993b4Eli Friedman    return EmitScalarConversion(Visit(E), E->getType(), DestTy);
953ad35a83102683b00a7e28707eee7f2d8c994b742Eli Friedman
9543a1737030e3c8d209987325c61dacb8e4a65123bEli Friedman  case CastExpr::CK_MemberPointerToBoolean:
9553a1737030e3c8d209987325c61dacb8e4a65123bEli Friedman    return CGF.EvaluateExprAsBool(E);
956e9776247577715ad3a19461769a3488a445a8cbdAnders Carlsson  }
957db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
95858a2e944faa16f1f61439acd2e71b19f50189511Chris Lattner  // Handle cases where the source is an non-complex type.
959db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
96019a1d7c646729eb858b15583e647262a22de3637Chris Lattner  if (!CGF.hasAggregateLLVMType(E->getType())) {
9613707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    Value *Src = Visit(const_cast<Expr*>(E));
9623707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
9633707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    // Use EmitScalarConversion to perform the conversion.
9643707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner    return EmitScalarConversion(Src, E->getType(), DestTy);
9653707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  }
966db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
9679b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (E->getType()->isAnyComplexType()) {
96819a1d7c646729eb858b15583e647262a22de3637Chris Lattner    // Handle cases where the source is a complex type.
9697f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreImag = true;
9707f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreImagAssign = true;
9717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreReal = IgnoreResultAssign;
9727f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    bool IgnoreRealAssign = IgnoreResultAssign;
9737f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    if (DestTy->isBooleanType())
9747f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreImagAssign = IgnoreImag = false;
9757f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    else if (DestTy->isVoidType()) {
9767f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreReal = IgnoreImag = false;
9777f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      IgnoreRealAssign = IgnoreImagAssign = true;
9787f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    }
9797f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CodeGenFunction::ComplexPairTy V
9807f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      = CGF.EmitComplexExpr(E, IgnoreReal, IgnoreImag, IgnoreRealAssign,
9817f79f9be5916c51c35da4f126b7c12596a101607Mike Stump                            IgnoreImagAssign);
9827f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return EmitComplexToScalarConversion(V, E->getType(), DestTy);
98319a1d7c646729eb858b15583e647262a22de3637Chris Lattner  }
98410b00cfe6422906b223724048b9b2123968d3baaChris Lattner
98519a1d7c646729eb858b15583e647262a22de3637Chris Lattner  // Okay, this is a cast from an aggregate.  It must be a cast to void.  Just
98619a1d7c646729eb858b15583e647262a22de3637Chris Lattner  // evaluate the result and return.
9877f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  CGF.EmitAggExpr(E, 0, false, true);
98819a1d7c646729eb858b15583e647262a22de3637Chris Lattner  return 0;
9897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
9907f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
9913379320c10001d7e1ee5d7e7142c417f797cfe82Chris LattnerValue *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) {
99291d723da7b68be5245c3ac58aa2a36d04658cfb8Chris Lattner  return CGF.EmitCompoundStmt(*E->getSubStmt(),
99391d723da7b68be5245c3ac58aa2a36d04658cfb8Chris Lattner                              !E->getType()->isVoidType()).getScalarVal();
9943379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner}
9953379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner
996a99038c0757a836c6faeeddaa5dfd249b32f6e9eMike StumpValue *ScalarExprEmitter::VisitBlockDeclRefExpr(const BlockDeclRefExpr *E) {
997f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian  llvm::Value *V = CGF.GetAddrOfBlockDecl(E);
998f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian  if (E->getType().isObjCGCWeak())
999f7bcc7e6c803a2b2f7b7f7fdfb2506dd25ec6de8Fariborz Jahanian    return CGF.CGM.getObjCRuntime().EmitObjCWeakRead(CGF, V);
10002da84ff228a231adbd3f6f236b857f752d02959aDaniel Dunbar  return Builder.CreateLoad(V, "tmp");
10014e7a1f7682d94811bd41fca8aefccc38f686db23Mike Stump}
10023379320c10001d7e1ee5d7e7142c417f797cfe82Chris Lattner
10037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
10047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                             Unary Operators
10057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
10067f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
10077f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
10087f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
10097f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Op = Visit(E->getSubExpr());
1010f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  if (Op->getType()->isFPOrFPVectorTy())
101187415d2d45224596a96ef02310701797d56b2c19Chris Lattner    return Builder.CreateFNeg(Op, "neg");
10127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateNeg(Op, "neg");
10137f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
10147f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
10157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
10167f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
10177f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *Op = Visit(E->getSubExpr());
10187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateNot(Op, "neg");
10197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
10207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
10217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitUnaryLNot(const UnaryOperator *E) {
10227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Compare operand to zero.
10237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *BoolVal = CGF.EvaluateExprAsBool(E->getSubExpr());
1024db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
10257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Invert value.
10267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // TODO: Could dynamically modify easy computations here.  For example, if
10277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // the operand is an icmp ne, turn into icmp eq.
10287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  BoolVal = Builder.CreateNot(BoolVal, "lnot");
1029db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
10309f84d88a302ea38cf0695ce8cdace47178d2fff4Anders Carlsson  // ZExt result to the expr type.
10319f84d88a302ea38cf0695ce8cdace47178d2fff4Anders Carlsson  return Builder.CreateZExt(BoolVal, ConvertType(E->getType()), "lnot.ext");
10327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
10337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
10340518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeOfAlignOfExpr - Return the size or alignment of the type of
10350518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// argument of the sizeof expression as an integer.
10360518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlValue *
10370518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlScalarExprEmitter::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
10380518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType TypeToSize = E->getTypeOfArgument();
1039f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  if (E->isSizeOf()) {
1040db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    if (const VariableArrayType *VAT =
1041f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman          CGF.getContext().getAsVariableArrayType(TypeToSize)) {
1042f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman      if (E->isArgumentType()) {
1043f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman        // sizeof(type) - make sure to emit the VLA size.
1044f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman        CGF.EmitVLASize(TypeToSize);
10458f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman      } else {
10468f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        // C99 6.5.3.4p2: If the argument is an expression of type
10478f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        // VLA, it is evaluated.
10488f426fa9fca022201fc0944d6c1cb2cf9918db7dEli Friedman        CGF.EmitAnyExpr(E->getArgumentExpr());
1049f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman      }
1050db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
105196f214776c0f69069fee4d67557c8c7f416009a8Anders Carlsson      return CGF.GetVLASize(VAT);
1052b50525ba0e996bc072cdb76152fcfe0bc64bb72aAnders Carlsson    }
10535d46315ca3cbbfe0d0f5f65520b618fb05dd4446Anders Carlsson  }
1054f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1055db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // If this isn't sizeof(vla), the result must be constant; use the constant
1056db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // folding logic so we don't have to duplicate it here.
1057f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  Expr::EvalResult Result;
1058f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman  E->Evaluate(Result, CGF.getContext());
10594a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson  return llvm::ConstantInt::get(VMContext, Result.Val.getInt());
10607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
10617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
106246f93d021a1778442c1c4a53f0b94a68bfae3be5Chris LattnerValue *ScalarExprEmitter::VisitUnaryReal(const UnaryOperator *E) {
106346f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Expr *Op = E->getSubExpr();
10649b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (Op->getType()->isAnyComplexType())
10657f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return CGF.EmitComplexExpr(Op, false, true, false, true).first;
106646f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  return Visit(Op);
106746f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner}
106846f93d021a1778442c1c4a53f0b94a68bfae3be5Chris LattnerValue *ScalarExprEmitter::VisitUnaryImag(const UnaryOperator *E) {
106946f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner  Expr *Op = E->getSubExpr();
10709b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  if (Op->getType()->isAnyComplexType())
10717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return CGF.EmitComplexExpr(Op, true, false, true, false).second;
1072db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
10737f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // __imag on a scalar returns zero.  Emit the subexpr to ensure side
10747f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // effects are evaluated, but not the actual value.
10757f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (E->isLvalue(CGF.getContext()) == Expr::LV_Valid)
10767f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CGF.EmitLValue(Op);
10777f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  else
10787f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    CGF.EmitScalarExpr(Op, true);
1079c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson  return llvm::Constant::getNullValue(ConvertType(E->getType()));
108046f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner}
108146f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner
10821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpValue *ScalarExprEmitter::VisitUnaryOffsetOf(const UnaryOperator *E) {
108335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  Value* ResultAsPtr = EmitLValue(E->getSubExpr()).getAddress();
1084769e411b72465a63454cdd416ff26ff313d43505Eli Friedman  const llvm::Type* ResultType = ConvertType(E->getType());
108535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  return Builder.CreatePtrToInt(ResultAsPtr, ResultType, "offsetof");
10865a1deb8d9c0722beae28d693fa137bbb942bd11fAnders Carlsson}
108746f93d021a1778442c1c4a53f0b94a68bfae3be5Chris Lattner
10887f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
10897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                           Binary Operators
10907f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
10917f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
10927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerBinOpInfo ScalarExprEmitter::EmitBinOps(const BinaryOperator *E) {
10937f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
10947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  BinOpInfo Result;
10957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.LHS = Visit(E->getLHS());
10967f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.RHS = Visit(E->getRHS());
10971f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  Result.Ty  = E->getType();
10987f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Result.E = E;
10997f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Result;
11007f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
11017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
11023ccf774256382ef9aa95028eaad82f54a3d0b0adChris LattnerValue *ScalarExprEmitter::EmitCompoundAssign(const CompoundAssignOperator *E,
11031f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner                      Value *(ScalarExprEmitter::*Func)(const BinOpInfo &)) {
11047f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool Ignore = TestAndClearIgnoreResultAssign();
110554d76db0aa7107597cac0b80d8e138a37e6d1de9Benjamin Kramer  QualType LHSTy = E->getLHS()->getType();
11061f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
11071f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  BinOpInfo OpInfo;
11081f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
1109ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  if (E->getComputationResultType()->isAnyComplexType()) {
1110db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // This needs to go through the complex expression emitter, but it's a tad
1111db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // complicated to do that... I'm leaving it out for now.  (Note that we do
1112db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // actually need the imaginary part of the RHS for multiplication and
1113db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // division.)
1114ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman    CGF.ErrorUnsupported(E, "complex compound assignment");
111503e205031b08669f05c41eed5b896fc94c4a12bbOwen Anderson    return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
11161f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  }
11178c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar
1118cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  // Emit the RHS first.  __block variables need to have the rhs evaluated
1119cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  // first, plus this should improve codegen a little.
1120cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.RHS = Visit(E->getRHS());
1121cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.Ty = E->getComputationResultType();
1122cc0442fa28e5d1f403f820dcdee49911c3e622a9Mike Stump  OpInfo.E = E;
1123ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  // Load/convert the LHS.
1124b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue LHSLV = EmitCheckedLValue(E->getLHS());
1125ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  OpInfo.LHS = EmitLoadOfLValue(LHSLV, LHSTy);
1126ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  OpInfo.LHS = EmitScalarConversion(OpInfo.LHS, LHSTy,
1127ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman                                    E->getComputationLHSType());
1128db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
11291f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  // Expand the binary operator.
11301f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  Value *Result = (this->*Func)(OpInfo);
1131db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
11328c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar  // Convert the result back to the LHS type.
1133ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  Result = EmitScalarConversion(Result, E->getComputationResultType(), LHSTy);
1134ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman
1135db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Store the result value into the LHS lvalue. Bit-fields are handled
1136db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // specially because the result is altered by the store, i.e., [C99 6.5.16p1]
1137db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // 'An assignment expression has the value of the left operand after the
1138db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // assignment...'.
11397f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (LHSLV.isBitfield()) {
11407f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    if (!LHSLV.isVolatileQualified()) {
11417f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      CGF.EmitStoreThroughBitfieldLValue(RValue::get(Result), LHSLV, LHSTy,
11427f79f9be5916c51c35da4f126b7c12596a101607Mike Stump                                         &Result);
11437f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      return Result;
11447f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    } else
11457f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      CGF.EmitStoreThroughBitfieldLValue(RValue::get(Result), LHSLV, LHSTy);
11467f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  } else
1147ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar    CGF.EmitStoreThroughLValue(RValue::get(Result), LHSLV, LHSTy);
11487f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (Ignore)
11497f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return 0;
11507f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  return EmitLoadOfLValue(LHSLV, E->getType());
11511f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner}
11521f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
11531f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
11547f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitDiv(const BinOpInfo &Ops) {
1155f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands  if (Ops.LHS->getType()->isFPOrFPVectorTy())
11567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateFDiv(Ops.LHS, Ops.RHS, "div");
11571f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  else if (Ops.Ty->isUnsignedIntegerType())
11587f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateUDiv(Ops.LHS, Ops.RHS, "div");
11597f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  else
11607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSDiv(Ops.LHS, Ops.RHS, "div");
11617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
11627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
11637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitRem(const BinOpInfo &Ops) {
11647f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Rem in C can't be a floating point type: C99 6.5.5p2.
11651f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  if (Ops.Ty->isUnsignedIntegerType())
11667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateURem(Ops.LHS, Ops.RHS, "rem");
11677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  else
11687f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSRem(Ops.LHS, Ops.RHS, "rem");
11697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
11707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
11712add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike StumpValue *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) {
11722add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  unsigned IID;
11732add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  unsigned OpID = 0;
11745d8b2cf9fd704f6ca5e33525803a65421c0b440eMike Stump
1175035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  switch (Ops.E->getOpcode()) {
1176035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::Add:
1177035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::AddAssign:
1178035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 1;
1179035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::sadd_with_overflow;
1180035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
1181035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::Sub:
1182035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::SubAssign:
1183035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 2;
1184035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::ssub_with_overflow;
1185035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
1186035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::Mul:
1187035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  case BinaryOperator::MulAssign:
1188035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    OpID = 3;
1189035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    IID = llvm::Intrinsic::smul_with_overflow;
1190035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    break;
1191035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  default:
1192035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    assert(false && "Unsupported operation for overflow detection");
1193ab4eff620a9ce0ea62cdf29529a66c2c98d116f5Daniel Dunbar    IID = 0;
1194035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  }
1195035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  OpID <<= 1;
1196035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump  OpID |= 1;
1197035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump
11982add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  const llvm::Type *opTy = CGF.CGM.getTypes().ConvertType(Ops.Ty);
11992add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12002add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::Function *intrinsic = CGF.CGM.getIntrinsic(IID, &opTy, 1);
12012add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12022add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *resultAndOverflow = Builder.CreateCall2(intrinsic, Ops.LHS, Ops.RHS);
12032add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *result = Builder.CreateExtractValue(resultAndOverflow, 0);
12042add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Value *overflow = Builder.CreateExtractValue(resultAndOverflow, 1);
12052add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12062add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // Branch in case of overflow.
12072add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::BasicBlock *initialBB = Builder.GetInsertBlock();
12082add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::BasicBlock *overflowBB =
12092add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump    CGF.createBasicBlock("overflow", CGF.CurFn);
12102add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::BasicBlock *continueBB =
12112add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump    CGF.createBasicBlock("overflow.continue", CGF.CurFn);
12122add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12132add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.CreateCondBr(overflow, overflowBB, continueBB);
12142add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12152add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // Handle overflow
12162add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12172add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.SetInsertPoint(overflowBB);
12182add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12192add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // Handler is:
1220db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // long long *__overflow_handler)(long long a, long long b, char op,
12212add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // char width)
12222add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  std::vector<const llvm::Type*> handerArgTypes;
12230032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  handerArgTypes.push_back(llvm::Type::getInt64Ty(VMContext));
12240032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  handerArgTypes.push_back(llvm::Type::getInt64Ty(VMContext));
12250032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  handerArgTypes.push_back(llvm::Type::getInt8Ty(VMContext));
12260032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  handerArgTypes.push_back(llvm::Type::getInt8Ty(VMContext));
12270032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::FunctionType *handlerTy = llvm::FunctionType::get(
12280032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      llvm::Type::getInt64Ty(VMContext), handerArgTypes, false);
12292add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::Value *handlerFunction =
12302add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump    CGF.CGM.getModule().getOrInsertGlobal("__overflow_handler",
123196e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson        llvm::PointerType::getUnqual(handlerTy));
12322add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  handlerFunction = Builder.CreateLoad(handlerFunction);
12332add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12342add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::Value *handlerResult = Builder.CreateCall4(handlerFunction,
12350032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      Builder.CreateSExt(Ops.LHS, llvm::Type::getInt64Ty(VMContext)),
12360032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      Builder.CreateSExt(Ops.RHS, llvm::Type::getInt64Ty(VMContext)),
12370032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      llvm::ConstantInt::get(llvm::Type::getInt8Ty(VMContext), OpID),
1238db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump      llvm::ConstantInt::get(llvm::Type::getInt8Ty(VMContext),
12392add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump        cast<llvm::IntegerType>(opTy)->getBitWidth()));
12402add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12412add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  handlerResult = Builder.CreateTrunc(handlerResult, opTy);
12422add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12432add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.CreateBr(continueBB);
1244db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
12452add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // Set up the continuation
12462add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  Builder.SetInsertPoint(continueBB);
12472add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  // Get the correct result
12482add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  llvm::PHINode *phi = Builder.CreatePHI(opTy);
12492add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  phi->reserveOperandSpace(2);
12502add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  phi->addIncoming(result, initialBB);
12512add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  phi->addIncoming(handlerResult, overflowBB);
12522add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump
12532add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  return phi;
12542add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump}
12557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
12567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitAdd(const BinOpInfo &Ops) {
125758f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff  if (!Ops.Ty->isAnyPointerType()) {
125887415d2d45224596a96ef02310701797d56b2c19Chris Lattner    if (CGF.getContext().getLangOptions().OverflowChecking &&
125987415d2d45224596a96ef02310701797d56b2c19Chris Lattner        Ops.Ty->isSignedIntegerType())
12602add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump      return EmitOverflowCheckedBinOp(Ops);
1261db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1262f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
126387415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFAdd(Ops.LHS, Ops.RHS, "add");
1264bf933a0cb628670490c15367b3f5ccb3193354a7Dan Gohman
1265bf933a0cb628670490c15367b3f5ccb3193354a7Dan Gohman    // Signed integer overflow is undefined behavior.
1266bf933a0cb628670490c15367b3f5ccb3193354a7Dan Gohman    if (Ops.Ty->isSignedIntegerType())
1267bf933a0cb628670490c15367b3f5ccb3193354a7Dan Gohman      return Builder.CreateNSWAdd(Ops.LHS, Ops.RHS, "add");
1268bf933a0cb628670490c15367b3f5ccb3193354a7Dan Gohman
12697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateAdd(Ops.LHS, Ops.RHS, "add");
12702add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  }
1271daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman
127214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (Ops.Ty->isPointerType() &&
12736217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      Ops.Ty->getAs<PointerType>()->isVariableArrayType()) {
1274daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the addition needs to account for the VLA size
1275daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    CGF.ErrorUnsupported(Ops.E, "VLA pointer addition");
1276daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  }
12778f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  Value *Ptr, *Idx;
12788f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  Expr *IdxExp;
12796217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  const PointerType *PT = Ops.E->getLHS()->getType()->getAs<PointerType>();
1280db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  const ObjCObjectPointerType *OPT =
1281183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    Ops.E->getLHS()->getType()->getAs<ObjCObjectPointerType>();
128214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (PT || OPT) {
12838f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Ptr = Ops.LHS;
12848f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Idx = Ops.RHS;
12858f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    IdxExp = Ops.E->getRHS();
128614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  } else {  // int + pointer
12876217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    PT = Ops.E->getRHS()->getType()->getAs<PointerType>();
1288183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    OPT = Ops.E->getRHS()->getType()->getAs<ObjCObjectPointerType>();
128914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    assert((PT || OPT) && "Invalid add expr");
12908f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Ptr = Ops.RHS;
12918f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    Idx = Ops.LHS;
12928f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    IdxExp = Ops.E->getLHS();
12938f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  }
12948f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner
12958f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
12967cabee5b18212bd3106aea8415b044b2b3b43518Sanjiv Gupta  if (Width < CGF.LLVMPointerWidth) {
12978f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    // Zero or sign extend the pointer value based on whether the index is
12988f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    // signed or not.
12990032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    const llvm::Type *IdxType =
13000032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson        llvm::IntegerType::get(VMContext, CGF.LLVMPointerWidth);
13019619662a1d42e2008b865d3459c0677e149dad1bChris Lattner    if (IdxExp->getType()->isSignedIntegerType())
13028f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner      Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
13038f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner    else
13048f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner      Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
13058f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner  }
130614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  const QualType ElementType = PT ? PT->getPointeeType() : OPT->getPointeeType();
1307db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Handle interface types, which are not represented with a concrete type.
13082a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar  if (const ObjCInterfaceType *OIT = dyn_cast<ObjCInterfaceType>(ElementType)) {
1309db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    llvm::Value *InterfaceSize =
13104a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson      llvm::ConstantInt::get(Idx->getType(),
1311199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck          CGF.getContext().getTypeSizeInChars(OIT).getQuantity());
13122a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Idx = Builder.CreateMul(Idx, InterfaceSize);
13133c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer    const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
13142a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
13152a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
13162a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    return Builder.CreateBitCast(Res, Ptr->getType());
1317db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
13182a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar
1319db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // Explicitly handle GNU void* and function pointer arithmetic extensions. The
1320db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // GNU void* casts amount to no-ops since our void* type is i8*, but this is
1321db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // future proof.
1322b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar  if (ElementType->isVoidType() || ElementType->isFunctionType()) {
13233c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer    const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
1324b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    Value *Casted = Builder.CreateBitCast(Ptr, i8Ty);
13252a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar    Value *Res = Builder.CreateGEP(Casted, Idx, "add.ptr");
1326b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    return Builder.CreateBitCast(Res, Ptr->getType());
1327db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  }
1328db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1329664f8934e06cf10de98083b4526aef7bce191a3fDan Gohman  return Builder.CreateInBoundsGEP(Ptr, Idx, "add.ptr");
13307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
13317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
13327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
13332add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  if (!isa<llvm::PointerType>(Ops.LHS->getType())) {
1334035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump    if (CGF.getContext().getLangOptions().OverflowChecking
1335035cf8911c2282550411be70f370dfe5d282b5c9Mike Stump        && Ops.Ty->isSignedIntegerType())
13362add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump      return EmitOverflowCheckedBinOp(Ops);
133787415d2d45224596a96ef02310701797d56b2c19Chris Lattner
1338f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (Ops.LHS->getType()->isFPOrFPVectorTy())
133987415d2d45224596a96ef02310701797d56b2c19Chris Lattner      return Builder.CreateFSub(Ops.LHS, Ops.RHS, "sub");
13407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
13412add47387d39ee6c40dcb0e9f3d51c27ad1e113cMike Stump  }
13421f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner
134314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (Ops.E->getLHS()->getType()->isPointerType() &&
13446217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      Ops.E->getLHS()->getType()->getAs<PointerType>()->isVariableArrayType()) {
1345daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the addition needs to account for the VLA size for
1346daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // ptr-int
1347daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // The amount of the division needs to account for the VLA size for
1348daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    // ptr-ptr.
1349daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman    CGF.ErrorUnsupported(Ops.E, "VLA pointer subtraction");
1350daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  }
1351daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman
1352b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar  const QualType LHSType = Ops.E->getLHS()->getType();
135314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  const QualType LHSElementType = LHSType->getPointeeType();
13548c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar  if (!isa<llvm::PointerType>(Ops.RHS->getType())) {
13558c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    // pointer - int
13568c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *Idx = Ops.RHS;
13578c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    unsigned Width = cast<llvm::IntegerType>(Idx->getType())->getBitWidth();
13587cabee5b18212bd3106aea8415b044b2b3b43518Sanjiv Gupta    if (Width < CGF.LLVMPointerWidth) {
13598c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      // Zero or sign extend the pointer value based on whether the index is
13608c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      // signed or not.
13610032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      const llvm::Type *IdxType =
13620032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson          llvm::IntegerType::get(VMContext, CGF.LLVMPointerWidth);
13638c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      if (Ops.E->getRHS()->getType()->isSignedIntegerType())
13648c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar        Idx = Builder.CreateSExt(Idx, IdxType, "idx.ext");
13658c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar      else
13668c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar        Idx = Builder.CreateZExt(Idx, IdxType, "idx.ext");
13678c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    }
13688c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Idx = Builder.CreateNeg(Idx, "sub.ptr.neg");
1369b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar
1370db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // Handle interface types, which are not represented with a concrete type.
1371db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    if (const ObjCInterfaceType *OIT =
13722a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar        dyn_cast<ObjCInterfaceType>(LHSElementType)) {
1373db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump      llvm::Value *InterfaceSize =
13744a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson        llvm::ConstantInt::get(Idx->getType(),
1375199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                               CGF.getContext().
1376199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck                                 getTypeSizeInChars(OIT).getQuantity());
13772a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Idx = Builder.CreateMul(Idx, InterfaceSize);
13783c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
13792a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
13802a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      Value *Res = Builder.CreateGEP(LHSCasted, Idx, "add.ptr");
13812a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar      return Builder.CreateBitCast(Res, Ops.LHS->getType());
1382db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    }
13832a866251a80a8d88f6908f7dc68ce06d1023ec1dDaniel Dunbar
1384b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    // Explicitly handle GNU void* and function pointer arithmetic
1385db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // extensions. The GNU void* casts amount to no-ops since our void* type is
1386db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // i8*, but this is future proof.
1387b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar    if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
13883c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer      const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(VMContext);
1389b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      Value *LHSCasted = Builder.CreateBitCast(Ops.LHS, i8Ty);
1390b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      Value *Res = Builder.CreateGEP(LHSCasted, Idx, "sub.ptr");
1391b09fae74acfae7af8b3d31b9638a0aa0fdf7c7acDaniel Dunbar      return Builder.CreateBitCast(Res, Ops.LHS->getType());
1392db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    }
1393db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1394664f8934e06cf10de98083b4526aef7bce191a3fDan Gohman    return Builder.CreateInBoundsGEP(Ops.LHS, Idx, "sub.ptr");
1395820b03398fdcc8f1f6c60ace55b708e311fa8ce4Daniel Dunbar  } else {
13968c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    // pointer - pointer
13978c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *LHS = Ops.LHS;
13988c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *RHS = Ops.RHS;
1399db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1400199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    CharUnits ElementSize;
1401820b03398fdcc8f1f6c60ace55b708e311fa8ce4Daniel Dunbar
1402e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // Handle GCC extension for pointer arithmetic on void* and function pointer
1403e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // types.
1404e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    if (LHSElementType->isVoidType() || LHSElementType->isFunctionType()) {
1405199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck      ElementSize = CharUnits::One();
14068c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    } else {
1407199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck      ElementSize = CGF.getContext().getTypeSizeInChars(LHSElementType);
14088c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    }
1409db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
14108c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    const llvm::Type *ResultType = ConvertType(Ops.Ty);
14118c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    LHS = Builder.CreatePtrToInt(LHS, ResultType, "sub.ptr.lhs.cast");
14128c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    RHS = Builder.CreatePtrToInt(RHS, ResultType, "sub.ptr.rhs.cast");
14138c6f57c38b1451bb28945876b0d147fd2f26e6d3Daniel Dunbar    Value *BytesBetween = Builder.CreateSub(LHS, RHS, "sub.ptr.sub");
1414db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1415e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner    // Optimize out the shift for element size of 1.
1416199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    if (ElementSize.isOne())
1417e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner      return BytesBetween;
1418df1109434abd465a4db2e6f69ec2688866660367Dan Gohman
1419df1109434abd465a4db2e6f69ec2688866660367Dan Gohman    // Otherwise, do a full sdiv. This uses the "exact" form of sdiv, since
1420db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // pointer difference in C is only defined in the case where both operands
1421db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump    // are pointing to elements of an array.
1422199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    Value *BytesPerElt =
1423199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        llvm::ConstantInt::get(ResultType, ElementSize.getQuantity());
1424df1109434abd465a4db2e6f69ec2688866660367Dan Gohman    return Builder.CreateExactSDiv(BytesBetween, BytesPerElt, "sub.ptr.div");
14257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
14267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
14277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
14287f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) {
14297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // LLVM requires the LHS and RHS to be the same type: promote or truncate the
14307f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // RHS to the same size as the LHS.
14317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Ops.RHS;
14327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (Ops.LHS->getType() != RHS->getType())
14337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
1434db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1435be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  if (CGF.CatchUndefined
1436be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump      && isa<llvm::IntegerType>(Ops.LHS->getType())) {
1437be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    unsigned Width = cast<llvm::IntegerType>(Ops.LHS->getType())->getBitWidth();
1438be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
1439be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS,
1440be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump                                 llvm::ConstantInt::get(RHS->getType(), Width)),
144115037caa1542bb810ad54c653aeb80f61df7b00cMike Stump                             Cont, CGF.getTrapBB());
1442be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.EmitBlock(Cont);
1443be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  }
1444be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump
14457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateShl(Ops.LHS, RHS, "shl");
14467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
14477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
14487f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitShr(const BinOpInfo &Ops) {
14497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // LLVM requires the LHS and RHS to be the same type: promote or truncate the
14507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // RHS to the same size as the LHS.
14517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Ops.RHS;
14527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  if (Ops.LHS->getType() != RHS->getType())
14537f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom");
1454db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1455be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  if (CGF.CatchUndefined
1456be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump      && isa<llvm::IntegerType>(Ops.LHS->getType())) {
1457be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    unsigned Width = cast<llvm::IntegerType>(Ops.LHS->getType())->getBitWidth();
1458be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
1459be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS,
1460be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump                                 llvm::ConstantInt::get(RHS->getType(), Width)),
146115037caa1542bb810ad54c653aeb80f61df7b00cMike Stump                             Cont, CGF.getTrapBB());
1462be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump    CGF.EmitBlock(Cont);
1463be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump  }
1464be07f60131bc6f8d6696f4644df1ef667a1730d5Mike Stump
14651f1ded9629529085e1673c99fb805e4d9d0b370bChris Lattner  if (Ops.Ty->isUnsignedIntegerType())
14667f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    return Builder.CreateLShr(Ops.LHS, RHS, "shr");
14677f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Builder.CreateAShr(Ops.LHS, RHS, "shr");
14687f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
14697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
14707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc,
14717f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                      unsigned SICmpOpc, unsigned FCmpOpc) {
14727f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
14734f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  Value *Result;
14747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  QualType LHSTy = E->getLHS()->getType();
1475b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman  if (LHSTy->isMemberFunctionPointerType()) {
1476b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    Value *LHSPtr = CGF.EmitAnyExprToTemp(E->getLHS()).getAggregateAddr();
1477b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    Value *RHSPtr = CGF.EmitAnyExprToTemp(E->getRHS()).getAggregateAddr();
1478b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    llvm::Value *LHSFunc = Builder.CreateStructGEP(LHSPtr, 0);
1479b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    LHSFunc = Builder.CreateLoad(LHSFunc);
1480b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    llvm::Value *RHSFunc = Builder.CreateStructGEP(RHSPtr, 0);
1481b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    RHSFunc = Builder.CreateLoad(RHSFunc);
1482b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    Value *ResultF = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
1483b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman                                        LHSFunc, RHSFunc, "cmp.func");
1484b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    Value *NullPtr = llvm::Constant::getNullValue(LHSFunc->getType());
1485b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    Value *ResultNull = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
1486b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman                                           LHSFunc, NullPtr, "cmp.null");
1487b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    llvm::Value *LHSAdj = Builder.CreateStructGEP(LHSPtr, 1);
1488b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    LHSAdj = Builder.CreateLoad(LHSAdj);
1489b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    llvm::Value *RHSAdj = Builder.CreateStructGEP(RHSPtr, 1);
1490b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    RHSAdj = Builder.CreateLoad(RHSAdj);
1491b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    Value *ResultA = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
1492b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman                                        LHSAdj, RHSAdj, "cmp.adj");
1493b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    if (E->getOpcode() == BinaryOperator::EQ) {
1494b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman      Result = Builder.CreateOr(ResultNull, ResultA, "or.na");
1495b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman      Result = Builder.CreateAnd(Result, ResultF, "and.f");
1496b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    } else {
1497b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman      assert(E->getOpcode() == BinaryOperator::NE &&
1498b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman             "Member pointer comparison other than == or != ?");
1499b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman      Result = Builder.CreateAnd(ResultNull, ResultA, "and.na");
1500b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman      Result = Builder.CreateOr(Result, ResultF, "or.f");
1501b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman    }
1502b81c786de58ce484230dc04f9a7c78bc48990106Eli Friedman  } else if (!LHSTy->isAnyComplexType()) {
15037f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *LHS = Visit(E->getLHS());
15047f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    Value *RHS = Visit(E->getRHS());
1505db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1506f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands    if (LHS->getType()->isFPOrFPVectorTy()) {
15077a66d7b6c0d84f8c9c74c687a338cf3cf6b9c808Nate Begeman      Result = Builder.CreateFCmp((llvm::CmpInst::Predicate)FCmpOpc,
15087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
1509ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman    } else if (LHSTy->isSignedIntegerType()) {
1510ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)SICmpOpc,
15117f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
15127f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
1513ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      // Unsigned integers and pointers.
1514ec2c12646aee07bf6bb1b4092d538d5860fd0661Eli Friedman      Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
15157f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                  LHS, RHS, "cmp");
15167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
15179c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner
15189c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    // If this is a vector comparison, sign extend the result to the appropriate
15199c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    // vector integer type and return it (don't convert to bool).
15209c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner    if (LHSTy->isVectorType())
15219c10fcfc3b9d2076efe701b60644a9987a93c503Chris Lattner      return Builder.CreateSExt(Result, ConvertType(E->getType()), "sext");
1522db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
15237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  } else {
15247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    // Complex Comparison: can only be an equality comparison.
15257f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    CodeGenFunction::ComplexPairTy LHS = CGF.EmitComplexExpr(E->getLHS());
15267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    CodeGenFunction::ComplexPairTy RHS = CGF.EmitComplexExpr(E->getRHS());
1527db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1528183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    QualType CETy = LHSTy->getAs<ComplexType>()->getElementType();
1529db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
15304f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner    Value *ResultR, *ResultI;
15317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    if (CETy->isRealFloatingType()) {
15327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultR = Builder.CreateFCmp((llvm::FCmpInst::Predicate)FCmpOpc,
15337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.first, RHS.first, "cmp.r");
15347f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultI = Builder.CreateFCmp((llvm::FCmpInst::Predicate)FCmpOpc,
15357f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.second, RHS.second, "cmp.i");
15367f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
15377f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      // Complex comparisons can only be equality comparisons.  As such, signed
15387f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      // and unsigned opcodes are the same.
15397f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultR = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
15407f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.first, RHS.first, "cmp.r");
15417f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      ResultI = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc,
15427f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner                                   LHS.second, RHS.second, "cmp.i");
15437f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
1544db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
15457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    if (E->getOpcode() == BinaryOperator::EQ) {
15467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      Result = Builder.CreateAnd(ResultR, ResultI, "and.ri");
15477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    } else {
15487f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      assert(E->getOpcode() == BinaryOperator::NE &&
15497f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner             "Complex comparison other than == or != ?");
15507f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner      Result = Builder.CreateOr(ResultR, ResultI, "or.ri");
15517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner    }
15527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  }
155332f6209ea9a5a88ad3f8d7ad5e5b160b403d12daNuno Lopes
155432f6209ea9a5a88ad3f8d7ad5e5b160b403d12daNuno Lopes  return EmitScalarConversion(Result, CGF.getContext().BoolTy, E->getType());
15557f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
15567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
15577f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) {
15587f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  bool Ignore = TestAndClearIgnoreResultAssign();
15597f79f9be5916c51c35da4f126b7c12596a101607Mike Stump
15607f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // __block variables need to have the rhs evaluated first, plus this should
15617f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // improve codegen just a little.
15627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHS = Visit(E->getRHS());
1563b14e62d5aee7522b98c410ee65bd750c2cfe6f01Mike Stump  LValue LHS = EmitCheckedLValue(E->getLHS());
1564db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1565ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar  // Store the value into the LHS.  Bit-fields are handled specially
1566371d16f45aeec61c1d07687f763d92137e133642Daniel Dunbar  // because the result is altered by the store, i.e., [C99 6.5.16p1]
1567371d16f45aeec61c1d07687f763d92137e133642Daniel Dunbar  // 'An assignment expression has the value of the left operand after
1568daa24a29f881fb2ae53c4022e593eda1adf4b95bEli Friedman  // the assignment...'.
15697f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (LHS.isBitfield()) {
15707f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    if (!LHS.isVolatileQualified()) {
15717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      CGF.EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, E->getType(),
15727f79f9be5916c51c35da4f126b7c12596a101607Mike Stump                                         &RHS);
15737f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      return RHS;
15747f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    } else
15757f79f9be5916c51c35da4f126b7c12596a101607Mike Stump      CGF.EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, E->getType());
15767f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  } else
1577ed3849b456d64d124bddc7ac044f3ce590bd9d69Daniel Dunbar    CGF.EmitStoreThroughLValue(RValue::get(RHS), LHS, E->getType());
15787f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  if (Ignore)
15797f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    return 0;
15807f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  return EmitLoadOfLValue(LHS, E->getType());
15817f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
15827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
15837f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {
15847804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  const llvm::Type *ResTy = ConvertType(E->getType());
15857804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner
158620eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 0 && RHS, see if we can elide RHS, if so, just return 0.
158720eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 1 && X, just emit X without inserting the control flow.
158820eb09d562b80420a3328be789547af354bf3e36Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getLHS())) {
158920eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (Cond == 1) { // If we have 1 && X, just emit X.
15900946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner      Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
15917804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      // ZExt result to int or bool.
15927804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "land.ext");
15930946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    }
1594db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
15957804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner    // 0 && RHS: If it is safe, just elide the RHS, and return 0/false.
159620eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (!CGF.ContainsLabel(E->getRHS()))
15977804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return llvm::Constant::getNullValue(ResTy);
15980946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  }
1599db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
16009615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("land.end");
16019615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *RHSBlock  = CGF.createBasicBlock("land.rhs");
160220eb09d562b80420a3328be789547af354bf3e36Chris Lattner
1603f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Branch on the LHS first.  If it is false, go to the failure (cont) block.
1604f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBranchOnBoolExpr(E->getLHS(), RHSBlock, ContBlock);
1605f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
1606f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Any edges into the ContBlock are now from an (indeterminate number of)
1607f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // edges from this first condition.  All of these values will be false.  Start
1608f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // setting up the PHI node in the Cont Block for this.
16090032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext),
16100032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                            "", ContBlock);
1611f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  PN->reserveOperandSpace(2);  // Normal case, two inputs.
1612f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock);
1613f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner       PI != PE; ++PI)
16143b144ba615c32f3cfa5309060ed5e09c89ac2871Owen Anderson    PN->addIncoming(llvm::ConstantInt::getFalse(VMContext), *PI);
1615db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
161672119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
16177f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
16187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
161972119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
1620db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
16217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Reaquire the RHS block, as there may be subblocks inserted.
16227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
1623f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
1624f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit an unconditional branch from this block to ContBlock.  Insert an entry
1625f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // into the phi node for the edge with the value of RHSCond.
16267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(ContBlock);
16277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHSCond, RHSBlock);
1628db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
16297f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // ZExt result to int.
16307804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  return Builder.CreateZExtOrBitCast(PN, ResTy, "land.ext");
16317f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
16327f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
16337f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) {
16347804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  const llvm::Type *ResTy = ConvertType(E->getType());
16357804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner
163620eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 1 || RHS, see if we can elide RHS, if so, just return 1.
163720eb09d562b80420a3328be789547af354bf3e36Chris Lattner  // If we have 0 || X, just emit X without inserting the control flow.
163820eb09d562b80420a3328be789547af354bf3e36Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getLHS())) {
163920eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (Cond == -1) { // If we have 0 || X, just emit X.
16400946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner      Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
16417804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      // ZExt result to int or bool.
16427804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "lor.ext");
16430946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner    }
1644db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
16457804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner    // 1 || RHS: If it is safe, just elide the RHS, and return 1/true.
164620eb09d562b80420a3328be789547af354bf3e36Chris Lattner    if (!CGF.ContainsLabel(E->getRHS()))
16477804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner      return llvm::ConstantInt::get(ResTy, 1);
16480946ccd1e58c1f1da31ddbca67c5b6301ac8b255Chris Lattner  }
1649db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
16509615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("lor.end");
16519615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("lor.rhs");
1652db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1653f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Branch on the LHS first.  If it is true, go to the success (cont) block.
1654f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBranchOnBoolExpr(E->getLHS(), ContBlock, RHSBlock);
1655f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
1656f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Any edges into the ContBlock are now from an (indeterminate number of)
1657f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // edges from this first condition.  All of these values will be true.  Start
1658f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // setting up the PHI node in the Cont Block for this.
16590032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  llvm::PHINode *PN = llvm::PHINode::Create(llvm::Type::getInt1Ty(VMContext),
16600032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                            "", ContBlock);
1661f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  PN->reserveOperandSpace(2);  // Normal case, two inputs.
1662f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  for (llvm::pred_iterator PI = pred_begin(ContBlock), PE = pred_end(ContBlock);
1663f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner       PI != PE; ++PI)
16643b144ba615c32f3cfa5309060ed5e09c89ac2871Owen Anderson    PN->addIncoming(llvm::ConstantInt::getTrue(VMContext), *PI);
1665f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner
166672119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
166733da07db112f4877f6ab13e20db08b9bb86a0c2eAnders Carlsson
1668f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit the RHS condition as a bool value.
16697f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
16707f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
1671db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
167272119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
1673db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
16747f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Reaquire the RHS block, as there may be subblocks inserted.
16757f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
1676db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1677f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // Emit an unconditional branch from this block to ContBlock.  Insert an entry
1678f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  // into the phi node for the edge with the value of RHSCond.
1679f7b5ea9de3d043fa900ab8a8976a4c0eefc233b7Chris Lattner  CGF.EmitBlock(ContBlock);
16807f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHSCond, RHSBlock);
1681db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
16827f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // ZExt result to int.
16837804bcba90bf5ea8ec6cd0f6cc9a64577f1a9259Chris Lattner  return Builder.CreateZExtOrBitCast(PN, ResTy, "lor.ext");
16847f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
16857f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
16867f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitBinComma(const BinaryOperator *E) {
16877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitStmt(E->getLHS());
1688a448fb2da03ece39978784793eea68760e8205a1Daniel Dunbar  CGF.EnsureInsertPoint();
16897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return Visit(E->getRHS());
16907f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
16917f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
16927f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
16937f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                             Other Operators
16947f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
16957f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
16969802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// isCheapEnoughToEvaluateUnconditionally - Return true if the specified
16979802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// expression is cheap enough and side-effect-free enough to evaluate
16989802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// unconditionally instead of conditionally.  This is used to convert control
16999802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner/// flow into selects in some cases.
1700df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stumpstatic bool isCheapEnoughToEvaluateUnconditionally(const Expr *E,
1701df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                                   CodeGenFunction &CGF) {
17029802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (const ParenExpr *PE = dyn_cast<ParenExpr>(E))
1703df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return isCheapEnoughToEvaluateUnconditionally(PE->getSubExpr(), CGF);
1704db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
17059802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // TODO: Allow anything we can constant fold to an integer or fp constant.
17069802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (isa<IntegerLiteral>(E) || isa<CharacterLiteral>(E) ||
17079802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner      isa<FloatingLiteral>(E))
17089802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    return true;
1709db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
17109802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // Non-volatile automatic variables too, to get "cond ? X : Y" where
17119802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // X and Y are local variables.
17129802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
17139802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
1714df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      if (VD->hasLocalStorage() && !(CGF.getContext()
1715df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                     .getCanonicalType(VD->getType())
1716df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                     .isVolatileQualified()))
17179802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner        return true;
1718db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
17199802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  return false;
17209802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner}
17219802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner
17229802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner
17237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::
17247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerVisitConditionalOperator(const ConditionalOperator *E) {
17257f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  TestAndClearIgnoreResultAssign();
172631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  // If the condition constant folds and can be elided, try to avoid emitting
172731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  // the condition and the dead arm.
172831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner  if (int Cond = CGF.ConstantFoldsToSimpleInteger(E->getCond())){
1729c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner    Expr *Live = E->getLHS(), *Dead = E->getRHS();
173031a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    if (Cond == -1)
1731c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner      std::swap(Live, Dead);
1732db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
173331a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // If the dead side doesn't have labels we need, and if the Live side isn't
173431a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // the gnu missing ?: extension (which we could handle, but don't bother
173531a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    // to), just emit the Live part.
173631a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner    if ((!Dead || !CGF.ContainsLabel(Dead)) &&  // No labels in dead part
173731a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner        Live)                                   // Live part isn't missing.
173831a0984b5cb4af99d2407c0f25bf5af68df681c6Chris Lattner      return Visit(Live);
1739c657e92d7b44568fe39ae018a69b18cbcc4ea3b0Chris Lattner  }
1740db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1741db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
17429802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // If this is a really simple expression (like x ? 4 : 5), emit this as a
17439802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  // select instead of as control flow.  We can only do this if it is cheap and
1744531a550531c144a58438f187816abbf1879e1c4eChris Lattner  // safe to evaluate the LHS and RHS unconditionally.
1745df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump  if (E->getLHS() && isCheapEnoughToEvaluateUnconditionally(E->getLHS(),
1746df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                                            CGF) &&
1747df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      isCheapEnoughToEvaluateUnconditionally(E->getRHS(), CGF)) {
17489802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *CondV = CGF.EvaluateExprAsBool(E->getCond());
17499802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *LHS = Visit(E->getLHS());
17509802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    llvm::Value *RHS = Visit(E->getRHS());
17519802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner    return Builder.CreateSelect(CondV, LHS, RHS, "cond");
17529802a5173ffd403d9ede2d4b6b6107fa2e220544Chris Lattner  }
1753db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1754db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1755be65abc8e41213ecb951f2f507fb2e13a151d30cDaniel Dunbar  llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
1756be65abc8e41213ecb951f2f507fb2e13a151d30cDaniel Dunbar  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
17579615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
1758035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner  Value *CondVal = 0;
1759035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner
1760db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // If we don't have the GNU missing condition extension, emit a branch on bool
1761db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  // the normal way.
176212d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner  if (E->getLHS()) {
176312d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // Otherwise, just use EmitBranchOnBoolExpr to get small and simple code for
176412d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // the branch on bool.
176512d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
176612d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner  } else {
176712d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // Otherwise, for the ?: extension, evaluate the conditional and then
176812d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // convert it to bool the hard way.  We do this explicitly because we need
176912d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // the unconverted value for the missing middle value of the ?:.
1770035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    CondVal = CGF.EmitScalarExpr(E->getCond());
1771db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
177212d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // In some cases, EmitScalarConversion will delete the "CondVal" expression
177312d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // if there are no extra uses (an optimization).  Inhibit this by making an
177412d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // extra dead use, because we're going to add a use of CondVal later.  We
177512d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // don't use the builder for this, because we don't want it to get optimized
177612d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    // away.  This leaves dead code, but the ?: extension isn't common.
177712d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner    new llvm::BitCastInst(CondVal, CondVal->getType(), "dummy?:holder",
177812d152f61ccef9a2c0372ba39be7cf416c6e1a9eChris Lattner                          Builder.GetInsertBlock());
1779db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1780035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    Value *CondBoolVal =
1781035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner      CGF.EmitScalarConversion(CondVal, E->getCond()->getType(),
1782035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner                               CGF.getContext().BoolTy);
1783035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner    Builder.CreateCondBr(CondBoolVal, LHSBlock, RHSBlock);
1784035cf4294319271ad19ddcc5ba327c8365f3575eChris Lattner  }
1785fb6fa30a9b06670deb14f862dddbc49a12552939Anders Carlsson
178672119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
17877f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(LHSBlock);
1788db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
17897f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Handle the GNU extension for missing LHS.
1790a21ddb30e56026967d58e26c5212744e1831305bChris Lattner  Value *LHS;
1791a21ddb30e56026967d58e26c5212744e1831305bChris Lattner  if (E->getLHS())
1792856226c37ff10955c7f3f07ce6fa9522da23a3a5Eli Friedman    LHS = Visit(E->getLHS());
1793a21ddb30e56026967d58e26c5212744e1831305bChris Lattner  else    // Perform promotions, to handle cases like "short ?: int"
1794a21ddb30e56026967d58e26c5212744e1831305bChris Lattner    LHS = EmitScalarConversion(CondVal, E->getCond()->getType(), E->getType());
1795db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
179672119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
17977f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  LHSBlock = Builder.GetInsertBlock();
1798d57a871339c7c98d58d93108b806f59bdf4e13e2Daniel Dunbar  CGF.EmitBranch(ContBlock);
1799db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
180072119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.BeginConditionalBranch();
18017f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(RHSBlock);
1802db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
1803856226c37ff10955c7f3f07ce6fa9522da23a3a5Eli Friedman  Value *RHS = Visit(E->getRHS());
180472119a887c4af39c90f10b6bdc158389071f42eaAnders Carlsson  CGF.EndConditionalBranch();
18057f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  RHSBlock = Builder.GetInsertBlock();
1806d57a871339c7c98d58d93108b806f59bdf4e13e2Daniel Dunbar  CGF.EmitBranch(ContBlock);
1807db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
18087f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  CGF.EmitBlock(ContBlock);
1809db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
181048daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  // If the LHS or RHS is a throw expression, it will be legitimately null.
181148daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  if (!LHS)
181248daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman    return RHS;
181348daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  if (!RHS)
181448daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman    return LHS;
1815db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
18167f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  // Create a PHI node for the real part.
18177f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  llvm::PHINode *PN = Builder.CreatePHI(LHS->getType(), "cond");
18187f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->reserveOperandSpace(2);
18197f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(LHS, LHSBlock);
18207f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  PN->addIncoming(RHS, RHSBlock);
18217f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  return PN;
18227f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
18237f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
18247f02f721d48772e4eee4fccd8af4f800be1bbc1eChris LattnerValue *ScalarExprEmitter::VisitChooseExpr(ChooseExpr *E) {
18257976932a1c256d447316ffac58e9821417725e34Eli Friedman  return Visit(E->getChosenSubExpr(CGF.getContext()));
18267f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
18277f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
18282202bce80fc72d067cbe67dc1512f7b45351fd31Chris LattnerValue *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE) {
18294fd0aa5803357d8c72eeac2cae15e12649ea08feEli Friedman  llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr());
1830ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType());
1831ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson
1832ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  // If EmitVAArg fails, we fall back to the LLVM instruction.
1833db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump  if (!ArgPtr)
1834ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson    return Builder.CreateVAArg(ArgValue, ConvertType(VE->getType()));
1835ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson
18367f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  // FIXME Volatility.
1837ddf7cac45d85b73127adbbd91a2b28fc7291c57eAnders Carlsson  return Builder.CreateLoad(ArgPtr);
18387c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
18397c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
1840df6b68c9487aed2042c7fc23db10a79f89083a11Mike StumpValue *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *BE) {
18410892099dbc640720400a1d9decd2733a09d733e5Mike Stump  return CGF.BuildBlockLiteralTmp(BE);
1842df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump}
1843df6b68c9487aed2042c7fc23db10a79f89083a11Mike Stump
18447f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
18457f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//                         Entry Point into this File
18467f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner//===----------------------------------------------------------------------===//
18477f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
1848db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitScalarExpr - Emit the computation of the specified expression of scalar
1849db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type, ignoring the result.
18507f79f9be5916c51c35da4f126b7c12596a101607Mike StumpValue *CodeGenFunction::EmitScalarExpr(const Expr *E, bool IgnoreResultAssign) {
18517f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  assert(E && !hasAggregateLLVMType(E->getType()) &&
18527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner         "Invalid scalar expression to emit");
1853db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump
18547f79f9be5916c51c35da4f126b7c12596a101607Mike Stump  return ScalarExprEmitter(*this, IgnoreResultAssign)
18557f79f9be5916c51c35da4f126b7c12596a101607Mike Stump    .Visit(const_cast<Expr*>(E));
18567f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner}
18573707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
18583707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// EmitScalarConversion - Emit a conversion from the specified type to the
18593707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner/// specified destination type, both of which are LLVM scalar types.
18604f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *CodeGenFunction::EmitScalarConversion(Value *Src, QualType SrcTy,
18614f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                             QualType DstTy) {
18623707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  assert(!hasAggregateLLVMType(SrcTy) && !hasAggregateLLVMType(DstTy) &&
18633707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner         "Invalid scalar expression to emit");
18643707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  return ScalarExprEmitter(*this).EmitScalarConversion(Src, SrcTy, DstTy);
18653707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner}
18664f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
1867db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// EmitComplexToScalarConversion - Emit a conversion from the specified complex
1868db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// type to the specified destination type, where the destination type is an
1869db52dcdae7d2e25565096d07ee74fa307061cc32Mike Stump/// LLVM scalar type.
18704f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris LattnerValue *CodeGenFunction::EmitComplexToScalarConversion(ComplexPairTy Src,
18714f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                      QualType SrcTy,
18724f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                      QualType DstTy) {
18739b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner  assert(SrcTy->isAnyComplexType() && !hasAggregateLLVMType(DstTy) &&
18744f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner         "Invalid complex -> scalar conversion");
18754f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  return ScalarExprEmitter(*this).EmitComplexToScalarConversion(Src, SrcTy,
18764f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                                                DstTy);
18774f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner}
1878cc23acae84c6d5c37b4805edbcd95ee5d821c400Anders Carlsson
1879820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz JahanianLValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
1880820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  llvm::Value *V;
1881820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // object->isa or (*object).isa
1882820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // Generate code as for: *(Class*)object
18835ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  // build Class* type
18845ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  const llvm::Type *ClassPtrTy = ConvertType(E->getType());
18855ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian
1886820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  Expr *BaseExpr = E->getBase();
18875ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  if (BaseExpr->isLvalue(getContext()) != Expr::LV_Valid) {
18885ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    V = CreateTempAlloca(ClassPtrTy, "resval");
18895ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    llvm::Value *Src = EmitScalarExpr(BaseExpr);
18905ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian    Builder.CreateStore(Src, V);
18915ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  }
18925ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  else {
18935ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian      if (E->isArrow())
18945ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian        V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
18955ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian      else
18965ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian        V  = EmitLValue(BaseExpr).getAddress();
18975ed676c90c839c89093b605d76c7e581ab69ebb8Fariborz Jahanian  }
1898820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian
1899820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  // build Class* type
1900820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  ClassPtrTy = ClassPtrTy->getPointerTo();
1901820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  V = Builder.CreateBitCast(V, ClassPtrTy);
1902820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  LValue LV = LValue::MakeAddr(V, MakeQualifiers(E->getType()));
1903820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian  return LV;
1904820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian}
1905820bca41c3899374775d2a1dfc2ef2e22aaf1c7bFariborz Jahanian
1906