@@ -957,32 +957,44 @@ mod test {
957
957
958
958
#[ test]
959
959
fn do_not_hoist_unsafe_div ( ) {
960
- // This test is similar to `nested_loop_invariant_code_motion`, the operation
961
- // in question we are trying to hoist is `v7 = div i32 10, v0`.
962
- // Check that the lower bound of the outer loop it checked and that we not
960
+ // This test is similar to `nested_loop_invariant_code_motion`, except that
961
+ // the loop logic is under a dynamic predicate.
962
+ // Divisions are only reliant upon predicates and do not have other side effects.
963
+ // If an unsafe division occurs in a loop block that is not control dependent,
964
+ // we can still safely hoist that division as that instruction is always going to be hit.
965
+ // Thus, we place the unsafe division under a predicate to ensure that we are testing
966
+ // division hoisting based upon loop bounds and nothing else.
967
+ //
968
+ // The operation in question we are trying to hoist is `v12 = div u32 10, v1`.
969
+ // Check that the lower bound of the outer loop is checked and that we do not
963
970
// hoist an operation that can potentially error with a division by zero.
964
971
let src = "
965
972
brillig(inline) fn main f0 {
966
- b0():
967
- jmp b1(i32 0)
968
- b1(v0: i32):
969
- v4 = lt v0, i32 4
970
- jmpif v4 then: b3, else: b2
973
+ b0(v0: u32):
974
+ v4 = eq v0, u32 5
975
+ jmp b1(u32 0)
976
+ b1(v1: u32):
977
+ v7 = lt v1, u32 4
978
+ jmpif v7 then: b2, else: b3
971
979
b2():
972
- return
980
+ jmp b4(u32 0)
973
981
b3():
974
- jmp b4(i32 0)
975
- b4(v1: i32 ):
976
- v5 = lt v1, i32 4
977
- jmpif v5 then: b6 , else: b5
982
+ return
983
+ b4(v2: u32 ):
984
+ v8 = lt v2, u32 4
985
+ jmpif v8 then: b5 , else: b6
978
986
b5():
979
- v11 = unchecked_add v0, i32 1
980
- jmp b1(v11)
987
+ jmpif v4 then: b7, else: b8
981
988
b6():
982
- v7 = div i32 10, v0
983
- constrain v7 == i32 6
984
- v10 = unchecked_add v1, i32 1
985
- jmp b4(v10)
989
+ v10 = unchecked_add v1, u32 1
990
+ jmp b1(v10)
991
+ b7():
992
+ v12 = div u32 10, v1
993
+ constrain v12 == u32 6
994
+ jmp b8()
995
+ b8():
996
+ v14 = unchecked_add v2, u32 1
997
+ jmp b4(v14)
986
998
}
987
999
" ;
988
1000
@@ -998,26 +1010,31 @@ mod test {
998
1010
// in this test starts with a lower bound of `1`.
999
1011
let src = "
1000
1012
brillig(inline) fn main f0 {
1001
- b0():
1002
- jmp b1(i32 1)
1003
- b1(v0: i32):
1004
- v4 = lt v0, i32 4
1005
- jmpif v4 then: b3, else: b2
1013
+ b0(v0: u32):
1014
+ v4 = eq v0, u32 5
1015
+ jmp b1(u32 1)
1016
+ b1(v1: u32):
1017
+ v7 = lt v1, u32 4
1018
+ jmpif v7 then: b2, else: b3
1006
1019
b2():
1007
- return
1020
+ jmp b4(u32 0)
1008
1021
b3():
1009
- jmp b4(i32 0)
1010
- b4(v1: i32 ):
1011
- v5 = lt v1, i32 4
1012
- jmpif v5 then: b6 , else: b5
1022
+ return
1023
+ b4(v2: u32 ):
1024
+ v9 = lt v2, u32 4
1025
+ jmpif v9 then: b5 , else: b6
1013
1026
b5():
1014
- v7 = unchecked_add v0, i32 1
1015
- jmp b1(v7)
1027
+ jmpif v4 then: b7, else: b8
1016
1028
b6():
1017
- v9 = div i32 10, v0
1018
- constrain v9 == i32 6
1019
- v11 = unchecked_add v1, i32 1
1020
- jmp b4(v11)
1029
+ v10 = unchecked_add v1, u32 1
1030
+ jmp b1(v10)
1031
+ b7():
1032
+ v12 = div u32 10, v1
1033
+ constrain v12 == u32 6
1034
+ jmp b8()
1035
+ b8():
1036
+ v14 = unchecked_add v2, u32 1
1037
+ jmp b4(v14)
1021
1038
}
1022
1039
" ;
1023
1040
@@ -1026,26 +1043,31 @@ mod test {
1026
1043
let ssa = ssa. loop_invariant_code_motion ( ) ;
1027
1044
let expected = "
1028
1045
brillig(inline) fn main f0 {
1029
- b0():
1030
- jmp b1(i32 1)
1031
- b1(v0: i32):
1032
- v4 = lt v0, i32 4
1033
- jmpif v4 then: b3, else: b2
1046
+ b0(v0: u32):
1047
+ v4 = eq v0, u32 5
1048
+ jmp b1(u32 1)
1049
+ b1(v1: u32):
1050
+ v7 = lt v1, u32 4
1051
+ jmpif v7 then: b2, else: b3
1034
1052
b2():
1035
- return
1053
+ v9 = div u32 10, v1
1054
+ jmp b4(u32 0)
1036
1055
b3():
1037
- v6 = div i32 10, v0
1038
- jmp b4(i32 0)
1039
- b4(v1: i32):
1040
- v8 = lt v1, i32 4
1041
- jmpif v8 then: b6, else: b5
1056
+ return
1057
+ b4(v2: u32):
1058
+ v11 = lt v2, u32 4
1059
+ jmpif v11 then: b5, else: b6
1042
1060
b5():
1043
- v11 = unchecked_add v0, i32 1
1044
- jmp b1(v11)
1061
+ jmpif v4 then: b7, else: b8
1045
1062
b6():
1046
- constrain v6 == i32 6
1047
- v10 = unchecked_add v1, i32 1
1048
- jmp b4(v10)
1063
+ v12 = unchecked_add v1, u32 1
1064
+ jmp b1(v12)
1065
+ b7():
1066
+ constrain v9 == u32 6
1067
+ jmp b8()
1068
+ b8():
1069
+ v14 = unchecked_add v2, u32 1
1070
+ jmp b4(v14)
1049
1071
}
1050
1072
" ;
1051
1073
0 commit comments