diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index ce42029261359..e33cf699395f0 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -4774,7 +4774,9 @@ InstCombinerImpl::pushFreezeToPreventPoisonFromPropagating(FreezeInst &OrigFI) { Use *MaybePoisonOperand = nullptr; for (Use &U : OrigOpInst->operands()) { if (isa(U.get()) || - isGuaranteedNotToBeUndefOrPoison(U.get())) + isGuaranteedNotToBeUndefOrPoison(U.get()) || + // Treat identical operands as a single operand. + (MaybePoisonOperand && MaybePoisonOperand->get() == U.get())) continue; if (!MaybePoisonOperand) MaybePoisonOperand = &U; diff --git a/llvm/test/Transforms/InstCombine/freeze.ll b/llvm/test/Transforms/InstCombine/freeze.ll index 8875ce1c566f3..abe7117b27f8c 100644 --- a/llvm/test/Transforms/InstCombine/freeze.ll +++ b/llvm/test/Transforms/InstCombine/freeze.ll @@ -142,6 +142,17 @@ define i32 @early_freeze_test3(i32 %v1) { ret i32 %v4.fr } +define i32 @early_freeze_test4(i32 %v1) { +; CHECK-LABEL: @early_freeze_test4( +; CHECK-NEXT: [[V2_FR:%.*]] = freeze i32 [[V2:%.*]] +; CHECK-NEXT: [[V3:%.*]] = mul i32 [[V2_FR]], [[V2_FR]] +; CHECK-NEXT: ret i32 [[V3]] +; + %v2 = mul i32 %v1, %v1 + %v2.fr = freeze i32 %v2 + ret i32 %v2.fr +} + ; If replace all dominated uses of v to freeze(v). define void @freeze_dominated_uses_test1(i32 %v) {