static void analyze_liveness(IcFun f){
		/* 0.recursive*/
		for(IcFun ff : f.funs)
			analyze_liveness(ff);
		/* 1.use and def */
		add_use_def(f);
		/* 2.solve the data flow */
		boolean flag = true;
		int size = f.block_l.size();
		while(flag){
			flag = false;
			for(int i=size-1;i>=0;i--){
				Block b = f.block_l.get(i);
				// a copy of in
				HashSet<IcVar> in_clone = (HashSet<IcVar>)b.in.clone();
				// data flow analysis
				for(Block succ : b.gotos){
					b.out.addAll(succ.in);
				}
				HashSet<IcVar> tmp = (HashSet<IcVar>)b.out.clone();
				tmp.removeAll(b.def);
				b.in.addAll(b.use);
				b.in.addAll(tmp);
				
				if(!b.in.equals(in_clone))
					flag = true;
			}
		}
	}