[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