Skip to content

Commit dc4fe14

Browse files
efriedma-quicc-rhodes
authored andcommitted
Revert "[InstCombine] Allow freezing multiple operands (#154336)" (#182769)
This reverts commit f8f6965. This is causing infinite loops interacting with other transforms. See discussion on #182647 . (cherry picked from commit bd3b163)
1 parent cd58971 commit dc4fe14

13 files changed

Lines changed: 137 additions & 148 deletions

File tree

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5064,68 +5064,63 @@ Instruction *InstCombinerImpl::visitLandingPadInst(LandingPadInst &LI) {
50645064
Value *
50655065
InstCombinerImpl::pushFreezeToPreventPoisonFromPropagating(FreezeInst &OrigFI) {
50665066
// Try to push freeze through instructions that propagate but don't produce
5067-
// poison as far as possible. If an operand of freeze does not produce poison
5068-
// then push the freeze through to the operands that are not guaranteed
5069-
// non-poison. The actual transform is as follows.
5070-
// Op1 = ... ; Op1 can be poison
5071-
// Op0 = Inst(Op1, NonPoisonOps...)
5067+
// poison as far as possible. If an operand of freeze follows three
5068+
// conditions 1) one-use, 2) does not produce poison, and 3) has all but one
5069+
// guaranteed-non-poison operands then push the freeze through to the one
5070+
// operand that is not guaranteed non-poison. The actual transform is as
5071+
// follows.
5072+
// Op1 = ... ; Op1 can be posion
5073+
// Op0 = Inst(Op1, NonPoisonOps...) ; Op0 has only one use and only have
5074+
// ; single guaranteed-non-poison operands
50725075
// ... = Freeze(Op0)
50735076
// =>
50745077
// Op1 = ...
50755078
// Op1.fr = Freeze(Op1)
50765079
// ... = Inst(Op1.fr, NonPoisonOps...)
5080+
auto *OrigOp = OrigFI.getOperand(0);
5081+
auto *OrigOpInst = dyn_cast<Instruction>(OrigOp);
50775082

5078-
auto CanPushFreeze = [](Value *V) {
5079-
if (!isa<Instruction>(V) || isa<PHINode>(V))
5080-
return false;
5081-
5082-
// We can't push the freeze through an instruction which can itself create
5083-
// poison. If the only source of new poison is flags, we can simply
5084-
// strip them (since we know the only use is the freeze and nothing can
5085-
// benefit from them.)
5086-
return !canCreateUndefOrPoison(cast<Operator>(V),
5087-
/*ConsiderFlagsAndMetadata*/ false);
5088-
};
5083+
// While we could change the other users of OrigOp to use freeze(OrigOp), that
5084+
// potentially reduces their optimization potential, so let's only do this iff
5085+
// the OrigOp is only used by the freeze.
5086+
if (!OrigOpInst || !OrigOpInst->hasOneUse() || isa<PHINode>(OrigOp))
5087+
return nullptr;
50895088

5090-
// Pushing freezes up long instruction chains can be expensive. Instead,
5091-
// we directly push the freeze all the way to the leaves. However, we leave
5092-
// deduplication of freezes on the same value for freezeOtherUses().
5093-
Use *OrigUse = &OrigFI.getOperandUse(0);
5094-
SmallPtrSet<Instruction *, 8> Visited;
5095-
SmallVector<Use *, 8> Worklist;
5096-
Worklist.push_back(OrigUse);
5097-
while (!Worklist.empty()) {
5098-
auto *U = Worklist.pop_back_val();
5099-
Value *V = U->get();
5100-
if (!CanPushFreeze(V)) {
5101-
// If we can't push through the original instruction, abort the transform.
5102-
if (U == OrigUse)
5103-
return nullptr;
5089+
// We can't push the freeze through an instruction which can itself create
5090+
// poison. If the only source of new poison is flags, we can simply
5091+
// strip them (since we know the only use is the freeze and nothing can
5092+
// benefit from them.)
5093+
if (canCreateUndefOrPoison(cast<Operator>(OrigOp),
5094+
/*ConsiderFlagsAndMetadata*/ false))
5095+
return nullptr;
51045096

5105-
auto *UserI = cast<Instruction>(U->getUser());
5106-
Builder.SetInsertPoint(UserI);
5107-
Value *Frozen = Builder.CreateFreeze(V, V->getName() + ".fr");
5108-
U->set(Frozen);
5097+
// If operand is guaranteed not to be poison, there is no need to add freeze
5098+
// to the operand. So we first find the operand that is not guaranteed to be
5099+
// poison.
5100+
Value *MaybePoisonOperand = nullptr;
5101+
for (Value *V : OrigOpInst->operands()) {
5102+
if (isa<MetadataAsValue>(V) || isGuaranteedNotToBeUndefOrPoison(V) ||
5103+
// Treat identical operands as a single operand.
5104+
(MaybePoisonOperand && MaybePoisonOperand == V))
51095105
continue;
5110-
}
5106+
if (!MaybePoisonOperand)
5107+
MaybePoisonOperand = V;
5108+
else
5109+
return nullptr;
5110+
}
51115111

5112-
auto *I = cast<Instruction>(V);
5113-
if (!Visited.insert(I).second)
5114-
continue;
5112+
OrigOpInst->dropPoisonGeneratingAnnotations();
51155113

5116-
// reverse() to emit freezes in a more natural order.
5117-
for (Use &Op : reverse(I->operands())) {
5118-
Value *OpV = Op.get();
5119-
if (isa<MetadataAsValue>(OpV) || isGuaranteedNotToBeUndefOrPoison(OpV))
5120-
continue;
5121-
Worklist.push_back(&Op);
5122-
}
5114+
// If all operands are guaranteed to be non-poison, we can drop freeze.
5115+
if (!MaybePoisonOperand)
5116+
return OrigOp;
51235117

5124-
I->dropPoisonGeneratingAnnotations();
5125-
this->Worklist.add(I);
5126-
}
5118+
Builder.SetInsertPoint(OrigOpInst);
5119+
Value *FrozenMaybePoisonOperand = Builder.CreateFreeze(
5120+
MaybePoisonOperand, MaybePoisonOperand->getName() + ".fr");
51275121

5128-
return OrigUse->get();
5122+
OrigOpInst->replaceUsesOfWith(MaybePoisonOperand, FrozenMaybePoisonOperand);
5123+
return OrigOp;
51295124
}
51305125

51315126
Instruction *InstCombinerImpl::foldFreezeIntoRecurrence(FreezeInst &FI,

llvm/test/Transforms/InstCombine/freeze-fp-ops.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,8 @@ define float @freeze_sqrt(float %arg) {
163163
define float @freeze_powi(float %arg0, i32 %arg1) {
164164
; CHECK-LABEL: define float @freeze_powi(
165165
; CHECK-SAME: float [[ARG0:%.*]], i32 [[ARG1:%.*]]) {
166-
; CHECK-NEXT: [[ARG0_FR:%.*]] = freeze float [[ARG0]]
167-
; CHECK-NEXT: [[ARG1_FR:%.*]] = freeze i32 [[ARG1]]
168-
; CHECK-NEXT: [[OP:%.*]] = call float @llvm.powi.f32.i32(float [[ARG0_FR]], i32 [[ARG1_FR]])
166+
; CHECK-NEXT: [[OP1:%.*]] = call float @llvm.powi.f32.i32(float [[ARG0]], i32 [[ARG1]])
167+
; CHECK-NEXT: [[OP:%.*]] = freeze float [[OP1]]
169168
; CHECK-NEXT: ret float [[OP]]
170169
;
171170
%op = call float @llvm.powi.f32.i32(float %arg0, i32 %arg1)

llvm/test/Transforms/InstCombine/freeze.ll

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,8 @@ define <3 x i4> @partial_undef_vec() {
108108
define i32 @early_freeze_test1(i32 %x, i32 %y) {
109109
; CHECK-LABEL: define i32 @early_freeze_test1(
110110
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
111-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X]]
112-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]]
113-
; CHECK-NEXT: [[V1:%.*]] = add i32 [[X_FR]], [[Y_FR]]
111+
; CHECK-NEXT: [[V4:%.*]] = add i32 [[X]], [[Y]]
112+
; CHECK-NEXT: [[V1:%.*]] = freeze i32 [[V4]]
114113
; CHECK-NEXT: [[V2:%.*]] = shl i32 [[V1]], 1
115114
; CHECK-NEXT: [[V3:%.*]] = and i32 [[V2]], 2
116115
; CHECK-NEXT: ret i32 [[V3]]
@@ -944,14 +943,14 @@ define void @fold_phi_gep_phi_offset(ptr %init, ptr %end, i64 noundef %n) {
944943
; CHECK-LABEL: define void @fold_phi_gep_phi_offset(
945944
; CHECK-SAME: ptr [[INIT:%.*]], ptr [[END:%.*]], i64 noundef [[N:%.*]]) {
946945
; CHECK-NEXT: [[ENTRY:.*]]:
947-
; CHECK-NEXT: [[TMP0:%.*]] = freeze ptr [[INIT]]
948946
; CHECK-NEXT: br label %[[LOOP:.*]]
949947
; CHECK: [[LOOP]]:
950-
; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0]], %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
948+
; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT]], %[[ENTRY]] ], [ [[I_NEXT_FR:%.*]], %[[LOOP]] ]
951949
; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N]], %[[ENTRY]] ], [ [[OFF_NEXT:%.*]], %[[LOOP]] ]
952950
; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
953-
; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
954-
; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END]]
951+
; CHECK-NEXT: [[I_NEXT:%.*]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
952+
; CHECK-NEXT: [[I_NEXT_FR]] = freeze ptr [[I_NEXT]]
953+
; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END]]
955954
; CHECK-NEXT: br i1 [[COND]], label %[[LOOP]], label %[[EXIT:.*]]
956955
; CHECK: [[EXIT]]:
957956
; CHECK-NEXT: ret void
@@ -978,13 +977,13 @@ define void @fold_phi_gep_inbounds_phi_offset(ptr %init, ptr %end, i64 noundef %
978977
; CHECK-LABEL: define void @fold_phi_gep_inbounds_phi_offset(
979978
; CHECK-SAME: ptr [[INIT:%.*]], ptr [[END:%.*]], i64 noundef [[N:%.*]]) {
980979
; CHECK-NEXT: [[ENTRY:.*]]:
981-
; CHECK-NEXT: [[TMP0:%.*]] = freeze ptr [[INIT]]
982980
; CHECK-NEXT: br label %[[LOOP:.*]]
983981
; CHECK: [[LOOP]]:
984-
; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0]], %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
982+
; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT]], %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
985983
; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N]], %[[ENTRY]] ], [ [[OFF_NEXT:%.*]], %[[LOOP]] ]
986984
; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
987-
; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
985+
; CHECK-NEXT: [[I_NEXT1:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 [[OFF_NEXT]]
986+
; CHECK-NEXT: [[I_NEXT]] = freeze ptr [[I_NEXT1]]
988987
; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END]]
989988
; CHECK-NEXT: br i1 [[COND]], label %[[LOOP]], label %[[EXIT:.*]]
990989
; CHECK: [[EXIT]]:
@@ -1011,14 +1010,13 @@ define void @fold_phi_gep_phi_offset_multiple(ptr %init, ptr %end, i64 %n) {
10111010
; CHECK-LABEL: define void @fold_phi_gep_phi_offset_multiple(
10121011
; CHECK-SAME: ptr [[INIT:%.*]], ptr [[END:%.*]], i64 [[N:%.*]]) {
10131012
; CHECK-NEXT: [[ENTRY:.*]]:
1014-
; CHECK-NEXT: [[TMP0:%.*]] = freeze ptr [[INIT]]
1015-
; CHECK-NEXT: [[TMP1:%.*]] = freeze i64 [[N]]
10161013
; CHECK-NEXT: br label %[[LOOP:.*]]
10171014
; CHECK: [[LOOP]]:
1018-
; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0]], %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
1019-
; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[TMP1]], %[[ENTRY]] ], [ [[OFF_NEXT:%.*]], %[[LOOP]] ]
1015+
; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT]], %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
1016+
; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N]], %[[ENTRY]] ], [ [[OFF_NEXT:%.*]], %[[LOOP]] ]
10201017
; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
1021-
; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
1018+
; CHECK-NEXT: [[I_NEXT1:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 [[OFF_NEXT]]
1019+
; CHECK-NEXT: [[I_NEXT]] = freeze ptr [[I_NEXT1]]
10221020
; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END]]
10231021
; CHECK-NEXT: br i1 [[COND]], label %[[LOOP]], label %[[EXIT:.*]]
10241022
; CHECK: [[EXIT]]:
@@ -1671,13 +1669,13 @@ define i32 @pr171435_2(ptr noundef %arg, i32 noundef %arg1) "instcombine-no-veri
16711669
; CHECK: [[BB_7]]:
16721670
; CHECK-NEXT: br label %[[BB_8]]
16731671
; CHECK: [[BB_8]]:
1674-
; CHECK-NEXT: [[PHI9:%.*]] = phi i32 [ [[CALL6]], %[[BB_5]] ], [ poison, %[[BB_7]] ]
1675-
; CHECK-NEXT: [[PHI9_FR:%.*]] = freeze i32 [[PHI9]]
1672+
; CHECK-NEXT: [[PHI9_FR:%.*]] = phi i32 [ [[CALL6]], %[[BB_5]] ], [ poison, %[[BB_7]] ]
16761673
; CHECK-NEXT: [[AND:%.*]] = and i32 [[PHI9_FR]], 1
16771674
; CHECK-NEXT: [[ASHR:%.*]] = lshr i32 [[PHI9_FR]], 1
16781675
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[ASHR]], [[AND]]
16791676
; CHECK-NEXT: [[ADD10:%.*]] = add i32 [[PHI]], [[ADD]]
1680-
; CHECK-NEXT: [[AND11:%.*]] = and i32 [[ADD10]], 255
1677+
; CHECK-NEXT: [[ADD10_FR:%.*]] = freeze i32 [[ADD10]]
1678+
; CHECK-NEXT: [[AND11:%.*]] = and i32 [[ADD10_FR]], 255
16811679
; CHECK-NEXT: [[ICMP12:%.*]] = icmp eq i32 [[AND11]], 0
16821680
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[ICMP12]], i32 [[PHI]], i32 [[AND11]]
16831681
; CHECK-NEXT: br label %[[BB_13]]

