Skip to content

Commit d12ec0f

Browse files
committed
[InstCombine] Fix store merge worklist management (PR46680)
Fixes https://bugs.llvm.org/show_bug.cgi?id=46680. Just like insertions through IRBuilder, InsertNewInstBefore() should be using the deferred worklist mechanism, so that processing of newly added instructions is prioritized. There's one side-effect of the worklist order change which could be classified as a regression. An add op gets pushed through a select that at the time is not a umax. We could add a reverse transform that tries to push adds in the reverse direction to restore a min/max, but that seems like a sure way of getting infinite loops... Seems like something that should best wait on min/max intrinsics. Differential Revision: https://reviews.llvm.org/D84109
1 parent 3504acc commit d12ec0f

File tree

3 files changed

+12
-12
lines changed

3 files changed

+12
-12
lines changed

llvm/lib/Transforms/InstCombine/InstCombineInternal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ class LLVM_LIBRARY_VISIBILITY InstCombiner
653653
"New instruction already inserted into a basic block!");
654654
BasicBlock *BB = Old.getParent();
655655
BB->getInstList().insert(Old.getIterator(), New); // Insert inst
656-
Worklist.push(New);
656+
Worklist.add(New);
657657
return New;
658658
}
659659

llvm/test/Transforms/InstCombine/minmax-fold.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -953,8 +953,8 @@ define i32 @add_umin(i32 %x) {
953953

954954
define i32 @add_umin_constant_limit(i32 %x) {
955955
; CHECK-LABEL: @add_umin_constant_limit(
956-
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], 0
957-
; CHECK-NEXT: [[R:%.*]] = select i1 [[TMP1]], i32 41, i32 42
956+
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[X:%.*]], 0
957+
; CHECK-NEXT: [[R:%.*]] = select i1 [[DOTNOT]], i32 41, i32 42
958958
; CHECK-NEXT: ret i32 [[R]]
959959
;
960960
%a = add nuw i32 %x, 41
@@ -1165,8 +1165,8 @@ define <2 x i33> @add_umax_vec(<2 x i33> %x) {
11651165

11661166
define i8 @PR14613_umin(i8 %x) {
11671167
; CHECK-LABEL: @PR14613_umin(
1168-
; CHECK-NEXT: [[U7:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 15)
1169-
; CHECK-NEXT: ret i8 [[U7]]
1168+
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 15)
1169+
; CHECK-NEXT: ret i8 [[TMP1]]
11701170
;
11711171
%u4 = zext i8 %x to i32
11721172
%u5 = add nuw nsw i32 %u4, 15
@@ -1179,8 +1179,8 @@ define i8 @PR14613_umin(i8 %x) {
11791179
define i8 @PR14613_umax(i8 %x) {
11801180
; CHECK-LABEL: @PR14613_umax(
11811181
; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i8 [[X:%.*]], -16
1182-
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i8 [[X]], i8 -16
1183-
; CHECK-NEXT: [[U7:%.*]] = add nsw i8 [[TMP2]], 15
1182+
; CHECK-NEXT: [[X_OP:%.*]] = add i8 [[X]], 15
1183+
; CHECK-NEXT: [[U7:%.*]] = select i1 [[TMP1]], i8 [[X_OP]], i8 -1
11841184
; CHECK-NEXT: ret i8 [[U7]]
11851185
;
11861186
%u4 = zext i8 %x to i32
@@ -1422,8 +1422,8 @@ define <2 x i33> @add_smax_vec(<2 x i33> %x) {
14221422
define i8 @PR14613_smin(i8 %x) {
14231423
; CHECK-LABEL: @PR14613_smin(
14241424
; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i8 [[X:%.*]], 40
1425-
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i8 [[X]], i8 40
1426-
; CHECK-NEXT: [[U7:%.*]] = add nsw i8 [[TMP2]], 15
1425+
; CHECK-NEXT: [[X_OP:%.*]] = add i8 [[X]], 15
1426+
; CHECK-NEXT: [[U7:%.*]] = select i1 [[TMP1]], i8 [[X_OP]], i8 55
14271427
; CHECK-NEXT: ret i8 [[U7]]
14281428
;
14291429
%u4 = sext i8 %x to i32
@@ -1437,8 +1437,8 @@ define i8 @PR14613_smin(i8 %x) {
14371437
define i8 @PR14613_smax(i8 %x) {
14381438
; CHECK-LABEL: @PR14613_smax(
14391439
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i8 [[X:%.*]], 40
1440-
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i8 [[X]], i8 40
1441-
; CHECK-NEXT: [[U7:%.*]] = add nuw i8 [[TMP2]], 15
1440+
; CHECK-NEXT: [[X_OP:%.*]] = add i8 [[X]], 15
1441+
; CHECK-NEXT: [[U7:%.*]] = select i1 [[TMP1]], i8 [[X_OP]], i8 55
14421442
; CHECK-NEXT: ret i8 [[U7]]
14431443
;
14441444
%u4 = sext i8 %x to i32

llvm/test/Transforms/InstCombine/pr46680.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -S -instcombine -instcombine-infinite-loop-threshold=3 < %s | FileCheck %s
2+
; RUN: opt -S -instcombine -instcombine-infinite-loop-threshold=2 < %s | FileCheck %s
33

44
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
55
target triple = "x86_64-pc-linux-gnu"

0 commit comments

Comments
 (0)