Browse Source

Explicitly write out the passes for each level and remove certain passes

gingerBill 1 year ago
parent
commit
b7af4e7f6b
3 changed files with 271 additions and 21 deletions
  1. 256 9
      src/llvm_backend.cpp
  2. 5 2
      src/llvm_backend_opt.cpp
  3. 10 10
      src/tilde_stmt.cpp

+ 256 - 9
src/llvm_backend.cpp

@@ -1491,19 +1491,141 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
 		array_add(&passes, "function(annotation-remarks)");
 		array_add(&passes, "function(annotation-remarks)");
 		break;
 		break;
 	case 1:
 	case 1:
-		array_add(&passes, "default<Os>");
+// default<Os>
+// Passes removed: coro, openmp, sroa
+		array_add(&passes, u8R"(
+annotation2metadata,
+forceattrs,
+inferattrs,
+function<eager-inv>(
+	lower-expect,
+	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+	early-cse<>
+),
+ipsccp,
+called-value-propagation,
+globalopt,
+function<eager-inv>(
+	mem2reg,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>),
+	require<globals-aa>,
+	function(
+		invalidate<aa>
+	),
+	require<profile-summary>,
+	cgscc(
+	devirt<4>(
+		inline<only-mandatory>,
+		inline,
+		function-attrs<skip-non-recursive>,
+		function<eager-inv;no-rerun>(
+			early-cse<memssa>,
+			speculative-execution,
+			jump-threading,
+			correlated-propagation,
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			instcombine<max-iterations=1000;no-use-loop-info>,
+			aggressive-instcombine,
+			constraint-elimination,
+			tailcallelim,
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			reassociate,
+			loop-mssa(
+				loop-instsimplify,
+				loop-simplifycfg,
+				licm<no-allowspeculation>,
+				loop-rotate<header-duplication;no-prepare-for-lto>,
+				licm<allowspeculation>,
+				simple-loop-unswitch<no-nontrivial;trivial>
+			),
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			instcombine<max-iterations=1000;no-use-loop-info>,
+			loop(
+				loop-idiom,
+				indvars,
+				loop-deletion,
+				loop-unroll-full
+			),
+			vector-combine,
+			mldst-motion<no-split-footer-bb>,
+			gvn<>,
+			sccp,
+			bdce,
+			instcombine<max-iterations=1000;no-use-loop-info>,
+			jump-threading,
+			correlated-propagation,
+			adce,
+			memcpyopt,
+			dse,
+			move-auto-init,
+			loop-mssa(
+				licm<allowspeculation>
+			),
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			instcombine<max-iterations=1000;no-use-loop-info>
+		),
+		function-attrs,
+		function(
+			require<should-not-run-function-passes>
+		)
+	)
+),
+deadargelim,
+globalopt,
+globaldce,
+elim-avail-extern,
+rpo-function-attrs,
+recompute-globalsaa,
+function<eager-inv>(
+	float2int,
+	lower-constant-intrinsics,
+	loop(
+		loop-rotate<header-duplication;no-prepare-for-lto>,
+		loop-deletion
+	),
+	loop-distribute,
+	inject-tli-mappings,
+	loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>,
+	loop-load-elim,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	simplifycfg<bonus-inst-threshold=1;forward-switch-cond;switch-range-to-icmp;switch-to-lookup;no-keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch>,
+	slp-vectorizer,
+	vector-combine,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	loop-unroll<O2>,
+	transform-warning,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	loop-mssa(
+		licm<allowspeculation>
+	),
+	alignment-from-assumptions,
+	loop-sink,
+	instsimplify,
+	div-rem-pairs,
+	tailcallelim,
+	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>
+),
+globaldce,
+constmerge,
+cg-profile,
+rel-lookup-table-converter,
+function(
+	annotation-remarks
+),
+verify
+)");
 		break;
 		break;
+// default<O2>
+// Passes removed: coro, openmp, sroa
 	case 2:
 	case 2:
-		// array_add(&passes, "default<O2>");
 		array_add(&passes, u8R"(
 		array_add(&passes, u8R"(
-
 annotation2metadata,
 annotation2metadata,
 forceattrs,
 forceattrs,
 inferattrs,
 inferattrs,
 function<eager-inv>(
 function<eager-inv>(
 	lower-expect,
 	lower-expect,
 	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
 	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
-	sroa<modify-cfg>,
 	early-cse<>
 	early-cse<>
 ),
 ),
 ipsccp,
 ipsccp,
@@ -1525,7 +1647,6 @@ cgscc(
 		inline,
 		inline,
 		function-attrs<skip-non-recursive>,
 		function-attrs<skip-non-recursive>,
 		function<eager-inv;no-rerun>(
 		function<eager-inv;no-rerun>(
-			sroa<modify-cfg>,
 			early-cse<memssa>,
 			early-cse<memssa>,
 			speculative-execution,
 			speculative-execution,
 			jump-threading,
 			jump-threading,
@@ -1554,7 +1675,6 @@ cgscc(
 				loop-deletion,
 				loop-deletion,
 				loop-unroll-full
 				loop-unroll-full
 			),
 			),
-			sroa<modify-cfg>,
 			vector-combine,
 			vector-combine,
 			mldst-motion<no-split-footer-bb>,
 			mldst-motion<no-split-footer-bb>,
 			gvn<>,
 			gvn<>,
@@ -1603,7 +1723,6 @@ function<eager-inv>(
 	instcombine<max-iterations=1000;no-use-loop-info>,
 	instcombine<max-iterations=1000;no-use-loop-info>,
 	loop-unroll<O2>,
 	loop-unroll<O2>,
 	transform-warning,
 	transform-warning,
-	sroa<preserve-cfg>,
 	instcombine<max-iterations=1000;no-use-loop-info>,
 	instcombine<max-iterations=1000;no-use-loop-info>,
 	loop-mssa(
 	loop-mssa(
 		licm<allowspeculation>
 		licm<allowspeculation>
@@ -1623,11 +1742,139 @@ function(
 	annotation-remarks
 	annotation-remarks
 ),
 ),
 verify
 verify
-
 )");
 )");
 		break;
 		break;
+
 	case 3:
 	case 3:
-		array_add(&passes, "default<O3>");
+// default<O3>
+// Passes removed: coro, openmp, sroa
+		array_add(&passes, u8R"(
+annotation2metadata,
+forceattrs,
+inferattrs,
+function<eager-inv>(
+	lower-expect,
+	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+	early-cse<>,
+	callsite-splitting
+),
+ipsccp,
+called-value-propagation,
+globalopt,
+function<eager-inv>(
+	mem2reg,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>
+),
+require<globals-aa>,
+function(
+	invalidate<aa>
+),
+require<profile-summary>,
+cgscc(
+	devirt<4>(
+		inline<only-mandatory>,
+		inline,
+		function-attrs<skip-non-recursive>,
+		argpromotion,
+		function<eager-inv;no-rerun>(
+			early-cse<memssa>,
+			speculative-execution,
+			jump-threading,
+			correlated-propagation,
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			instcombine<max-iterations=1000;no-use-loop-info>,
+			aggressive-instcombine,
+			constraint-elimination,
+			libcalls-shrinkwrap,
+			tailcallelim,
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			reassociate,
+			loop-mssa(
+				loop-instsimplify,
+				loop-simplifycfg,
+				licm<no-allowspeculation>,
+				loop-rotate<header-duplication;no-prepare-for-lto>,
+				licm<allowspeculation>,
+				simple-loop-unswitch<nontrivial;trivial>
+			),
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			instcombine<max-iterations=1000;no-use-loop-info>,
+			loop(
+				loop-idiom,
+				indvars,
+				loop-deletion,
+				loop-unroll-full
+			),
+			vector-combine,
+			mldst-motion<no-split-footer-bb>,
+			gvn<>,
+			sccp,
+			bdce,
+			instcombine<max-iterations=1000;no-use-loop-info>,
+			jump-threading,
+			correlated-propagation,
+			adce,
+			memcpyopt,
+			dse,
+			move-auto-init,
+			loop-mssa(
+				licm<allowspeculation>
+			),
+			simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch>,
+			instcombine<max-iterations=1000;no-use-loop-info>
+		),
+		function-attrs,
+		function(
+			require<should-not-run-function-passes>
+		),
+	)
+),
+deadargelim,
+globalopt,
+globaldce,
+elim-avail-extern,
+rpo-function-attrs,
+recompute-globalsaa,
+function<eager-inv>(
+	float2int,
+	lower-constant-intrinsics,
+	chr,
+	loop(
+		loop-rotate<header-duplication;no-prepare-for-lto>,
+		loop-deletion
+	),
+	loop-distribute,
+	inject-tli-mappings,
+	loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>,
+	loop-load-elim,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	simplifycfg<bonus-inst-threshold=1;forward-switch-cond;switch-range-to-icmp;switch-to-lookup;no-keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch>,
+	slp-vectorizer,
+	vector-combine,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	loop-unroll<O3>,
+	transform-warning,
+	instcombine<max-iterations=1000;no-use-loop-info>,
+	loop-mssa(
+		licm<allowspeculation>
+	),
+	alignment-from-assumptions,
+	loop-sink,
+	instsimplify,
+	div-rem-pairs,
+	tailcallelim,
+	simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>
+),
+globaldce,
+constmerge,
+cg-profile,
+rel-lookup-table-converter,
+function(
+	annotation-remarks
+),
+verify
+)");
 		break;
 		break;
 	}
 	}
 
 

+ 5 - 2
src/llvm_backend_opt.cpp

@@ -322,7 +322,11 @@ gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
 				// NOTE(bill): Explicit instructions are set here because some instructions could have side effects
 				// NOTE(bill): Explicit instructions are set here because some instructions could have side effects
 				switch (LLVMGetInstructionOpcode(curr_instr)) {
 				switch (LLVMGetInstructionOpcode(curr_instr)) {
 				// case LLVMAlloca:
 				// case LLVMAlloca:
-
+				case LLVMLoad:
+					if (LLVMGetVolatile(curr_instr)) {
+						break;
+					}
+					/*fallthrough*/
 				case LLVMFNeg:
 				case LLVMFNeg:
 				case LLVMAdd:
 				case LLVMAdd:
 				case LLVMFAdd:
 				case LLVMFAdd:
@@ -342,7 +346,6 @@ gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
 				case LLVMAnd:
 				case LLVMAnd:
 				case LLVMOr:
 				case LLVMOr:
 				case LLVMXor:
 				case LLVMXor:
-				case LLVMLoad:
 				case LLVMGetElementPtr:
 				case LLVMGetElementPtr:
 				case LLVMTrunc:
 				case LLVMTrunc:
 				case LLVMZExt:
 				case LLVMZExt:

+ 10 - 10
src/tilde_stmt.cpp

@@ -1032,22 +1032,22 @@ gb_internal void cg_build_assignment(cgProcedure *p, Array<cgAddr> const &lvals,
 			continue;
 			continue;
 		}
 		}
 
 
-	    	Type *type = cg_addr_type(lval);
+		Type *type = cg_addr_type(lval);
 		if (!cg_addr_is_empty(lval)) {
 		if (!cg_addr_is_empty(lval)) {
 			GB_ASSERT_MSG(are_types_identical(init.type, type), "%s = %s", type_to_string(init.type), type_to_string(type));
 			GB_ASSERT_MSG(are_types_identical(init.type, type), "%s = %s", type_to_string(init.type), type_to_string(type));
 		}
 		}
 
 
 		if (init.kind == cgValue_Addr &&
 		if (init.kind == cgValue_Addr &&
 		    !cg_addr_is_empty(lval)) {
 		    !cg_addr_is_empty(lval)) {
-		    	// NOTE(bill): This is needed for certain constructs such as this:
-		    	// a, b = b, a
-		    	// NOTE(bill): This is a bodge and not necessarily a good way of doing things whatsoever
-		    	TB_CharUnits size  = cast(TB_CharUnits)type_size_of(type);
-		    	TB_CharUnits align = cast(TB_CharUnits)type_align_of(type);
-		    	TB_Node *copy = tb_inst_local(p->func, size, align);
-		    	tb_inst_memcpy(p->func, copy, init.node, tb_inst_uint(p->func, TB_TYPE_INT, size), align);
-		    	// use the copy instead
-		    	init.node = copy;
+			// NOTE(bill): This is needed for certain constructs such as this:
+			// a, b = b, a
+			// NOTE(bill): This is a bodge and not necessarily a good way of doing things whatsoever
+			TB_CharUnits size  = cast(TB_CharUnits)type_size_of(type);
+			TB_CharUnits align = cast(TB_CharUnits)type_align_of(type);
+			TB_Node *copy = tb_inst_local(p->func, size, align);
+			tb_inst_memcpy(p->func, copy, init.node, tb_inst_uint(p->func, TB_TYPE_INT, size), align);
+			// use the copy instead
+			init.node = copy;
 		}
 		}
 		inits[i] = init;
 		inits[i] = init;
 	}
 	}