aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenFunction.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-07-20 21:07:09 +0000
committerChris Lattner <sabre@nondot.org>2010-07-20 21:07:09 +0000
commit83252dcfe61aaebcb6bc117e71dc12968729513f (patch)
treea303b42463464aef9a146dbc5678a70d0c0bfe31 /lib/CodeGen/CodeGenFunction.cpp
parent021a7a63984f0f912dc9e9dae2a1b3e1509a40ce (diff)
Follow the implementation approach suggested by PR6687,
which generates more efficient and more obviously conformant code. We now test for overflow of the multiply then force the result to -1 if so. On X86, this generates nice code like this: __Z4testl: ## @_Z4testl ## BB#0: ## %entry subl $12, %esp movl $4, %eax mull 16(%esp) testl %edx, %edx movl $-1, %ecx cmovel %eax, %ecx movl %ecx, (%esp) call __Znam addl $12, %esp ret git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108927 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r--lib/CodeGen/CodeGenFunction.cpp40
1 files changed, 1 insertions, 39 deletions
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 5e5e2a49cc..eb6c4361be 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -36,7 +36,7 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
DidCallStackSave(false), UnreachableBlock(0),
CXXThisDecl(0), CXXThisValue(0), CXXVTTDecl(0), CXXVTTValue(0),
ConditionalBranchLevel(0), TerminateLandingPad(0), TerminateHandler(0),
- TrapBB(0), ThrowLengthErrorBB(0) {
+ TrapBB(0) {
// Get some frequently used types.
LLVMPointerWidth = Target.getPointerWidth(0);
@@ -155,13 +155,6 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
Builder.ClearInsertionPoint();
}
- // If someone called operator new[] and needs a throw_length_error block, emit
- // it at the end of the function.
- if (ThrowLengthErrorBB) {
- EmitBlock(ThrowLengthErrorBB);
- Builder.ClearInsertionPoint();
- }
-
// Remove the AllocaInsertPt instruction, which is just a convenience for us.
llvm::Instruction *Ptr = AllocaInsertPt;
AllocaInsertPt = 0;
@@ -185,37 +178,6 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
EmitDeclMetadata();
}
-/// getThrowLengthErrorBB - Create a basic block that will call
-/// std::__throw_length_error to throw a std::length_error exception.
-llvm::BasicBlock *CodeGenFunction::getThrowLengthErrorBB() {
- if (ThrowLengthErrorBB) return ThrowLengthErrorBB;
-
- llvm::IRBuilder<>::InsertPoint SavedIP = Builder.saveIP();
-
- ThrowLengthErrorBB = createBasicBlock("throw_length_error");
- Builder.SetInsertPoint(ThrowLengthErrorBB);
-
- // Call to void std::__throw_length_error("length_error");
- const llvm::Type *ResultType = Builder.getVoidTy();
- const llvm::Type *PtrToInt8Ty = Builder.getInt8PtrTy();
- std::vector<const llvm::Type*> ArgTys(1, PtrToInt8Ty);
- llvm::Constant *Fn =
- CGM.CreateRuntimeFunction(llvm::FunctionType::get(ResultType, ArgTys, false),
- "_ZSt20__throw_length_errorPKc");
-
- llvm::Value *C = CGM.GetAddrOfConstantCString("length_error");
- C = Builder.CreateStructGEP(C, 0, "arraydecay");
- llvm::CallInst *TheCall = Builder.CreateCall(Fn, C);
- TheCall->setDoesNotReturn();
-
- Builder.CreateUnreachable();
-
-
- Builder.restoreIP(SavedIP);
- return ThrowLengthErrorBB;
-}
-
-
/// ShouldInstrumentFunction - Return true if the current function should be
/// instrumented with __cyg_profile_func_* calls
bool CodeGenFunction::ShouldInstrumentFunction() {