llvm/test/Transforms/InstCombine/icmp.ll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5838,9 +5838,10 @@ entry:
58385838
define i1 @icmp_freeze_sext(i16 %x, i16 %y) {
58395839
; CHECK-LABEL: define i1 @icmp_freeze_sext(
58405840
; CHECK-SAME: i16 [[X:%.*]], i16 [[Y:%.*]]) {
5841-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i16 [[Y]]
5842-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i16 [[X]]
5843-
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i16 [[X_FR]], [[Y_FR]]
5841+
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i16 [[X]], [[Y]]
5842+
; CHECK-NEXT: [[CMP1_FR:%.*]] = freeze i1 [[CMP1]]
5843+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i16 [[Y]], 0
5844+
; CHECK-NEXT: [[CMP2:%.*]] = or i1 [[TMP1]], [[CMP1_FR]]
58445845
; CHECK-NEXT: ret i1 [[CMP2]]
58455846
;
58465847
%cmp1 = icmp uge i16 %x, %y

llvm/test/Transforms/InstCombine/nsw.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,9 @@ define i32 @sub_sub1_nsw_nsw(i32 %a, i32 %b, i32 %c) {
255255

256256
define i8 @neg_nsw_freeze(i8 %a1, i8 %a2) {
257257
; CHECK-LABEL: @neg_nsw_freeze(
258-
; CHECK-NEXT: [[A1_FR:%.*]] = freeze i8 [[A1:%.*]]
259-
; CHECK-NEXT: [[A2_FR:%.*]] = freeze i8 [[A2:%.*]]
260-
; CHECK-NEXT: [[A_NEG:%.*]] = sub i8 [[A2_FR]], [[A1_FR]]
261-
; CHECK-NEXT: ret i8 [[A_NEG]]
258+
; CHECK-NEXT: [[A_NEG:%.*]] = sub nsw i8 [[A2:%.*]], [[A1:%.*]]
259+
; CHECK-NEXT: [[FR_NEG:%.*]] = freeze i8 [[A_NEG]]
260+
; CHECK-NEXT: ret i8 [[FR_NEG]]
262261
;
263262
%a = sub nsw i8 %a1, %a2
264263
%fr = freeze i8 %a

llvm/test/Transforms/InstCombine/select-gep.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,9 @@ define ptr @ptr_eq_replace_freeze1(ptr %p, ptr %q) {
304304

305305
define ptr @ptr_eq_replace_freeze2(ptr %p, ptr %q) {
306306
; CHECK-LABEL: @ptr_eq_replace_freeze2(
307-
; CHECK-NEXT: [[P_FR:%.*]] = freeze ptr [[P:%.*]]
308-
; CHECK-NEXT: [[P_FR1:%.*]] = freeze ptr [[P1:%.*]]
309-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P_FR1]], [[P_FR]]
310-
; CHECK-NEXT: [[SELECT_V:%.*]] = select i1 [[CMP]], ptr [[P_FR1]], ptr [[P_FR]]
307+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P_FR1:%.*]], [[P_FR:%.*]]
308+
; CHECK-NEXT: [[CMP_FR:%.*]] = freeze i1 [[CMP]]
309+
; CHECK-NEXT: [[SELECT_V:%.*]] = select i1 [[CMP_FR]], ptr [[P_FR1]], ptr [[P_FR]]
311310
; CHECK-NEXT: [[SELECT:%.*]] = getelementptr i8, ptr [[SELECT_V]], i64 16
312311
; CHECK-NEXT: ret ptr [[SELECT]]
313312
;

llvm/test/Transforms/InstCombine/select.ll

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2847,8 +2847,10 @@ define void @cond_freeze_multipleuses(i8 %x, i8 %y) {
28472847
define i32 @select_freeze_icmp_eq(i32 %x, i32 %y) {
28482848
; CHECK-LABEL: define i32 @select_freeze_icmp_eq(
28492849
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
2850-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]]
2851-
; CHECK-NEXT: ret i32 [[Y_FR]]
2850+
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X]], [[Y]]
2851+
; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
2852+
; CHECK-NEXT: [[V:%.*]] = select i1 [[C_FR]], i32 [[X]], i32 [[Y]]
2853+
; CHECK-NEXT: ret i32 [[V]]
28522854
;
28532855
%c = icmp eq i32 %x, %y
28542856
%c.fr = freeze i1 %c
@@ -2859,8 +2861,10 @@ define i32 @select_freeze_icmp_eq(i32 %x, i32 %y) {
28592861
define i32 @select_freeze_icmp_ne(i32 %x, i32 %y) {
28602862
; CHECK-LABEL: define i32 @select_freeze_icmp_ne(
28612863
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
2862-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X]]
2863-
; CHECK-NEXT: ret i32 [[X_FR]]
2864+
; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[X]], [[Y]]
2865+
; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
2866+
; CHECK-NEXT: [[V:%.*]] = select i1 [[C_FR]], i32 [[X]], i32 [[Y]]
2867+
; CHECK-NEXT: ret i32 [[V]]
28642868
;
28652869
%c = icmp ne i32 %x, %y
28662870
%c.fr = freeze i1 %c
@@ -2871,9 +2875,9 @@ define i32 @select_freeze_icmp_ne(i32 %x, i32 %y) {
28712875
define i32 @select_freeze_icmp_else(i32 %x, i32 %y) {
28722876
; CHECK-LABEL: define i32 @select_freeze_icmp_else(
28732877
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
2874-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]]
2875-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X]]
2876-
; CHECK-NEXT: [[V:%.*]] = call i32 @llvm.umin.i32(i32 [[X_FR]], i32 [[Y_FR]])
2878+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X]], [[Y]]
2879+
; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
2880+
; CHECK-NEXT: [[V:%.*]] = select i1 [[C_FR]], i32 [[X]], i32 [[Y]]
28772881
; CHECK-NEXT: ret i32 [[V]]
28782882
;
28792883
%c = icmp ult i32 %x, %y
@@ -2887,9 +2891,9 @@ declare void @use_i1_i32(i1, i32)
28872891
define void @select_freeze_icmp_multuses(i32 %x, i32 %y) {
28882892
; CHECK-LABEL: define void @select_freeze_icmp_multuses(
28892893
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
2890-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y]]
2891-
; CHECK-NEXT: [[V:%.*]] = freeze i32 [[X]]
2892-
; CHECK-NEXT: [[C_FR:%.*]] = icmp ne i32 [[V]], [[Y_FR]]
2894+
; CHECK-NEXT: [[C:%.*]] = icmp ne i32 [[X]], [[Y]]
2895+
; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
2896+
; CHECK-NEXT: [[V:%.*]] = select i1 [[C_FR]], i32 [[X]], i32 [[Y]]
28932897
; CHECK-NEXT: call void @use_i1_i32(i1 [[C_FR]], i32 [[V]])
28942898
; CHECK-NEXT: ret void
28952899
;

llvm/test/Transforms/InstCombine/sub-of-negatible-inseltpoison.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,9 +1446,8 @@ define i8 @dont_negate_ordinary_select(i8 %x, i8 %y, i8 %z, i1 %c) {
14461446
define i4 @negate_freeze(i4 %x, i4 %y, i4 %z) {
14471447
; CHECK-LABEL: define i4 @negate_freeze(
14481448
; CHECK-SAME: i4 [[X:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]]) {
1449-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i4 [[X]]
1450-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i4 [[Y]]
1451-
; CHECK-NEXT: [[T1_NEG:%.*]] = sub i4 [[Y_FR]], [[X_FR]]
1449+
; CHECK-NEXT: [[T0_NEG:%.*]] = sub i4 [[Y]], [[X]]
1450+
; CHECK-NEXT: [[T1_NEG:%.*]] = freeze i4 [[T0_NEG]]
14521451
; CHECK-NEXT: [[T2:%.*]] = add i4 [[T1_NEG]], [[Z]]
14531452
; CHECK-NEXT: ret i4 [[T2]]
14541453
;
@@ -1460,9 +1459,8 @@ define i4 @negate_freeze(i4 %x, i4 %y, i4 %z) {
14601459
define i4 @negate_freeze_extrause(i4 %x, i4 %y, i4 %z) {
14611460
; CHECK-LABEL: define i4 @negate_freeze_extrause(
14621461
; CHECK-SAME: i4 [[X:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]]) {
1463-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i4 [[X]]
1464-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i4 [[Y]]
1465-
; CHECK-NEXT: [[T1:%.*]] = sub i4 [[X_FR]], [[Y_FR]]
1462+
; CHECK-NEXT: [[T0:%.*]] = sub i4 [[X]], [[Y]]
1463+
; CHECK-NEXT: [[T1:%.*]] = freeze i4 [[T0]]
14661464
; CHECK-NEXT: call void @use4(i4 [[T1]])
14671465
; CHECK-NEXT: [[T2:%.*]] = sub i4 [[Z]], [[T1]]
14681466
; CHECK-NEXT: ret i4 [[T2]]

llvm/test/Transforms/InstCombine/sub-of-negatible.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,9 +1543,8 @@ define <2 x i32> @negate_select_of_negation_poison(<2 x i1> %c, <2 x i32> %x) {
15431543
define i4 @negate_freeze(i4 %x, i4 %y, i4 %z) {
15441544
; CHECK-LABEL: define i4 @negate_freeze(
15451545
; CHECK-SAME: i4 [[X:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]]) {
1546-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i4 [[X]]
1547-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i4 [[Y]]
1548-
; CHECK-NEXT: [[T1_NEG:%.*]] = sub i4 [[Y_FR]], [[X_FR]]
1546+
; CHECK-NEXT: [[T0_NEG:%.*]] = sub i4 [[Y]], [[X]]
1547+
; CHECK-NEXT: [[T1_NEG:%.*]] = freeze i4 [[T0_NEG]]
15491548
; CHECK-NEXT: [[T2:%.*]] = add i4 [[T1_NEG]], [[Z]]
15501549
; CHECK-NEXT: ret i4 [[T2]]
15511550
;
@@ -1557,9 +1556,8 @@ define i4 @negate_freeze(i4 %x, i4 %y, i4 %z) {
15571556
define i4 @negate_freeze_extrause(i4 %x, i4 %y, i4 %z) {
15581557
; CHECK-LABEL: define i4 @negate_freeze_extrause(
15591558
; CHECK-SAME: i4 [[X:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]]) {
1560-
; CHECK-NEXT: [[X_FR:%.*]] = freeze i4 [[X]]
1561-
; CHECK-NEXT: [[Y_FR:%.*]] = freeze i4 [[Y]]
1562-
; CHECK-NEXT: [[T1:%.*]] = sub i4 [[X_FR]], [[Y_FR]]
1559+
; CHECK-NEXT: [[T0:%.*]] = sub i4 [[X]], [[Y]]
1560+
; CHECK-NEXT: [[T1:%.*]] = freeze i4 [[T0]]
15631561
; CHECK-NEXT: call void @use4(i4 [[T1]])
15641562
; CHECK-NEXT: [[T2:%.*]] = sub i4 [[Z]], [[T1]]
15651563
; CHECK-NEXT: ret i4 [[T2]]

llvm/test/Transforms/InstCombine/urem-via-cmp-select.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,10 @@ define i8 @urem_assume_with_unexpected_const(i8 %x, i8 %n) {
9696
define i8 @urem_without_assume(i8 %arg, i8 %arg2) {
9797
; CHECK-LABEL: define i8 @urem_without_assume(
9898
; CHECK-SAME: i8 [[ARG:%.*]], i8 [[ARG2:%.*]]) {
99-
; CHECK-NEXT: [[ARG2_FR:%.*]] = freeze i8 [[ARG2]]
100-
; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i8 [[ARG]]
101-
; CHECK-NEXT: [[X_FR:%.*]] = urem i8 [[ARG_FR]], [[ARG2_FR]]
99+
; CHECK-NEXT: [[X:%.*]] = urem i8 [[ARG]], [[ARG2]]
100+
; CHECK-NEXT: [[X_FR:%.*]] = freeze i8 [[X]]
102101
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X_FR]], 1
103-
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[ADD]], [[ARG2_FR]]
102+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[ADD]], [[ARG2]]
104103
; CHECK-NEXT: [[OUT:%.*]] = select i1 [[TMP1]], i8 0, i8 [[ADD]]
105104
; CHECK-NEXT: ret i8 [[OUT]]
106105
;

0 commit comments

Comments
 (0)