Optimize constant operand order.

Constant operands of commutative operations preferably go on the right
hand side to avoid requiring an extra register for two operand
instructions. Also, Subzero assumes constants in pointer arithmetic are
on the right hand side to consider optimizing it into an addressing
mode.

Change-Id: Ife5a471903d5f4bef0c19b6c908d75715f06bfec
Reviewed-on: https://swiftshader-review.googlesource.com/8548
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 21298f8..3187777 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -589,12 +589,31 @@
 		::basicBlock->appendInst(br);
 	}
 
+	static bool isCommutative(Ice::InstArithmetic::OpKind op)
+	{
+		switch(op)
+		{
+		case Ice::InstArithmetic::Add:
+		case Ice::InstArithmetic::Fadd:
+		case Ice::InstArithmetic::Mul:
+		case Ice::InstArithmetic::Fmul:
+		case Ice::InstArithmetic::And:
+		case Ice::InstArithmetic::Or:
+		case Ice::InstArithmetic::Xor:
+			return true;
+		default:
+			return false;
+		}
+	}
+
 	static Value *createArithmetic(Ice::InstArithmetic::OpKind op, Value *lhs, Value *rhs)
 	{
 		assert(lhs->getType() == rhs->getType() || (llvm::isa<Ice::Constant>(rhs) && (op == Ice::InstArithmetic::Shl || Ice::InstArithmetic::Lshr || Ice::InstArithmetic::Ashr)));
 
+		bool swapOperands = llvm::isa<Ice::Constant>(lhs) && isCommutative(op);
+
 		Ice::Variable *result = ::function->makeVariable(lhs->getType());
-		Ice::InstArithmetic *arithmetic = Ice::InstArithmetic::create(::function, op, result, lhs, rhs);
+		Ice::InstArithmetic *arithmetic = Ice::InstArithmetic::create(::function, op, result, swapOperands ? rhs : lhs, swapOperands ? lhs : rhs);
 		::basicBlock->appendInst(arithmetic);
 
 		return V(result);
diff --git a/third_party/pnacl-subzero b/third_party/pnacl-subzero
index dbf81e0..8bd18e1 160000
--- a/third_party/pnacl-subzero
+++ b/third_party/pnacl-subzero
@@ -1 +1 @@
-Subproject commit dbf81e0c0e364173176159e0e2548e9948b197a4
+Subproject commit 8bd18e1be3eb25d60a4696bb948ab41f6ce6afd6