Doing constant folding on ##neg and ##not in value numbering
							parent
							
								
									eb31589092
								
							
						
					
					
						commit
						2db25b937e
					
				| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2008, 2009 Slava Pestov, Doug Coleman.
 | 
			
		||||
! Copyright (C) 2008, 2009 Slava Pestov, Doug Coleman, Daniel Ehrenberg.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors combinators combinators.short-circuit arrays
 | 
			
		||||
fry kernel layouts math namespaces sequences cpu.architecture
 | 
			
		||||
| 
						 | 
				
			
			@ -242,6 +242,28 @@ M: ##shl-imm constant-fold* drop shift ;
 | 
			
		|||
    [ [ src1>> vreg>constant ] [ src2>> ] [ ] tri constant-fold* ] bi
 | 
			
		||||
    \ ##load-immediate new-insn ; inline
 | 
			
		||||
 | 
			
		||||
: unary-constant-fold? ( insn -- ? )
 | 
			
		||||
    src>> vreg>expr constant-expr? ; inline
 | 
			
		||||
 | 
			
		||||
GENERIC: unary-constant-fold* ( x insn -- y )
 | 
			
		||||
 | 
			
		||||
M: ##not unary-constant-fold* drop bitnot ;
 | 
			
		||||
M: ##neg unary-constant-fold* drop neg ;
 | 
			
		||||
 | 
			
		||||
: unary-constant-fold ( insn -- insn' )
 | 
			
		||||
    [ dst>> ]
 | 
			
		||||
    [ [ src>> vreg>constant ] [ ] bi unary-constant-fold* ] bi
 | 
			
		||||
    \ ##load-immediate new-insn ; inline
 | 
			
		||||
 | 
			
		||||
: maybe-unary-constant-fold ( insn -- insn' )
 | 
			
		||||
    dup unary-constant-fold? [ unary-constant-fold ] [ drop f ] if ;
 | 
			
		||||
 | 
			
		||||
M: ##neg rewrite
 | 
			
		||||
    maybe-unary-constant-fold ;
 | 
			
		||||
 | 
			
		||||
M: ##not rewrite
 | 
			
		||||
    maybe-unary-constant-fold ;
 | 
			
		||||
 | 
			
		||||
: reassociate ( insn op -- insn )
 | 
			
		||||
    [
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -983,6 +983,34 @@ cell 8 = [
 | 
			
		|||
    ] unit-test
 | 
			
		||||
] when
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        T{ ##peek f 0 D 0 }
 | 
			
		||||
        T{ ##load-immediate f 1 1 }
 | 
			
		||||
        T{ ##load-immediate f 2 -1 }
 | 
			
		||||
    }
 | 
			
		||||
] [
 | 
			
		||||
    {
 | 
			
		||||
        T{ ##peek f 0 D 0 }
 | 
			
		||||
        T{ ##load-immediate f 1 1 }
 | 
			
		||||
        T{ ##neg f 2 1 }
 | 
			
		||||
    } value-numbering-step
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        T{ ##peek f 0 D 0 }
 | 
			
		||||
        T{ ##load-immediate f 1 1 }
 | 
			
		||||
        T{ ##load-immediate f 2 -2 }
 | 
			
		||||
    }
 | 
			
		||||
] [
 | 
			
		||||
    {
 | 
			
		||||
        T{ ##peek f 0 D 0 }
 | 
			
		||||
        T{ ##load-immediate f 1 1 }
 | 
			
		||||
        T{ ##not f 2 1 }
 | 
			
		||||
    } value-numbering-step
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
! Displaced alien optimizations
 | 
			
		||||
3 vreg-counter set-global
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue