Skip to content

Commit 78aacd6

Browse files
authored
Merge pull request #85569 from eeckstein/fix-licm
LoopInvariantCodeMotion: don't reuse existing instructions in the loop pre-header
2 parents f76be65 + 50c299e commit 78aacd6

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LoopInvariantCodeMotion.swift

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -999,19 +999,6 @@ private extension Instruction {
999999
move(before: terminator, context)
10001000
}
10011001
}
1002-
1003-
if let singleValueInst = self as? SingleValueInstruction,
1004-
!(self is ScopedInstruction || self is AllocStackInst),
1005-
let identicalInst = (loop.preheader!.instructions.first { otherInst in
1006-
return singleValueInst != otherInst && singleValueInst.isIdenticalTo(otherInst)
1007-
}) {
1008-
guard let identicalSingleValueInst = identicalInst as? SingleValueInstruction else {
1009-
return true
1010-
}
1011-
1012-
singleValueInst.replace(with: identicalSingleValueInst, context)
1013-
}
1014-
10151002
return true
10161003
}
10171004

test/SILOptimizer/licm.sil

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,8 +1014,7 @@ bb0(%0 : $Int64, %1 : $Builtin.RawPointer):
10141014
bb1:
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

Comments
 (0)