[macruby-changes] [1863] MacRuby/branches/fp-optimized-experimental/compiler.cpp

source_changes at macosforge.org source_changes at macosforge.org
Mon Jun 15 16:04:28 PDT 2009


Revision: 1863
          http://trac.macosforge.org/projects/ruby/changeset/1863
Author:   pthomson at apple.com
Date:     2009-06-15 16:04:27 -0700 (Mon, 15 Jun 2009)
Log Message:
-----------
Put in checks to see if the result is fixable in compile_variable_arith_node.

Modified Paths:
--------------
    MacRuby/branches/fp-optimized-experimental/compiler.cpp

Modified: MacRuby/branches/fp-optimized-experimental/compiler.cpp
===================================================================
--- MacRuby/branches/fp-optimized-experimental/compiler.cpp	2009-06-15 22:47:13 UTC (rev 1862)
+++ MacRuby/branches/fp-optimized-experimental/compiler.cpp	2009-06-15 23:04:27 UTC (rev 1863)
@@ -1622,36 +1622,33 @@
 			abort();		
 		}
 	}
-	if (!result_is_fixfloat) {
-		Value *is_redefined_val = new LoadInst(is_redefined, "", bb);
-		Value *isOpRedefined = new ICmpInst(ICmpInst::ICMP_EQ, 
-											is_redefined_val, ConstantInt::getFalse(), "", bb);
+	Value *is_redefined_val = new LoadInst(is_redefined, "", bb);
+	Value *isOpRedefined = new ICmpInst(ICmpInst::ICMP_EQ, 
+										is_redefined_val, ConstantInt::getFalse(), "", bb);
+	
+	Function *f = bb->getParent();
+	
+	BasicBlock *thenBB = BasicBlock::Create("op_not_redefined", f);
+	BasicBlock *elseBB  = BasicBlock::Create("op_dispatch", f);
+	BasicBlock *mergeBB = BasicBlock::Create("op_merge", f);
+	
+	BranchInst::Create(thenBB, elseBB, isOpRedefined, bb);
+	Value *thenVal = result_is_fixfloat
+	? ConstantInt::get(RubyObjTy, DBL2FIXFLOAT(res)) 
+	: (res == 1 ? trueVal : falseVal);
+	BranchInst::Create(mergeBB, thenBB);
+	
+	bb = elseBB;
+	Value *elseVal = compile_dispatch_call(params);
+	elseBB = bb;
+	BranchInst::Create(mergeBB, elseBB);
+	
+	PHINode *pn = PHINode::Create(RubyObjTy, "op_tmp", mergeBB);
+	pn->addIncoming(thenVal, thenBB);
+	pn->addIncoming(elseVal, elseBB);
+	bb = mergeBB;
 		
-		Function *f = bb->getParent();
-		
-		BasicBlock *thenBB = BasicBlock::Create("op_not_redefined", f);
-		BasicBlock *elseBB  = BasicBlock::Create("op_dispatch", f);
-		BasicBlock *mergeBB = BasicBlock::Create("op_merge", f);
-		
-		BranchInst::Create(thenBB, elseBB, isOpRedefined, bb);
-		Value *thenVal = result_is_fixfloat
-		? ConstantInt::get(RubyObjTy, DBL2FIXFLOAT(res)) 
-		: (res == 1 ? trueVal : falseVal);
-		BranchInst::Create(mergeBB, thenBB);
-		
-		bb = elseBB;
-		Value *elseVal = compile_dispatch_call(params);
-		elseBB = bb;
-		BranchInst::Create(mergeBB, elseBB);
-		
-		PHINode *pn = PHINode::Create(RubyObjTy, "op_tmp", mergeBB);
-		pn->addIncoming(thenVal, thenBB);
-		pn->addIncoming(elseVal, elseBB);
-		bb = mergeBB;
-		
-		return pn;
-	}
-	return NULL; // loss of precision, call the dispatcher.
+	return pn;
 }
 
 CmpInst::Predicate
@@ -1911,6 +1908,7 @@
 	BasicBlock *redefBB = BasicBlock::Create("op_not_redefined", f);
 	BasicBlock *toDblBB = BasicBlock::Create("op_optimize_floating", f);
 	BasicBlock *toIntBB = BasicBlock::Create("op_optimize_integral", f);
+	BasicBlock *then3BB = BasicBlock::Create("op_fixable_max", f);
 	BasicBlock *elseBB  = BasicBlock::Create("op_dispatch", f);
 	BasicBlock *mergeBB = BasicBlock::Create("op_merge", f);
 	
@@ -1996,8 +1994,18 @@
 	else {
 		Value *shiftedResult = BinaryOperator::CreateShl(opVal, twoVal, "", bb);
 		intReturnResult = BinaryOperator::CreateOr(shiftedResult, oneVal, "", bb);
+		
+		// Is result fixable?
+		Value *fixnumMax = ConstantInt::get(IntTy, FIXNUM_MAX + 1);
+		Value *isFixnumMaxOk = new ICmpInst(ICmpInst::ICMP_SLT, opVal, fixnumMax, "", bb);
+		BranchInst::Create(then3BB, elseBB, isFixnumMaxOk, bb);
+		
+		bb = then3BB;
+		Value *fixnumMin = ConstantInt::get(IntTy, FIXNUM_MIN);
+		Value *isFixnumMinOk = new ICmpInst(ICmpInst::ICMP_SGE, opVal, fixnumMin, "", bb);
+		
+		BranchInst::Create(mergeBB, elseBB, isFixnumMinOk, bb);
 	} 
-	BranchInst::Create(mergeBB, toIntBB);
 	
 	bb = elseBB;
 	Value *elseVal = compile_dispatch_call(params);
@@ -2007,7 +2015,7 @@
 	bb = mergeBB;
 	PHINode *pn = PHINode::Create(RubyObjTy, "op_tmp", mergeBB);
 	pn->addIncoming(dblReturnResult, toDblBB);
-	pn->addIncoming(intReturnResult, toIntBB);
+	pn->addIncoming(intReturnResult, then3BB);
 	pn->addIncoming(elseVal, elseBB);
 
 	return pn;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090615/7d5ea341/attachment.html>


More information about the macruby-changes mailing list