https://github.com/tstellar updated https://github.com/llvm/llvm-project/pull/91419
>From 494847ba8fef9a29cfa92aac3f8aaa1102b5d44f Mon Sep 17 00:00:00 2001 From: Yingwei Zheng <dtcxzyw2...@gmail.com> Date: Wed, 8 May 2024 10:04:09 +0800 Subject: [PATCH] [InstSimplify] Do not simplify freeze in `simplifyWithOpReplaced` (#91215) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See the LangRef: > All uses of a value returned by the same ‘freeze’ instruction are guaranteed to always observe the same value, while different ‘freeze’ instructions may yield different values. It is incorrect to replace freezes with the simplified value. Proof: https://alive2.llvm.org/ce/z/3Dn9Cd https://alive2.llvm.org/ce/z/Qyh5h6 Fixes https://github.com/llvm/llvm-project/issues/91178 (cherry picked from commit d085b42cbbefe79a41113abcd2b1e1f2a203acef) Revert "[InstSimplify] Do not simplify freeze in `simplifyWithOpReplaced` (#91215)" This reverts commit 1c2eb18d52976fef89972e89c52d2ec5ed7e4868. [InstSimplify] Do not simplify freeze in `simplifyWithOpReplaced` (#91215) See the LangRef: > All uses of a value returned by the same ‘freeze’ instruction are guaranteed to always observe the same value, while different ‘freeze’ instructions may yield different values. It is incorrect to replace freezes with the simplified value. Proof: https://alive2.llvm.org/ce/z/3Dn9Cd https://alive2.llvm.org/ce/z/Qyh5h6 Fixes https://github.com/llvm/llvm-project/issues/91178 (cherry picked from commit d085b42cbbefe79a41113abcd2b1e1f2a203acef) --- llvm/lib/Analysis/InstructionSimplify.cpp | 4 +++ llvm/test/Transforms/InstCombine/icmp.ll | 15 ++++++++++ llvm/test/Transforms/InstCombine/select.ll | 32 ++++++++++++++++++++++ llvm/test/Transforms/PGOProfile/chr.ll | 7 +++-- 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 72b6dfa181e86..8dcffe45c644b 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4322,6 +4322,10 @@ static Value *simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, if (match(I, m_Intrinsic<Intrinsic::is_constant>())) return nullptr; + // Don't simplify freeze. + if (isa<FreezeInst>(I)) + return nullptr; + // Replace Op with RepOp in instruction operands. SmallVector<Value *, 8> NewOps; bool AnyReplaced = false; diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll index 10ab1fe118348..9ac35745742bb 100644 --- a/llvm/test/Transforms/InstCombine/icmp.ll +++ b/llvm/test/Transforms/InstCombine/icmp.ll @@ -5183,3 +5183,18 @@ entry: %cmp = icmp eq i8 %add2, %add1 ret i1 %cmp } + +define i1 @icmp_freeze_sext(i16 %x, i16 %y) { +; CHECK-LABEL: @icmp_freeze_sext( +; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i16 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[CMP1_FR:%.*]] = freeze i1 [[CMP1]] +; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i16 [[Y]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = or i1 [[TMP1]], [[CMP1_FR]] +; CHECK-NEXT: ret i1 [[CMP2]] +; + %cmp1 = icmp uge i16 %x, %y + %ext = sext i1 %cmp1 to i16 + %ext.fr = freeze i16 %ext + %cmp2 = icmp uge i16 %ext.fr, %y + ret i1 %cmp2 +} diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll index 888e7d28f78af..1909f9b0daf82 100644 --- a/llvm/test/Transforms/InstCombine/select.ll +++ b/llvm/test/Transforms/InstCombine/select.ll @@ -3708,3 +3708,35 @@ define i32 @src_select_xxory_eq0_xorxy_y(i32 %x, i32 %y) { %cond = select i1 %xor0, i32 %xor, i32 %y ret i32 %cond } + +define i8 @test_replace_freeze_multiuse(i1 %x, i8 %y) { +; CHECK-LABEL: @test_replace_freeze_multiuse( +; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[X:%.*]] to i8 +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 [[EXT]], [[Y:%.*]] +; CHECK-NEXT: [[SHL_FR:%.*]] = freeze i8 [[SHL]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X]], i8 0, i8 [[SHL_FR]] +; CHECK-NEXT: [[ADD:%.*]] = add i8 [[SHL_FR]], [[SEL]] +; CHECK-NEXT: ret i8 [[ADD]] +; + %ext = zext i1 %x to i8 + %shl = shl nuw i8 %ext, %y + %shl.fr = freeze i8 %shl + %sel = select i1 %x, i8 0, i8 %shl.fr + %add = add i8 %shl.fr, %sel + ret i8 %add +} + +define i8 @test_replace_freeze_oneuse(i1 %x, i8 %y) { +; CHECK-LABEL: @test_replace_freeze_oneuse( +; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[X:%.*]] to i8 +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i8 [[EXT]], [[Y:%.*]] +; CHECK-NEXT: [[SHL_FR:%.*]] = freeze i8 [[SHL]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X]], i8 0, i8 [[SHL_FR]] +; CHECK-NEXT: ret i8 [[SEL]] +; + %ext = zext i1 %x to i8 + %shl = shl nuw i8 %ext, %y + %shl.fr = freeze i8 %shl + %sel = select i1 %x, i8 0, i8 %shl.fr + ret i8 %sel +} diff --git a/llvm/test/Transforms/PGOProfile/chr.ll b/llvm/test/Transforms/PGOProfile/chr.ll index 0551a171091ca..38e8f8536a19c 100644 --- a/llvm/test/Transforms/PGOProfile/chr.ll +++ b/llvm/test/Transforms/PGOProfile/chr.ll @@ -1298,11 +1298,12 @@ define i32 @test_chr_14(ptr %i, ptr %j, i32 %sum0, i1 %pred, i32 %z) !prof !14 { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[Z_FR:%.*]] = freeze i32 [[Z:%.*]] ; CHECK-NEXT: [[I0:%.*]] = load i32, ptr [[I:%.*]], align 4 -; CHECK-NEXT: [[V1:%.*]] = icmp eq i32 [[Z_FR]], 1 -; CHECK-NEXT: br i1 [[V1]], label [[BB1:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF15]] +; CHECK-NEXT: [[V1_NOT:%.*]] = icmp eq i32 [[Z_FR]], 1 +; CHECK-NEXT: br i1 [[V1_NOT]], label [[BB1:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF15]] ; CHECK: entry.split.nonchr: +; CHECK-NEXT: [[PRED_FR:%.*]] = freeze i1 [[PRED:%.*]] ; CHECK-NEXT: [[V0:%.*]] = icmp eq i32 [[Z_FR]], 0 -; CHECK-NEXT: [[V3_NONCHR:%.*]] = and i1 [[V0]], [[PRED:%.*]] +; CHECK-NEXT: [[V3_NONCHR:%.*]] = and i1 [[V0]], [[PRED_FR]] ; CHECK-NEXT: br i1 [[V3_NONCHR]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF16]] ; CHECK: bb0.nonchr: ; CHECK-NEXT: call void @foo() _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits