Skip to content

Commit 222a988

Browse files
authored
Merge pull request #35979 from meg-gupta/csefixes
CSE OSSA: Enable lookThroughOwnershipInsts for some more instructions
2 parents d2bada8 + dd1c37a commit 222a988

File tree

4 files changed

+106
-11
lines changed

4 files changed

+106
-11
lines changed

lib/SILOptimizer/Transforms/CSE.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,8 @@ class HashVisitor : public SILInstructionVisitor<HashVisitor, llvm::hash_code> {
285285
}
286286

287287
hash_code visitValueMetatypeInst(ValueMetatypeInst *X) {
288-
return llvm::hash_combine(X->getKind(), X->getType(), X->getOperand());
288+
return llvm::hash_combine(X->getKind(), X->getType(),
289+
lookThroughOwnershipInsts(X->getOperand()));
289290
}
290291

291292
hash_code visitExistentialMetatypeInst(ExistentialMetatypeInst *X) {
@@ -353,12 +354,14 @@ class HashVisitor : public SILInstructionVisitor<HashVisitor, llvm::hash_code> {
353354
// We hash the enum by hashing its kind, element, and operand if it has one.
354355
if (!X->hasOperand())
355356
return llvm::hash_combine(X->getKind(), X->getElement());
356-
return llvm::hash_combine(X->getKind(), X->getElement(), X->getOperand());
357+
return llvm::hash_combine(X->getKind(), X->getElement(),
358+
lookThroughOwnershipInsts(X->getOperand()));
357359
}
358360

359361
hash_code visitUncheckedEnumDataInst(UncheckedEnumDataInst *X) {
360362
// We hash the enum by hashing its kind, element, and operand.
361-
return llvm::hash_combine(X->getKind(), X->getElement(), X->getOperand());
363+
return llvm::hash_combine(X->getKind(), X->getElement(),
364+
lookThroughOwnershipInsts(X->getOperand()));
362365
}
363366

364367
hash_code visitIndexAddrInst(IndexAddrInst *X) {
@@ -389,11 +392,10 @@ class HashVisitor : public SILInstructionVisitor<HashVisitor, llvm::hash_code> {
389392
}
390393

391394
hash_code visitSelectEnumInstBase(SelectEnumInstBase *X) {
392-
auto hash = llvm::hash_combine(X->getKind(),
393-
X->getEnumOperand(),
394-
X->getType(),
395-
X->hasDefault());
396-
395+
auto hash = llvm::hash_combine(
396+
X->getKind(), lookThroughOwnershipInsts(X->getEnumOperand()),
397+
X->getType(), X->hasDefault());
398+
397399
for (unsigned i = 0, e = X->getNumCases(); i < e; ++i) {
398400
hash = llvm::hash_combine(hash, X->getCase(i).first,
399401
X->getCase(i).second);
@@ -415,9 +417,8 @@ class HashVisitor : public SILInstructionVisitor<HashVisitor, llvm::hash_code> {
415417

416418
hash_code visitSelectValueInst(SelectValueInst *X) {
417419
auto hash = llvm::hash_combine(X->getKind(),
418-
X->getOperand(),
419-
X->getType(),
420-
X->hasDefault());
420+
lookThroughOwnershipInsts(X->getOperand()),
421+
X->getType(), X->hasDefault());
421422

422423
for (unsigned i = 0, e = X->getNumCases(); i < e; ++i) {
423424
hash = llvm::hash_combine(hash, X->getCase(i).first,
@@ -452,6 +453,14 @@ class HashVisitor : public SILInstructionVisitor<HashVisitor, llvm::hash_code> {
452453
}
453454

454455
hash_code visitMarkDependenceInst(MarkDependenceInst *X) {
456+
if (X->getFunction()->hasOwnership()) {
457+
auto TransformedOpValues =
458+
X->getOperandValues(lookThroughOwnershipInsts, false);
459+
return llvm::hash_combine(
460+
X->getKind(), X->getType(),
461+
llvm::hash_combine_range(TransformedOpValues.begin(),
462+
TransformedOpValues.end()));
463+
}
455464
OperandValueArrayRef Operands(X->getAllOperands());
456465
return llvm::hash_combine(
457466
X->getKind(), X->getType(),

test/SILOptimizer/cse_objc_ossa.sil

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,3 +325,40 @@ sil_vtable Bar {
325325
#Bar.deinit!deallocator: @_TFC4test3BarD // test.Bar.__deallocating_deinit
326326
}
327327

328+
// CHECK-LABEL: sil [ossa] @cse_value_metatype2 :
329+
// CHECK: value_metatype $@objc_metatype
330+
// CHECK: objc_metatype_to_object
331+
// CHECK-NOT: value_metatype $@objc_metatype
332+
// CHECK: destroy_value
333+
// CHECK-LABEL: } // end sil function 'cse_value_metatype2'
334+
sil [ossa] @cse_value_metatype2 : $@convention(thin) <T where T : AnyObject> (@owned T) -> @owned (AnyObject, AnyObject) {
335+
bb0(%0 : @owned $T):
336+
%2 = value_metatype $@objc_metatype T.Type, %0 : $T
337+
%4 = objc_metatype_to_object %2 : $@objc_metatype T.Type to $AnyObject
338+
%copy = copy_value %0 : $T
339+
%5 = value_metatype $@objc_metatype T.Type, %copy : $T
340+
%7 = objc_metatype_to_object %5 : $@objc_metatype T.Type to $AnyObject
341+
destroy_value %0 : $T
342+
destroy_value %copy : $T
343+
%9 = tuple (%4: $AnyObject, %7: $AnyObject)
344+
return %9 : $(AnyObject, AnyObject)
345+
}
346+
347+
// CHECK-LABEL: sil [ossa] @cse_existential_metatype2 :
348+
// CHECK: existential_metatype $@objc_metatype
349+
// CHECK: objc_existential_metatype_to_object
350+
// CHECK-NOT: existential_metatype $@objc_metatype
351+
// CHECK: destroy_value
352+
// CHECK-LABEL: } // end sil function 'cse_existential_metatype2'
353+
sil [ossa] @cse_existential_metatype2 : $@convention(thin) (@owned XX) -> @owned (AnyObject, AnyObject) {
354+
bb0(%0 : @owned $XX):
355+
%2 = existential_metatype $@objc_metatype XX.Type, %0 : $XX
356+
%4 = objc_existential_metatype_to_object %2 : $@objc_metatype XX.Type to $AnyObject
357+
%copy = copy_value %0 : $XX
358+
%5 = existential_metatype $@objc_metatype XX.Type, %copy : $XX
359+
%6 = objc_existential_metatype_to_object %5 : $@objc_metatype XX.Type to $AnyObject
360+
destroy_value %0 : $XX
361+
destroy_value %copy : $XX
362+
%7 = tuple (%4: $AnyObject, %6: $AnyObject)
363+
return %7 : $(AnyObject, AnyObject)
364+
}

test/SILOptimizer/cse_ossa.sil

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,3 +1208,18 @@ bb0:
12081208
return %22 : $()
12091209
}
12101210

1211+
// CHECK-LABEL: sil [ossa] @cse_mark_dependence2 :
1212+
// CHECK: mark_dependence
1213+
// CHECK-NOT: mark_dependence
1214+
// CHECK-LABEL: } // end sil function 'cse_mark_dependence2'
1215+
sil [ossa] @cse_mark_dependence2 : $@convention(thin) (@inout Builtin.Int64, @guaranteed Builtin.NativeObject) -> (Builtin.Int64, Builtin.Int64) {
1216+
bb0(%0 : $*Builtin.Int64, %1 : @guaranteed $Builtin.NativeObject):
1217+
%2 = mark_dependence %0 : $*Builtin.Int64 on %1 : $Builtin.NativeObject
1218+
%copy = copy_value %1 : $Builtin.NativeObject
1219+
%3 = mark_dependence %0 : $*Builtin.Int64 on %copy : $Builtin.NativeObject
1220+
%4 = load [trivial] %2 : $*Builtin.Int64
1221+
%5 = load [trivial] %3 : $*Builtin.Int64
1222+
%6 = tuple(%4 : $Builtin.Int64, %5 : $Builtin.Int64)
1223+
destroy_value %copy : $Builtin.NativeObject
1224+
return %6 : $(Builtin.Int64, Builtin.Int64)
1225+
}

test/SILOptimizer/cse_ossa_nontrivial.sil

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,3 +796,37 @@ bb3:
796796
return %res : $()
797797
}
798798

799+
// CHECK-LABEL: sil [ossa] @cse_select_enum2 :
800+
// CHECK: select_enum
801+
// CHECK-NOT: select_enum
802+
// CHECK: tuple
803+
// CHECK-LABEL: } // end sil function 'cse_select_enum2'
804+
sil [ossa] @cse_select_enum2 : $@convention(thin) (@guaranteed FakeOptional) -> (Builtin.Int1, Builtin.Int1) {
805+
bb0(%0 : @guaranteed $FakeOptional):
806+
%t = integer_literal $Builtin.Int1, 1
807+
%f = integer_literal $Builtin.Int1, 0
808+
%1 = select_enum %0 : $FakeOptional, case #FakeOptional.none!enumelt: %t, case #FakeOptional.some!enumelt: %f : $Builtin.Int1
809+
%copy = copy_value %0 : $FakeOptional
810+
%2 = select_enum %copy : $FakeOptional, case #FakeOptional.none!enumelt: %t, case #FakeOptional.some!enumelt: %f : $Builtin.Int1
811+
destroy_value %copy : $FakeOptional
812+
%3 = tuple (%1: $Builtin.Int1, %2: $Builtin.Int1)
813+
return %3: $(Builtin.Int1, Builtin.Int1)
814+
}
815+
816+
// CHECK-LABEL: sil [ossa] @enum_cse2 :
817+
// CHECK: enum $FakeOptional, #FakeOptional.some!enumelt
818+
// CHECK-NOT: enum $FakeOptional, #FakeOptional.some!enumelt
819+
// CHECK-LABEL: } // end sil function 'enum_cse2'
820+
sil [ossa] @enum_cse2 : $@convention(thin) (@guaranteed Klass) -> () {
821+
bb0(%0 : @guaranteed $Klass):
822+
%func = function_ref @unknown_fake_optional_user : $@convention(thin) (FakeOptional) -> ()
823+
%copy = copy_value %0 : $Klass
824+
%4 = enum $FakeOptional, #FakeOptional.some!enumelt, %0 : $Klass
825+
%5 = enum $FakeOptional, #FakeOptional.some!enumelt, %copy : $Klass
826+
apply %func(%4) : $@convention(thin) (FakeOptional) -> ()
827+
apply %func(%5) : $@convention(thin) (FakeOptional) -> ()
828+
destroy_value %5 : $FakeOptional
829+
%6 = tuple()
830+
return %6 : $()
831+
}
832+

0 commit comments

Comments
 (0)