[llvm] [InstCombine] Add more freeze PHI tests (NFC) (PR #172842)
Cullen Rhodes via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 18 07:38:16 PST 2025
https://github.com/c-rhodes updated https://github.com/llvm/llvm-project/pull/172842
>From b9fd5bbda29de429c9a5481800026a76a7208caf Mon Sep 17 00:00:00 2001
From: Cullen Rhodes <cullen.rhodes at arm.com>
Date: Thu, 18 Dec 2025 12:08:14 +0000
Subject: [PATCH 1/2] [InstCombine] Add more freeze PHI tests (NFC)
Adds a number of test cases where we have to be careful when pushing
freeze around. These first two tests are taken from #157678 which failed
to land to due compile-time issues. The last two tests were reduced from
llvm-opt-benchmark workloads on #171435 which was an attempt at
addressing underlying cause of the hangs.
---
llvm/test/Transforms/InstCombine/freeze.ll | 242 ++++++++++++++++++++-
1 file changed, 239 insertions(+), 3 deletions(-)
diff --git a/llvm/test/Transforms/InstCombine/freeze.ll b/llvm/test/Transforms/InstCombine/freeze.ll
index ac7d65c2a3c6a..db91e36457763 100644
--- a/llvm/test/Transforms/InstCombine/freeze.ll
+++ b/llvm/test/Transforms/InstCombine/freeze.ll
@@ -273,13 +273,13 @@ define void @freeze_dominated_uses_catchswitch(i1 %c, i32 %x) personality ptr @_
; CHECK-NEXT: to label %[[CLEANUP]] unwind label %[[CATCH_DISPATCH]]
; CHECK: [[CATCH_DISPATCH]]:
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[IF_THEN]] ], [ [[X]], %[[IF_ELSE]] ]
-; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %[[CATCH:.*]], label %catch2] unwind to caller
+; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %[[CATCH:.*]], label %[[CATCH2:.*]]] unwind to caller
; CHECK: [[CATCH]]:
; CHECK-NEXT: [[CP:%.*]] = catchpad within [[CS]] [ptr null, i32 64, ptr null]
; CHECK-NEXT: [[PHI_FREEZE:%.*]] = freeze i32 [[PHI]]
; CHECK-NEXT: call void @use_i32(i32 [[PHI_FREEZE]]) [ "funclet"(token [[CP]]) ]
; CHECK-NEXT: unreachable
-; CHECK: [[CATCH2:.*:]]
+; CHECK: [[CATCH2]]:
; CHECK-NEXT: [[CP2:%.*]] = catchpad within [[CS]] [ptr null, i32 64, ptr null]
; CHECK-NEXT: call void @use_i32(i32 [[PHI]]) [ "funclet"(token [[CP2]]) ]
; CHECK-NEXT: unreachable
@@ -482,7 +482,7 @@ define i32 @freeze_callbr_use_after_phi(i1 %c) {
; CHECK-LABEL: define i32 @freeze_callbr_use_after_phi(
; CHECK-SAME: i1 [[C:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
-; CHECK-NEXT: [[X:%.*]] = callbr i32 asm sideeffect "", "=r"() #[[ATTR1:[0-9]+]]
+; CHECK-NEXT: [[X:%.*]] = callbr i32 asm sideeffect "", "=r"() #[[ATTR2:[0-9]+]]
; CHECK-NEXT: to label %[[CALLBR_CONT:.*]] []
; CHECK: [[CALLBR_CONT]]:
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[X]], %[[ENTRY]] ], [ 0, %[[CALLBR_CONT]] ]
@@ -1189,6 +1189,119 @@ exit:
ret void
}
+declare ptr @get_ptr()
+
+; When the phi isn't a simple recurrence and has multiple inputs from the same
+; predecessor, we need to be careful to avoid iterator invalidation. The phi
+; must have identical values for the predecessor and at no point should the
+; freeze be pushed to a single one of the uses, e.g.
+;
+; %iv.2 = phi ptr [ %iv.0, %loop ], [ %iv.1.fr, %if.else ], [ %iv.1, %if.else ]
+;
+; We don't support this case, although it could be handled if there's a use
+; case.
+define void @fold_phi_non_simple_recurrence_multiple_forward_edges(ptr noundef %init, i1 %cond.0, i1 %cond.1) {
+; CHECK-LABEL: define void @fold_phi_non_simple_recurrence_multiple_forward_edges(
+; CHECK-SAME: ptr noundef [[INIT:%.*]], i1 [[COND_0:%.*]], i1 [[COND_1:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV_0:%.*]] = phi ptr [ [[INIT]], %[[ENTRY]] ], [ [[IV_0_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
+; CHECK-NEXT: br i1 [[COND_0]], label %[[LOOP_LATCH]], label %[[IF_ELSE:.*]]
+; CHECK: [[IF_ELSE]]:
+; CHECK-NEXT: [[IV_1:%.*]] = call ptr @get_ptr()
+; CHECK-NEXT: br i1 false, label %[[LOOP_LATCH]], label %[[LOOP_LATCH]]
+; CHECK: [[LOOP_LATCH]]:
+; CHECK-NEXT: [[IV_2:%.*]] = phi ptr [ [[IV_0]], %[[LOOP]] ], [ [[IV_1]], %[[IF_ELSE]] ], [ [[IV_1]], %[[IF_ELSE]] ]
+; CHECK-NEXT: [[IV_2_FR:%.*]] = freeze ptr [[IV_2]]
+; CHECK-NEXT: [[IV_2_FR_INT:%.*]] = ptrtoint ptr [[IV_2_FR]] to i64
+; CHECK-NEXT: [[IV_0_INT:%.*]] = ptrtoint ptr [[IV_0]] to i64
+; CHECK-NEXT: [[IDX:%.*]] = sub i64 [[IV_0_INT]], [[IV_2_FR_INT]]
+; CHECK-NEXT: [[IV_0_NEXT]] = getelementptr i8, ptr [[IV_0]], i64 [[IDX]]
+; CHECK-NEXT: br i1 [[COND_1]], label %[[EXIT:.*]], label %[[LOOP]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %loop
+
+loop:
+ %iv.0 = phi ptr [ %init, %entry ], [ %iv.0.next, %loop.latch ]
+ br i1 %cond.0, label %loop.latch, label %if.else
+
+if.else:
+ %iv.1 = call ptr @get_ptr()
+ br i1 %cond.0, label %loop.latch, label %loop.latch
+
+loop.latch:
+ %iv.2 = phi ptr [ %iv.0, %loop ], [ %iv.1, %if.else ], [ %iv.1, %if.else ]
+ %iv.2.fr = freeze ptr %iv.2
+ %iv.2.fr.int = ptrtoint ptr %iv.2.fr to i64
+ %iv.0.int = ptrtoint ptr %iv.0 to i64
+ %idx = sub i64 %iv.0.int, %iv.2.fr.int
+ %iv.0.next = getelementptr i8, ptr %iv.0, i64 %idx
+ br i1 %cond.1, label %exit, label %loop
+
+exit:
+ ret void
+}
+
+; When the phi input comes from an invoke, we need to be careful the freeze
+; isn't pushed after the invoke.
+define void @fold_phi_noundef_start_value_with_invoke(ptr noundef %init, i1 %cond.0, i1 %cond.1) personality ptr undef {
+; CHECK-LABEL: define void @fold_phi_noundef_start_value_with_invoke(
+; CHECK-SAME: ptr noundef [[INIT:%.*]], i1 [[COND_0:%.*]], i1 [[COND_1:%.*]]) personality ptr undef {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV_0:%.*]] = phi ptr [ [[INIT]], %[[ENTRY]] ], [ [[IV_0_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
+; CHECK-NEXT: br i1 [[COND_0]], label %[[LOOP_LATCH]], label %[[IF_ELSE:.*]]
+; CHECK: [[IF_ELSE]]:
+; CHECK-NEXT: [[IV_1:%.*]] = invoke ptr @get_ptr()
+; CHECK-NEXT: to label %[[LOOP_LATCH]] unwind label %[[UNWIND:.*]]
+; CHECK: [[LOOP_LATCH]]:
+; CHECK-NEXT: [[IV_2:%.*]] = phi ptr [ [[IV_0]], %[[LOOP]] ], [ [[IV_1]], %[[IF_ELSE]] ]
+; CHECK-NEXT: [[IV_2_FR:%.*]] = freeze ptr [[IV_2]]
+; CHECK-NEXT: [[IV_2_FR_INT:%.*]] = ptrtoint ptr [[IV_2_FR]] to i64
+; CHECK-NEXT: [[IV_0_INT:%.*]] = ptrtoint ptr [[IV_0]] to i64
+; CHECK-NEXT: [[IDX:%.*]] = sub i64 [[IV_0_INT]], [[IV_2_FR_INT]]
+; CHECK-NEXT: [[IV_0_NEXT]] = getelementptr i8, ptr [[IV_0]], i64 [[IDX]]
+; CHECK-NEXT: br i1 [[COND_1]], label %[[EXIT:.*]], label %[[LOOP]]
+; CHECK: [[UNWIND]]:
+; CHECK-NEXT: [[TMP0:%.*]] = landingpad i8
+; CHECK-NEXT: cleanup
+; CHECK-NEXT: unreachable
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %loop
+
+loop:
+ %iv.0 = phi ptr [ %init, %entry ], [ %iv.0.next, %loop.latch ]
+ br i1 %cond.0, label %loop.latch, label %if.else
+
+if.else:
+ %iv.1 = invoke ptr @get_ptr()
+ to label %loop.latch unwind label %unwind
+
+loop.latch:
+ %iv.2 = phi ptr [ %iv.0, %loop ], [ %iv.1, %if.else ]
+ %iv.2.fr = freeze ptr %iv.2
+ %iv.2.fr.int = ptrtoint ptr %iv.2.fr to i64
+ %iv.0.int = ptrtoint ptr %iv.0 to i64
+ %idx = sub i64 %iv.0.int, %iv.2.fr.int
+ %iv.0.next = getelementptr i8, ptr %iv.0, i64 %idx
+ br i1 %cond.1, label %exit, label %loop
+
+unwind:
+ landingpad i8 cleanup
+ unreachable
+
+exit:
+ ret void
+}
+
define void @fold_phi_invoke_start_value(i32 %n) personality ptr undef {
; CHECK-LABEL: define void @fold_phi_invoke_start_value(
; CHECK-SAME: i32 [[N:%.*]]) personality ptr undef {
@@ -1485,6 +1598,129 @@ define i64 @pr161492_2(i1 %cond) {
ret i64 %ret
}
+; Reduced from: https://github.com/dtcxzyw/llvm-opt-benchmark/blob/main/bench/duckdb/original/miniz.ll
+;
+; This test is sensitive to an infinite combine loop whereby 'nneg' flag can be
+; added to zext and then dropped by the freeze handling code and so on.
+;
+; https://github.com/llvm/llvm-project/pull/171435
+define i32 @_ZN12duckdb_miniz16tinfl_decompressEPNS_22tinfl_decompressor_tagEPKhPmPhS5_S4_j(ptr noundef %0) {
+; CHECK-LABEL: define i32 @_ZN12duckdb_miniz16tinfl_decompressEPNS_22tinfl_decompressor_tagEPKhPmPhS5_S4_j(
+; CHECK-SAME: ptr noundef [[TMP0:%.*]]) {
+; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP0]], i64 4
+; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
+; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP0]], align 8
+; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[TMP4]], 0
+; CHECK-NEXT: br i1 [[COND]], label %[[BB5:.*]], [[DOTLR_PH1788_PREHEADER:label %.*]]
+; CHECK: [[BB5]]:
+; CHECK-NEXT: br [[DOTLR_PH1788_PREHEADER]]
+; CHECK: [[_LR_PH1788_PREHEADER:.*:]]
+; CHECK-NEXT: [[DOT2826:%.*]] = phi i32 [ [[TMP3]], [[TMP1:%.*]] ], [ 0, %[[BB5]] ]
+; CHECK-NEXT: [[DOT2826_FR:%.*]] = freeze i32 [[DOT2826]]
+; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[DOT2826_FR]], -8
+; CHECK-NEXT: store i32 [[TMP6]], ptr [[TMP2]], align 4
+; CHECK-NEXT: ret i32 0
+;
+ %2 = getelementptr inbounds nuw i8, ptr %0, i64 4
+ %3 = load i32, ptr %2, align 4
+ %4 = load i32, ptr %0, align 8
+ %cond = icmp eq i32 %4, 0
+ br i1 %cond, label %5, label %.lr.ph1788.preheader
+
+5: ; preds = %1
+ br label %.lr.ph1788.preheader
+
+.lr.ph1788.preheader: ; preds = %5, %1
+ %.2826 = phi i32 [ %3, %1 ], [ 0, %5 ]
+ %6 = add i32 %.2826, -8
+ %7 = zext i32 %6 to i64
+ %8 = lshr i64 %7, 3
+ %9 = freeze i64 %8
+ %umin1865 = call i64 @llvm.umin.i64(i64 %9, i64 0)
+ %10 = trunc i64 %umin1865 to i32
+ %11 = shl nuw i32 %10, 3
+ %12 = sub i32 %6, %11
+ store i32 %12, ptr %2, align 4
+ ret i32 0
+}
+
+; Reduced from: https://github.com/dtcxzyw/llvm-opt-benchmark/blob/main/bench/ffmpeg/original/avc.ll
+;
+; This test is sensitive to an infinite combine loop whereby freeze gets pushed
+; around the loop.
+;
+; https://github.com/llvm/llvm-project/pull/171435
+define i32 @ff_avc_decode_sps(ptr noundef %0, i32 noundef %1) "instcombine-no-verify-fixpoint" {
+; CHECK-LABEL: define i32 @ff_avc_decode_sps(
+; CHECK-SAME: ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT: [[_CRITEDGE_THREAD_I:.*:]]
+; CHECK-NEXT: [[TMP2:%.*]] = call ptr @get_ptr()
+; CHECK-NEXT: br label %[[BB3:.*]]
+; CHECK: [[BB3]]:
+; CHECK-NEXT: [[DOT068:%.*]] = phi i32 [ 8, [[DOTCRITEDGE_THREAD_I:%.*]] ], [ [[TMP15:%.*]], %[[DOTTHREAD:.*]] ]
+; CHECK-NEXT: [[DOTNOT89:%.*]] = phi i1 [ false, [[DOTCRITEDGE_THREAD_I]] ], [ true, %[[DOTTHREAD]] ]
+; CHECK-NEXT: br i1 [[DOTNOT89]], label %[[DOTTHREAD]], label %[[BB4:.*]]
+; CHECK: [[BB4]]:
+; CHECK-NEXT: br i1 true, label %[[DOTCRITEDGE_THREAD_I_I:.*]], label %[[DOTCRITEDGE_I_I:.*]]
+; CHECK: [[_CRITEDGE_THREAD_I_I:.*:]]
+; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP2]], align 1
+; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])
+; CHECK-NEXT: br label %[[BB7:.*]]
+; CHECK: [[_CRITEDGE_I_I:.*:]]
+; CHECK-NEXT: br label %[[BB7]]
+; CHECK: [[BB7]]:
+; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[TMP6]], %[[DOTCRITEDGE_THREAD_I_I]] ], [ poison, %[[DOTCRITEDGE_I_I]] ]
+; CHECK-NEXT: [[DOTFR:%.*]] = freeze i32 [[TMP8]]
+; CHECK-NEXT: [[TMP9:%.*]] = and i32 [[DOTFR]], 1
+; CHECK-NEXT: [[TMP10:%.*]] = lshr i32 [[DOTFR]], 1
+; CHECK-NEXT: [[TMP11:%.*]] = add nuw i32 [[TMP10]], [[TMP9]]
+; CHECK-NEXT: [[TMP12:%.*]] = add i32 [[DOT068]], [[TMP11]]
+; CHECK-NEXT: [[TMP13:%.*]] = and i32 [[TMP12]], 255
+; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[TMP13]], 0
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP14]], i32 [[DOT068]], i32 [[TMP13]]
+; CHECK-NEXT: br label %[[DOTTHREAD]]
+; CHECK: [[_THREAD:.*:]]
+; CHECK-NEXT: [[TMP15]] = phi i32 [ [[DOT068]], %[[BB3]] ], [ [[SPEC_SELECT]], %[[BB7]] ]
+; CHECK-NEXT: br label %[[BB3]]
+;
+.critedge.thread.i:
+ %2 = call ptr @get_ptr()
+ br label %3
+
+3: ; preds = %.thread, %.critedge.thread.i
+ %.068 = phi i32 [ 8, %.critedge.thread.i ], [ %15, %.thread ]
+ %.066 = phi i32 [ 8, %.critedge.thread.i ], [ 0, %.thread ]
+ %.not89 = icmp eq i32 %.066, 0
+ br i1 %.not89, label %.thread, label %4
+
+4: ; preds = %3
+ br i1 true, label %.critedge.thread.i.i, label %.critedge.i.i
+
+.critedge.thread.i.i: ; preds = %4
+ %5 = load i32, ptr %2, align 1
+ %6 = call i32 @llvm.bswap.i32(i32 %5)
+ br label %7
+
+.critedge.i.i: ; preds = %4
+ br label %7
+
+7: ; preds = %.critedge.i.i, %.critedge.thread.i.i
+ %8 = phi i32 [ %6, %.critedge.thread.i.i ], [ 0, %.critedge.i.i ]
+ %9 = and i32 %8, 1
+ %10 = ashr i32 %8, 1
+ %11 = add nsw i32 %10, %9
+ %12 = add nsw i32 %.068, %11
+ %13 = and i32 %12, 255
+ %14 = icmp eq i32 %13, 0
+ %cond.fr = freeze i1 %14
+ %spec.select = select i1 %cond.fr, i32 %.068, i32 %13
+ br label %.thread
+
+.thread: ; preds = %7, %3
+ %15 = phi i32 [ %.068, %3 ], [ %spec.select, %7 ]
+ br label %3
+}
+
!0 = !{}
!1 = !{i64 4}
!2 = !{i32 0, i32 100}
>From 062f5f2fc617c8b0bd6b99e3625993476046472a Mon Sep 17 00:00:00 2001
From: Cullen Rhodes <cullen.rhodes at arm.com>
Date: Thu, 18 Dec 2025 15:30:05 +0000
Subject: [PATCH 2/2] run metarenamer on reduced tests
---
llvm/test/Transforms/InstCombine/freeze.ll | 210 +++++++++++----------
1 file changed, 106 insertions(+), 104 deletions(-)
diff --git a/llvm/test/Transforms/InstCombine/freeze.ll b/llvm/test/Transforms/InstCombine/freeze.ll
index db91e36457763..6ff13c005a999 100644
--- a/llvm/test/Transforms/InstCombine/freeze.ll
+++ b/llvm/test/Transforms/InstCombine/freeze.ll
@@ -1604,43 +1604,45 @@ define i64 @pr161492_2(i1 %cond) {
; added to zext and then dropped by the freeze handling code and so on.
;
; https://github.com/llvm/llvm-project/pull/171435
-define i32 @_ZN12duckdb_miniz16tinfl_decompressEPNS_22tinfl_decompressor_tagEPKhPmPhS5_S4_j(ptr noundef %0) {
-; CHECK-LABEL: define i32 @_ZN12duckdb_miniz16tinfl_decompressEPNS_22tinfl_decompressor_tagEPKhPmPhS5_S4_j(
-; CHECK-SAME: ptr noundef [[TMP0:%.*]]) {
-; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP0]], i64 4
-; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
-; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP0]], align 8
-; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[TMP4]], 0
-; CHECK-NEXT: br i1 [[COND]], label %[[BB5:.*]], [[DOTLR_PH1788_PREHEADER:label %.*]]
-; CHECK: [[BB5]]:
-; CHECK-NEXT: br [[DOTLR_PH1788_PREHEADER]]
-; CHECK: [[_LR_PH1788_PREHEADER:.*:]]
-; CHECK-NEXT: [[DOT2826:%.*]] = phi i32 [ [[TMP3]], [[TMP1:%.*]] ], [ 0, %[[BB5]] ]
-; CHECK-NEXT: [[DOT2826_FR:%.*]] = freeze i32 [[DOT2826]]
-; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[DOT2826_FR]], -8
-; CHECK-NEXT: store i32 [[TMP6]], ptr [[TMP2]], align 4
+define i32 @pr171435_1(ptr noundef %arg) {
+; CHECK-LABEL: define i32 @pr171435_1(
+; CHECK-SAME: ptr noundef [[ARG:%.*]]) {
+; CHECK-NEXT: [[BB_1:.*]]:
+; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr inbounds nuw i8, ptr [[ARG]], i64 4
+; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[GETELEMENTPTR]], align 4
+; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[ARG]], align 8
+; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 [[LOAD1]], 0
+; CHECK-NEXT: br i1 [[ICMP]], label %[[BB_2:.*]], label %[[BB_3:.*]]
+; CHECK: [[BB_2]]:
+; CHECK-NEXT: br label %[[BB_3]]
+; CHECK: [[BB_3]]:
+; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LOAD]], %[[BB_1]] ], [ 0, %[[BB_2]] ]
+; CHECK-NEXT: [[PHI_FR:%.*]] = freeze i32 [[PHI]]
+; CHECK-NEXT: [[ADD:%.*]] = add i32 [[PHI_FR]], -8
+; CHECK-NEXT: store i32 [[ADD]], ptr [[GETELEMENTPTR]], align 4
; CHECK-NEXT: ret i32 0
;
- %2 = getelementptr inbounds nuw i8, ptr %0, i64 4
- %3 = load i32, ptr %2, align 4
- %4 = load i32, ptr %0, align 8
- %cond = icmp eq i32 %4, 0
- br i1 %cond, label %5, label %.lr.ph1788.preheader
-
-5: ; preds = %1
- br label %.lr.ph1788.preheader
-
-.lr.ph1788.preheader: ; preds = %5, %1
- %.2826 = phi i32 [ %3, %1 ], [ 0, %5 ]
- %6 = add i32 %.2826, -8
- %7 = zext i32 %6 to i64
- %8 = lshr i64 %7, 3
- %9 = freeze i64 %8
- %umin1865 = call i64 @llvm.umin.i64(i64 %9, i64 0)
- %10 = trunc i64 %umin1865 to i32
- %11 = shl nuw i32 %10, 3
- %12 = sub i32 %6, %11
- store i32 %12, ptr %2, align 4
+bb.1:
+ %getelementptr = getelementptr inbounds nuw i8, ptr %arg, i64 4
+ %load = load i32, ptr %getelementptr, align 4
+ %load1 = load i32, ptr %arg, align 8
+ %icmp = icmp eq i32 %load1, 0
+ br i1 %icmp, label %bb.2, label %bb.3
+
+bb.2: ; preds = %bb.1
+ br label %bb.3
+
+bb.3: ; preds = %bb.2, %bb.1
+ %phi = phi i32 [ %load, %bb.1 ], [ 0, %bb.2 ]
+ %add = add i32 %phi, -8
+ %zext = zext i32 %add to i64
+ %lshr = lshr i64 %zext, 3
+ %freeze = freeze i64 %lshr
+ %call = call i64 @llvm.umin.i64(i64 %freeze, i64 0)
+ %trunc = trunc i64 %call to i32
+ %shl = shl nuw i32 %trunc, 3
+ %sub = sub i32 %add, %shl
+ store i32 %sub, ptr %getelementptr, align 4
ret i32 0
}
@@ -1650,75 +1652,75 @@ define i32 @_ZN12duckdb_miniz16tinfl_decompressEPNS_22tinfl_decompressor_tagEPKh
; around the loop.
;
; https://github.com/llvm/llvm-project/pull/171435
-define i32 @ff_avc_decode_sps(ptr noundef %0, i32 noundef %1) "instcombine-no-verify-fixpoint" {
-; CHECK-LABEL: define i32 @ff_avc_decode_sps(
-; CHECK-SAME: ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR1:[0-9]+]] {
-; CHECK-NEXT: [[_CRITEDGE_THREAD_I:.*:]]
-; CHECK-NEXT: [[TMP2:%.*]] = call ptr @get_ptr()
-; CHECK-NEXT: br label %[[BB3:.*]]
-; CHECK: [[BB3]]:
-; CHECK-NEXT: [[DOT068:%.*]] = phi i32 [ 8, [[DOTCRITEDGE_THREAD_I:%.*]] ], [ [[TMP15:%.*]], %[[DOTTHREAD:.*]] ]
-; CHECK-NEXT: [[DOTNOT89:%.*]] = phi i1 [ false, [[DOTCRITEDGE_THREAD_I]] ], [ true, %[[DOTTHREAD]] ]
-; CHECK-NEXT: br i1 [[DOTNOT89]], label %[[DOTTHREAD]], label %[[BB4:.*]]
-; CHECK: [[BB4]]:
-; CHECK-NEXT: br i1 true, label %[[DOTCRITEDGE_THREAD_I_I:.*]], label %[[DOTCRITEDGE_I_I:.*]]
-; CHECK: [[_CRITEDGE_THREAD_I_I:.*:]]
-; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP2]], align 1
-; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP5]])
-; CHECK-NEXT: br label %[[BB7:.*]]
-; CHECK: [[_CRITEDGE_I_I:.*:]]
-; CHECK-NEXT: br label %[[BB7]]
-; CHECK: [[BB7]]:
-; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[TMP6]], %[[DOTCRITEDGE_THREAD_I_I]] ], [ poison, %[[DOTCRITEDGE_I_I]] ]
-; CHECK-NEXT: [[DOTFR:%.*]] = freeze i32 [[TMP8]]
-; CHECK-NEXT: [[TMP9:%.*]] = and i32 [[DOTFR]], 1
-; CHECK-NEXT: [[TMP10:%.*]] = lshr i32 [[DOTFR]], 1
-; CHECK-NEXT: [[TMP11:%.*]] = add nuw i32 [[TMP10]], [[TMP9]]
-; CHECK-NEXT: [[TMP12:%.*]] = add i32 [[DOT068]], [[TMP11]]
-; CHECK-NEXT: [[TMP13:%.*]] = and i32 [[TMP12]], 255
-; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[TMP13]], 0
-; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP14]], i32 [[DOT068]], i32 [[TMP13]]
-; CHECK-NEXT: br label %[[DOTTHREAD]]
-; CHECK: [[_THREAD:.*:]]
-; CHECK-NEXT: [[TMP15]] = phi i32 [ [[DOT068]], %[[BB3]] ], [ [[SPEC_SELECT]], %[[BB7]] ]
-; CHECK-NEXT: br label %[[BB3]]
-;
-.critedge.thread.i:
- %2 = call ptr @get_ptr()
- br label %3
-
-3: ; preds = %.thread, %.critedge.thread.i
- %.068 = phi i32 [ 8, %.critedge.thread.i ], [ %15, %.thread ]
- %.066 = phi i32 [ 8, %.critedge.thread.i ], [ 0, %.thread ]
- %.not89 = icmp eq i32 %.066, 0
- br i1 %.not89, label %.thread, label %4
-
-4: ; preds = %3
- br i1 true, label %.critedge.thread.i.i, label %.critedge.i.i
-
-.critedge.thread.i.i: ; preds = %4
- %5 = load i32, ptr %2, align 1
- %6 = call i32 @llvm.bswap.i32(i32 %5)
- br label %7
-
-.critedge.i.i: ; preds = %4
- br label %7
-
-7: ; preds = %.critedge.i.i, %.critedge.thread.i.i
- %8 = phi i32 [ %6, %.critedge.thread.i.i ], [ 0, %.critedge.i.i ]
- %9 = and i32 %8, 1
- %10 = ashr i32 %8, 1
- %11 = add nsw i32 %10, %9
- %12 = add nsw i32 %.068, %11
- %13 = and i32 %12, 255
- %14 = icmp eq i32 %13, 0
- %cond.fr = freeze i1 %14
- %spec.select = select i1 %cond.fr, i32 %.068, i32 %13
- br label %.thread
-
-.thread: ; preds = %7, %3
- %15 = phi i32 [ %.068, %3 ], [ %spec.select, %7 ]
- br label %3
+define i32 @pr171435_2(ptr noundef %arg, i32 noundef %arg1) "instcombine-no-verify-fixpoint" {
+; CHECK-LABEL: define i32 @pr171435_2(
+; CHECK-SAME: ptr noundef [[ARG:%.*]], i32 noundef [[ARG1:%.*]]) #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT: [[BB_1:.*]]:
+; CHECK-NEXT: [[CALL:%.*]] = call ptr @get_ptr()
+; CHECK-NEXT: br label %[[BB_2:.*]]
+; CHECK: [[BB_2]]:
+; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 8, %[[BB_1]] ], [ [[PHI14:%.*]], %[[BB_13:.*]] ]
+; CHECK-NEXT: [[ICMP:%.*]] = phi i1 [ false, %[[BB_1]] ], [ true, %[[BB_13]] ]
+; CHECK-NEXT: br i1 [[ICMP]], label %[[BB_13]], label %[[BB_4:.*]]
+; CHECK: [[BB_4]]:
+; CHECK-NEXT: br i1 true, label %[[BB_5:.*]], label %[[BB_7:.*]]
+; CHECK: [[BB_5]]:
+; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[CALL]], align 1
+; CHECK-NEXT: [[CALL6:%.*]] = call i32 @llvm.bswap.i32(i32 [[LOAD]])
+; CHECK-NEXT: br label %[[BB_8:.*]]
+; CHECK: [[BB_7]]:
+; CHECK-NEXT: br label %[[BB_8]]
+; CHECK: [[BB_8]]:
+; CHECK-NEXT: [[PHI9:%.*]] = phi i32 [ [[CALL6]], %[[BB_5]] ], [ poison, %[[BB_7]] ]
+; CHECK-NEXT: [[PHI9_FR:%.*]] = freeze i32 [[PHI9]]
+; CHECK-NEXT: [[AND:%.*]] = and i32 [[PHI9_FR]], 1
+; CHECK-NEXT: [[ASHR:%.*]] = lshr i32 [[PHI9_FR]], 1
+; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[ASHR]], [[AND]]
+; CHECK-NEXT: [[ADD10:%.*]] = add i32 [[PHI]], [[ADD]]
+; CHECK-NEXT: [[AND11:%.*]] = and i32 [[ADD10]], 255
+; CHECK-NEXT: [[ICMP12:%.*]] = icmp eq i32 [[AND11]], 0
+; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[ICMP12]], i32 [[PHI]], i32 [[AND11]]
+; CHECK-NEXT: br label %[[BB_13]]
+; CHECK: [[BB_13]]:
+; CHECK-NEXT: [[PHI14]] = phi i32 [ [[PHI]], %[[BB_2]] ], [ [[SELECT]], %[[BB_8]] ]
+; CHECK-NEXT: br label %[[BB_2]]
+;
+bb.1:
+ %call = call ptr @get_ptr()
+ br label %bb.2
+
+bb.2: ; preds = %bb.13, %bb.1
+ %phi = phi i32 [ 8, %bb.1 ], [ %phi14, %bb.13 ]
+ %phi3 = phi i32 [ 8, %bb.1 ], [ 0, %bb.13 ]
+ %icmp = icmp eq i32 %phi3, 0
+ br i1 %icmp, label %bb.13, label %bb.4
+
+bb.4: ; preds = %bb.2
+ br i1 true, label %bb.5, label %bb.7
+
+bb.5: ; preds = %bb.4
+ %load = load i32, ptr %call, align 1
+ %call6 = call i32 @llvm.bswap.i32(i32 %load)
+ br label %bb.8
+
+bb.7: ; preds = %bb.4
+ br label %bb.8
+
+bb.8: ; preds = %bb.7, %bb.5
+ %phi9 = phi i32 [ %call6, %bb.5 ], [ 0, %bb.7 ]
+ %and = and i32 %phi9, 1
+ %ashr = ashr i32 %phi9, 1
+ %add = add nsw i32 %ashr, %and
+ %add10 = add nsw i32 %phi, %add
+ %and11 = and i32 %add10, 255
+ %icmp12 = icmp eq i32 %and11, 0
+ %freeze = freeze i1 %icmp12
+ %select = select i1 %freeze, i32 %phi, i32 %and11
+ br label %bb.13
+
+bb.13: ; preds = %bb.8, %bb.2
+ %phi14 = phi i32 [ %phi, %bb.2 ], [ %select, %bb.8 ]
+ br label %bb.2
}
!0 = !{}
More information about the llvm-commits
mailing list