public Object[] ic_trans(IcFun f,IcStmt_label break_to){
		/* branch L1 if expr1==0
		 * expr2
		 * goto L2
		 * L1
		 * expr3
		 * L2
		 */
		LinkedList<IcStmt> codes = new LinkedList<IcStmt>();

		IcVar_tmp x = null;
		boolean is_void = the_type.coerceTo(Type.THE_VOID);
		if(!is_void)
			x = IcVar_tmp.new_one(f);
		
		/* 1.L1(not now) & L2(not add now) */
		IcStmt_label the_l1 = IcStmt_label.new_one(f, 0);
		f.labels.add(the_l1);
		IcStmt_label the_l2 = IcStmt_label.new_one(f, 0);
		f.labels.add(the_l2);
		/* 2.expr1 */
		Object[] result = e1.ic_trans(f, break_to);
		codes.addAll((LinkedList<IcStmt>)result[0]);
		IcOper pred = (IcOper)result[1];
		/* 3.branch */
		codes.add(new IcStmt_branch(f,0,pred,new IcConst_int(0),the_l1,IcStmt_branch.EQ));
		/* 4.expr2 */
		Object[] result2 = e2.ic_trans(f, break_to);
		codes.addAll((LinkedList<IcStmt>)result2[0]);
		IcOper r2 = (IcOper)result2[1];
		if(!is_void)
			codes.add(new IcStmt_assign(f,0,x,r2));
		/* 5.goto L2 */
		codes.add(new IcStmt_goto(f,0,the_l2));
		/* 6.L1 */
		codes.add(the_l1);
		/* 7.expr3 */
		Object[] result3 = e3.ic_trans(f, break_to);
		codes.addAll((LinkedList<IcStmt>)result3[0]);
		IcOper r3 = (IcOper)result3[1];
		if(!is_void)
			codes.add(new IcStmt_assign(f,0,x,r3));
		/* 8.L2 */
		codes.add(the_l2);
		
		return new Object[]{codes,x};
	}