diff --git a/lib/SILOptimizer/Utils/InstOptUtils.cpp b/lib/SILOptimizer/Utils/InstOptUtils.cpp index a64eb247ff81a..ed398ed8d33ce 100644 --- a/lib/SILOptimizer/Utils/InstOptUtils.cpp +++ b/lib/SILOptimizer/Utils/InstOptUtils.cpp @@ -132,11 +132,6 @@ bool swift::isInstructionTriviallyDead(SILInstruction *inst) { if (isa(inst) || isa(inst)) return false; - // These invalidate enums so "write" memory, but that is not an essential - // operation so we can remove these if they are trivially dead. - if (isa(inst)) - return true; - if (!inst->mayHaveSideEffects()) return true; diff --git a/test/SILOptimizer/sil_combine.sil b/test/SILOptimizer/sil_combine.sil index 0b28ba548b130..bb8f29f1ae9d0 100644 --- a/test/SILOptimizer/sil_combine.sil +++ b/test/SILOptimizer/sil_combine.sil @@ -3706,3 +3706,16 @@ bb0(%0 : $@thick SpecialEnum.Type): %4 = struct $Bool (%3 : $Builtin.Int1) return %4 : $Bool } + +// CHECK-LABEL: sil [ossa] @unchecked_take_enum_data_addr_not_dead : $@convention(thin) (@in FakeOptional) -> () +// CHECK: bb0(%0 : $*FakeOptional): +// CHECK-NEXT: unchecked_take_enum_data_addr +// CHECK-NEXT: tuple +// CHECK-NEXT: return +// CHECK-LABEL end sil function 'unchecked_take_enum_data_addr_not_dead' +sil [ossa] @unchecked_take_enum_data_addr_not_dead : $@convention(thin) (@in FakeOptional) -> () { +bb0(%0 : $*FakeOptional): + %2 = unchecked_take_enum_data_addr %0 : $*FakeOptional, #FakeOptional.some!enumelt + %4 = tuple () + return %4 : $() +}