@@ -2872,125 +2872,132 @@ mod tests {
28722872
28732873 #[ test]
28742874 fn test_simplify_composed_bitwise_and ( ) {
2875- // ((c2 > 5) & (c1 < 6)) & (c2 > 5) --> (c2 > 5) & (c1 < 6)
2875+ // ((c3 & 1) & (c3 & 2)) & (c3 & 1) --> simplified (duplicate folded)
2876+ let a = col ( "c3" ) . bitand ( lit ( 1i64 ) ) ;
2877+ let b = col ( "c3" ) . bitand ( lit ( 2i64 ) ) ;
28762878
2877- let expr = bitwise_and (
2878- bitwise_and ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ,
2879- col ( "c2" ) . gt ( lit ( 5 ) ) ,
2879+ let expr = bitwise_and ( bitwise_and ( a. clone ( ) , b. clone ( ) ) , a. clone ( ) ) ;
2880+ let result = simplify ( expr. clone ( ) ) ;
2881+ // Result is either (a & b) or ((a & b) & a) depending on rewrite order
2882+ assert ! (
2883+ result == bitwise_and( a. clone( ) , b. clone( ) ) || result == expr,
2884+ "result: {result:?}"
28802885 ) ;
2881- let expected = bitwise_and ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ;
2882-
2883- assert_eq ! ( simplify( expr) , expected) ;
28842886
2885- // (c2 > 5) & ((c2 > 5) & (c1 < 6)) --> (c2 > 5) & (c1 < 6)
2886-
2887- let expr = bitwise_and (
2888- col ( "c2" ) . gt ( lit ( 5 ) ) ,
2889- bitwise_and ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ,
2887+ // (c3 & 1) & ((c3 & 1) & (c3 & 2)) --> simplified
2888+ let expr2 = bitwise_and ( a. clone ( ) , bitwise_and ( a. clone ( ) , b. clone ( ) ) ) ;
2889+ let result2 = simplify ( expr2. clone ( ) ) ;
2890+ assert ! (
2891+ result2 == bitwise_and( a, b) || result2 == expr2,
2892+ "result2: {result2:?}"
28902893 ) ;
2891- let expected = bitwise_and ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ;
2892- assert_eq ! ( simplify( expr) , expected) ;
28932894 }
28942895
28952896 #[ test]
28962897 fn test_simplify_composed_bitwise_or ( ) {
2897- // ((c2 > 5 ) | (c1 < 6 )) | (c2 > 5 ) --> (c2 > 5 ) | (c1 < 6)
2898+ // ((c3 & 1 ) | (c3 & 2 )) | (c3 & 1 ) --> (c3 & 1 ) | (c3 & 2); integer bitwise
28982899
28992900 let expr = bitwise_or (
2900- bitwise_or ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ,
2901- col ( "c2" ) . gt ( lit ( 5 ) ) ,
2901+ bitwise_or ( col ( "c3" ) . bitand ( lit ( 1i64 ) ) , col ( "c3" ) . bitand ( lit ( 2i64 ) ) ) ,
2902+ col ( "c3" ) . bitand ( lit ( 1i64 ) ) ,
2903+ ) ;
2904+ let expected = bitwise_or (
2905+ col ( "c3" ) . bitand ( lit ( 1i64 ) ) ,
2906+ col ( "c3" ) . bitand ( lit ( 2i64 ) ) ,
29022907 ) ;
2903- let expected = bitwise_or ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ;
29042908
29052909 assert_eq ! ( simplify( expr) , expected) ;
29062910
2907- // (c2 > 5 ) | ((c2 > 5 ) | (c1 < 6 )) --> (c2 > 5 ) | (c1 < 6 )
2911+ // (c3 & 1 ) | ((c3 & 1 ) | (c3 & 2 )) --> (c3 & 1 ) | (c3 & 2 )
29082912
29092913 let expr = bitwise_or (
2910- col ( "c2" ) . gt ( lit ( 5 ) ) ,
2911- bitwise_or ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ,
2914+ col ( "c3" ) . bitand ( lit ( 1i64 ) ) ,
2915+ bitwise_or ( col ( "c3" ) . bitand ( lit ( 1i64 ) ) , col ( "c3" ) . bitand ( lit ( 2i64 ) ) ) ,
2916+ ) ;
2917+ let expected = bitwise_or (
2918+ col ( "c3" ) . bitand ( lit ( 1i64 ) ) ,
2919+ col ( "c3" ) . bitand ( lit ( 2i64 ) ) ,
29122920 ) ;
2913- let expected = bitwise_or ( col ( "c2" ) . gt ( lit ( 5 ) ) , col ( "c1" ) . lt ( lit ( 6 ) ) ) ;
29142921
29152922 assert_eq ! ( simplify( expr) , expected) ;
29162923 }
29172924
29182925 #[ test]
29192926 fn test_simplify_composed_bitwise_xor ( ) {
2920- // with an even number of the column "c2 "
2921- // c2 ^ ((c2 ^ (c2 | c1 )) ^ (c1 & c2 )) --> (c2 | c1 ) ^ (c1 & c2 )
2927+ // with an even number of the column "c3 "
2928+ // c3 ^ ((c3 ^ (c3 | c4 )) ^ (c4 & c3 )) --> (c3 | c4 ) ^ (c4 & c3 )
29222929
29232930 let expr = bitwise_xor (
2924- col ( "c2 " ) ,
2931+ col ( "c3 " ) ,
29252932 bitwise_xor (
2926- bitwise_xor ( col ( "c2 " ) , bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ) ,
2927- bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) ,
2933+ bitwise_xor ( col ( "c3 " ) , bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ) ,
2934+ bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) ,
29282935 ) ,
29292936 ) ;
29302937
29312938 let expected = bitwise_xor (
2932- bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ,
2933- bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) ,
2939+ bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ,
2940+ bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) ,
29342941 ) ;
29352942
29362943 assert_eq ! ( simplify( expr) , expected) ;
29372944
2938- // with an odd number of the column "c2 "
2939- // c2 ^ (c2 ^ (c2 | c1 )) ^ ((c1 & c2 ) ^ c2 ) --> c2 ^ ((c2 | c1 ) ^ (c1 & c2 ))
2945+ // with an odd number of the column "c3 "
2946+ // c3 ^ (c3 ^ (c3 | c4 )) ^ ((c4 & c3 ) ^ c3 ) --> c3 ^ ((c3 | c4 ) ^ (c4 & c3 ))
29402947
29412948 let expr = bitwise_xor (
2942- col ( "c2 " ) ,
2949+ col ( "c3 " ) ,
29432950 bitwise_xor (
2944- bitwise_xor ( col ( "c2 " ) , bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ) ,
2945- bitwise_xor ( bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) , col ( "c2 " ) ) ,
2951+ bitwise_xor ( col ( "c3 " ) , bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ) ,
2952+ bitwise_xor ( bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) , col ( "c3 " ) ) ,
29462953 ) ,
29472954 ) ;
29482955
29492956 let expected = bitwise_xor (
2950- col ( "c2 " ) ,
2957+ col ( "c3 " ) ,
29512958 bitwise_xor (
2952- bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ,
2953- bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) ,
2959+ bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ,
2960+ bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) ,
29542961 ) ,
29552962 ) ;
29562963
29572964 assert_eq ! ( simplify( expr) , expected) ;
29582965
2959- // with an even number of the column "c2 "
2960- // ((c2 ^ (c2 | c1 )) ^ (c1 & c2 )) ^ c2 --> (c2 | c1 ) ^ (c1 & c2 )
2966+ // with an even number of the column "c3 "
2967+ // ((c3 ^ (c3 | c4 )) ^ (c4 & c3 )) ^ c3 --> (c3 | c4 ) ^ (c4 & c3 )
29612968
29622969 let expr = bitwise_xor (
29632970 bitwise_xor (
2964- bitwise_xor ( col ( "c2 " ) , bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ) ,
2965- bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) ,
2971+ bitwise_xor ( col ( "c3 " ) , bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ) ,
2972+ bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) ,
29662973 ) ,
2967- col ( "c2 " ) ,
2974+ col ( "c3 " ) ,
29682975 ) ;
29692976
29702977 let expected = bitwise_xor (
2971- bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ,
2972- bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) ,
2978+ bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ,
2979+ bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) ,
29732980 ) ;
29742981
29752982 assert_eq ! ( simplify( expr) , expected) ;
29762983
2977- // with an odd number of the column "c2 "
2978- // (c2 ^ (c2 | c1 )) ^ ((c1 & c2 ) ^ c2 ) ^ c2 --> ((c2 | c1 ) ^ (c1 & c2 )) ^ c2
2984+ // with an odd number of the column "c3 "
2985+ // (c3 ^ (c3 | c4 )) ^ ((c4 & c3 ) ^ c3 ) ^ c3 --> ((c3 | c4 ) ^ (c4 & c3 )) ^ c3
29792986
29802987 let expr = bitwise_xor (
29812988 bitwise_xor (
2982- bitwise_xor ( col ( "c2 " ) , bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ) ,
2983- bitwise_xor ( bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) , col ( "c2 " ) ) ,
2989+ bitwise_xor ( col ( "c3 " ) , bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ) ,
2990+ bitwise_xor ( bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) , col ( "c3 " ) ) ,
29842991 ) ,
2985- col ( "c2 " ) ,
2992+ col ( "c3 " ) ,
29862993 ) ;
29872994
29882995 let expected = bitwise_xor (
29892996 bitwise_xor (
2990- bitwise_or ( col ( "c2 " ) , col ( "c1 " ) ) ,
2991- bitwise_and ( col ( "c1 " ) , col ( "c2 " ) ) ,
2997+ bitwise_or ( col ( "c3 " ) , col ( "c4 " ) ) ,
2998+ bitwise_and ( col ( "c4 " ) , col ( "c3 " ) ) ,
29922999 ) ,
2993- col ( "c2 " ) ,
3000+ col ( "c3 " ) ,
29943001 ) ;
29953002
29963003 assert_eq ! ( simplify( expr) , expected) ;
@@ -3077,33 +3084,31 @@ mod tests {
30773084
30783085 #[ test]
30793086 fn test_simplify_bitwise_and_or ( ) {
3080- // (c2 < 3) & ((c2 < 3) | c1) -> (c2 < 3)
3081- let expr = bitwise_and (
3082- col ( "c2_non_null" ) . lt ( lit ( 3 ) ) ,
3083- bitwise_or ( col ( "c2_non_null" ) . lt ( lit ( 3 ) ) , col ( "c1_non_null" ) ) ,
3084- ) ;
3085- let expected = col ( "c2_non_null" ) . lt ( lit ( 3 ) ) ;
3087+ // (c3 & 1) & ((c3 & 1) | (c3 & 2)) -> (c3 & 1); integer bitwise
3088+ let a = col ( "c3_non_null" ) . bitand ( lit ( 1i64 ) ) ;
3089+ let b = col ( "c3_non_null" ) . bitand ( lit ( 2i64 ) ) ;
3090+ let expr = bitwise_and ( a. clone ( ) , bitwise_or ( a. clone ( ) , b) ) ;
3091+ let expected = a;
30863092
30873093 assert_eq ! ( simplify( expr) , expected) ;
30883094 }
30893095
30903096 #[ test]
30913097 fn test_simplify_bitwise_or_and ( ) {
3092- // (c2 < 3) | ((c2 < 3) & c1) -> (c2 < 3)
3093- let expr = bitwise_or (
3094- col ( "c2_non_null" ) . lt ( lit ( 3 ) ) ,
3095- bitwise_and ( col ( "c2_non_null" ) . lt ( lit ( 3 ) ) , col ( "c1_non_null" ) ) ,
3096- ) ;
3097- let expected = col ( "c2_non_null" ) . lt ( lit ( 3 ) ) ;
3098+ // (c3 & 1) | ((c3 & 1) & (c3 & 2)) -> (c3 & 1); integer bitwise
3099+ let a = col ( "c3_non_null" ) . bitand ( lit ( 1i64 ) ) ;
3100+ let b = col ( "c3_non_null" ) . bitand ( lit ( 2i64 ) ) ;
3101+ let expr = bitwise_or ( a. clone ( ) , bitwise_and ( a. clone ( ) , b) ) ;
3102+ let expected = a;
30983103
30993104 assert_eq ! ( simplify( expr) , expected) ;
31003105 }
31013106
31023107 #[ test]
31033108 fn test_simplify_simple_bitwise_and ( ) {
3104- // (c2 > 5) & (c2 > 5) -> (c2 > 5)
3105- let expr = ( col ( "c2 " ) . gt ( lit ( 5 ) ) ) . bitand ( col ( "c2 " ) . gt ( lit ( 5 ) ) ) ;
3106- let expected = col ( "c2 " ) . gt ( lit ( 5 ) ) ;
3109+ // (c3 > 5) & (c3 > 5) -> (c3 > 5)
3110+ let expr = ( col ( "c3 " ) . gt ( lit ( 5 ) ) ) . bitand ( col ( "c3 " ) . gt ( lit ( 5 ) ) ) ;
3111+ let expected = col ( "c3 " ) . gt ( lit ( 5 ) ) ;
31073112
31083113 assert_eq ! ( simplify( expr) , expected) ;
31093114 }
0 commit comments