diff --git a/cmd/evm/main.go b/cmd/evm/main.go
index 5ce45b9ca656c1b4c3a7c42296058ed9462206b4..2e7d985574633550d3054b846444d5027296948a 100644
--- a/cmd/evm/main.go
+++ b/cmd/evm/main.go
@@ -66,10 +66,6 @@ var (
 		Name:  "input",
 		Usage: "input for the EVM",
 	}
-	SysStatFlag = cli.BoolFlag{
-		Name:  "sysstat",
-		Usage: "display system stats",
-	}
 	VerbosityFlag = cli.IntFlag{
 		Name:  "verbosity",
 		Usage: "sets the verbosity level",
@@ -89,7 +85,6 @@ func init() {
 		CreateFlag,
 		DebugFlag,
 		VerbosityFlag,
-		SysStatFlag,
 		CodeFlag,
 		CodeFileFlag,
 		GasFlag,
diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go
index 8a71a92f7bade610f23fd08042a68b8e1fb0a84a..6ef9230f4fdc1ab70c37c1ea86c4aa5bcbbef46c 100644
--- a/cmd/evm/runner.go
+++ b/cmd/evm/runner.go
@@ -25,6 +25,7 @@ import (
 
 	goruntime "runtime"
 
+	"github.com/ethereum/go-ethereum/cmd/evm/internal/compiler"
 	"github.com/ethereum/go-ethereum/cmd/utils"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/state"
@@ -61,7 +62,18 @@ func runCmd(ctx *cli.Context) error {
 		ret  []byte
 		err  error
 	)
-	if ctx.GlobalString(CodeFlag.Name) != "" {
+	if fn := ctx.Args().First(); len(fn) > 0 {
+		src, err := ioutil.ReadFile(fn)
+		if err != nil {
+			return err
+		}
+
+		bin, err := compiler.Compile(fn, src, false)
+		if err != nil {
+			return err
+		}
+		code = common.Hex2Bytes(bin)
+	} else if ctx.GlobalString(CodeFlag.Name) != "" {
 		code = common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name))
 	} else {
 		var hexcode []byte
@@ -106,7 +118,7 @@ func runCmd(ctx *cli.Context) error {
 
 		ret, err = runtime.Call(receiver, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)), &runtimeConfig)
 	}
-	vmdone := time.Since(tstart)
+	execTime := time.Since(tstart)
 
 	if ctx.GlobalBool(DumpFlag.Name) {
 		statedb.Commit(true)
@@ -118,19 +130,16 @@ func runCmd(ctx *cli.Context) error {
 		vm.WriteTrace(os.Stderr, logger.StructLogs())
 		fmt.Fprintln(os.Stderr, "#### LOGS ####")
 		vm.WriteLogs(os.Stderr, statedb.Logs())
-	}
 
-	if ctx.GlobalBool(SysStatFlag.Name) {
 		var mem goruntime.MemStats
 		goruntime.ReadMemStats(&mem)
-		fmt.Printf("vm took %v\n", vmdone)
-		fmt.Printf(`alloc:      %d
-tot alloc:  %d
-no. malloc: %d
-heap alloc: %d
-heap objs:  %d
-num gc:     %d
-`, mem.Alloc, mem.TotalAlloc, mem.Mallocs, mem.HeapAlloc, mem.HeapObjects, mem.NumGC)
+		fmt.Fprintf(os.Stderr, `evm execution time: %v
+heap objects:       %d
+allocations:        %d
+total allocations:  %d
+GC calls:           %d
+
+`, execTime, mem.HeapObjects, mem.Alloc, mem.TotalAlloc, mem.NumGC)
 	}
 
 	fmt.Printf("0x%x", ret)