@@ -1014,8 +1014,7 @@ bb0(%0 : $Int64, %1 : $Builtin.RawPointer):
10141014bb1:
10151015 %val1 = load %outerAddr1 : $*Index
10161016 %val2 = load %middleAddr1 : $*Int64
1017- %outerAddr2 = pointer_to_address %1 : $Builtin.RawPointer to $*Index
1018- %middleAddr2 = struct_element_addr %outerAddr2 : $*Index, #Index.value
1017+ %middleAddr2 = struct_element_addr %outerAddr1 : $*Index, #Index.value
10191018 store %0 to %middleAddr2 : $*Int64
10201019 %innerAddr1 = struct_element_addr %middleAddr1 : $*Int64, #Int64._value
10211020 %val3 = load %innerAddr1 : $*Builtin.Int64
@@ -1060,8 +1059,7 @@ bb1:
10601059 %zero = integer_literal $Builtin.Int1, 0
10611060 %add = builtin "uadd_with_overflow_Int32"(%innerVal : $Builtin.Int64, %one : $Builtin.Int64, %zero : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
10621061 %inc = tuple_extract %add : $(Builtin.Int64, Builtin.Int1), 0
1063- %outerAddr2 = pointer_to_address %1 : $Builtin.RawPointer to $*Index
1064- %middleAddr2 = struct_element_addr %outerAddr2 : $*Index, #Index.value
1062+ %middleAddr2 = struct_element_addr %outerAddr1 : $*Index, #Index.value
10651063 %newVal = struct $Int64 (%inc : $Builtin.Int64)
10661064 store %newVal to %middleAddr2 : $*Int64
10671065 %middleVal = load %middleAddr1 : $*Int64
@@ -1094,6 +1092,8 @@ struct State {
10941092// ...Split element 0
10951093// CHECK: [[ELT0:%.*]] = load [[HOISTADR]] : $*Int64
10961094// CHECK: [[HOISTVAL:%.*]] = struct_extract [[ELT0]] : $Int64, #Int64._value
1095+ // CHECK: [[HOISTADR2:%.*]] = tuple_element_addr %{{.*}} : $*(Int64, Int64, Int64), 0
1096+ // CHECK: [[ELT0B:%.*]] = load [[HOISTADR2]] : $*Int64
10971097// ...Split element 2
10981098// CHECK: [[SPLIT2:%.*]] = tuple_element_addr %{{.*}} : $*(Int64, Int64, Int64), 2
10991099// CHECK: [[ELT2:%.*]] = load [[SPLIT2]] : $*Int64
@@ -1104,7 +1104,7 @@ struct State {
11041104// CHECK: br bb1([[PRELOAD]] : $Int64)
11051105// ...Loop
11061106// CHECK: bb1([[PHI:%.*]] : $Int64):
1107- // CHECK-NEXT: [[TUPLE:%.*]] = tuple ([[ELT0 ]] : $Int64, [[PHI]] : $Int64, [[ELT2]] : $Int64)
1107+ // CHECK-NEXT: [[TUPLE:%.*]] = tuple ([[ELT0B ]] : $Int64, [[PHI]] : $Int64, [[ELT2]] : $Int64)
11081108// CHECK-NEXT: [[STRUCT:%.*]] = struct $State ([[TUPLE]] : $(Int64, Int64, Int64), [[SINGLEVAL]] : $Int64)
11091109// CHECK-NEXT: [[ADDEND:%.*]] = struct_extract [[PHI]] : $Int64, #Int64._value
11101110// CHECK-NEXT: [[UADD:%.*]] = builtin "uadd_with_overflow_Int32"([[HOISTVAL]] : $Builtin.Int64, [[ADDEND]] : $Builtin.Int64, %{{.*}} : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
@@ -1324,12 +1324,10 @@ bb3:
13241324//
13251325// CHECK: [[ADDR1:%.*]] = tuple_element_addr %{{.*}}, 0
13261326// CHECK: [[V1:%.*]] = load [[ADDR1]] : $*Int64
1327- // CHECK: [[ADDR0:%.*]] = tuple_element_addr %{{.*}}, 1
1328- // CHECK: [[V0:%.*]] = load [[ADDR0]] : $*Int64
13291327// CHECK: [[OUTER:%.*]] = tuple (%{{.*}} : $Int64, %{{.*}} : $(Int64, Int64))
13301328// CHECK: br bb1([[V1]] : $Int64)
13311329// CHECK: bb1([[PHI:%.*]] : $Int64):
1332- // CHECK: [[INNER:%.*]] = tuple ([[PHI]] : $Int64, [[V0]] : $Int64)
1330+ // CHECK: [[INNER:%.*]] = tuple ([[PHI]] : $Int64, {{%[0-9]+}} : $Int64)
13331331// CHECK: cond_br undef, bb2, bb3
13341332// CHECK: bb2:
13351333// CHECK: br bb1(%0 : $Int64)
@@ -1369,11 +1367,10 @@ bb3:
13691367// CHECK: [[ARG0:%.*]] = tuple (%0 : $Int64, %0 : $Int64)
13701368// CHECK: [[ARG1:%.*]] = tuple (%1 : $Int64, %1 : $Int64)
13711369// CHECK: [[ELT_0:%.*]] = tuple_element_addr %3 : $*(Int64, (Int64, Int64)), 0
1372- // CHECK: [[V0:%.*]] = load %9 : $*Int64
13731370// CHECK: [[ARG0_0:%.*]] = tuple_extract [[ARG0]] : $(Int64, Int64), 0
13741371// CHECK: br bb1([[V1]] : $(Int64, Int64))
13751372// CHECK: bb1([[PHI:%.*]] : $(Int64, Int64)):
1376- // CHECK: [[LOOPVAL:%.*]] = tuple ([[V0]] : $Int64, [[PHI]] : $(Int64, Int64))
1373+ // CHECK: [[LOOPVAL:%.*]] = tuple ({{%[0-9]+}} : $Int64, [[PHI]] : $(Int64, Int64))
13771374// CHECK: cond_br undef, bb2, bb3
13781375// CHECK: bb2:
13791376// CHECK: br bb1([[ARG1]] : $(Int64, Int64))
@@ -1610,7 +1607,7 @@ sil @$get_array_from_inner : $@convention(method) (Inner) -> (ContiguousArray<Do
16101607//
16111608// CHECK-LABEL: sil @project_load_path_before_splitting_crash :
16121609// CHECK: load
1613- // CHECK: bb1(%8 : $ContiguousArray<Double>):
1610+ // CHECK: bb1({{%[0-9]+}} : $ContiguousArray<Double>):
16141611// CHECK: bb3:
16151612// CHECK: store
16161613// CHECK: } // end sil function 'project_load_path_before_splitting_crash'
@@ -2179,3 +2176,34 @@ bb3:
21792176 return %r
21802177}
21812178
2179+ // CHECK-LABEL: sil [ossa] @hoist_load_with_idential_load_in_preheader :
2180+ // CHECK: store
2181+ // CHECK: load
2182+ // CHECK: store
2183+ // CHECK: [[L:%.*]] = load
2184+ // CHECK-NEXT: br bb1
2185+ // CHECK: bb1:
2186+ // CHECK-NEXT: apply undef([[L]])
2187+ // CHECK-LABEL: } // end sil function 'hoist_load_with_idential_load_in_preheader'
2188+ sil [ossa] @hoist_load_with_idential_load_in_preheader : $@convention(thin) (Int, Int) -> () {
2189+ bb0(%0 : $Int, %1 : $Int):
2190+ %2 = alloc_stack $Int
2191+ store %0 to [trivial] %2
2192+ %3 = load [trivial] %2
2193+ store %1 to [trivial] %2
2194+ br bb1
2195+
2196+ bb1:
2197+ %6 = load [trivial] %2
2198+ %7 = apply undef(%6) : $(Int) -> ()
2199+ cond_br undef, bb2, bb3
2200+
2201+ bb2:
2202+ br bb1
2203+
2204+ bb3:
2205+ dealloc_stack %2
2206+ %r = tuple ()
2207+ return %r
2208+ }
2209+
0 commit comments