Skip to content

Commit 85c31f9

Browse files
committed
[InstSimplify] Add basic simplification support for {s,u}shl_sat
Proofs of simplifications added: https://alive2.llvm.org/ce/z/MELfd2
1 parent 4601fa8 commit 85c31f9

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6534,6 +6534,22 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
65346534
if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
65356535
return Constant::getNullValue(ReturnType);
65366536
break;
6537+
case Intrinsic::ushl_sat:
6538+
// ushl_sat(0, X) -> 0
6539+
// ushl_sat(UINT_MAX, X) -> UINT_MAX
6540+
// ushl_sat(X, 0) -> X
6541+
if (match(Op0, m_Zero()) || match(Op0, m_AllOnes()) || match(Op1, m_Zero()))
6542+
return Op0;
6543+
break;
6544+
case Intrinsic::sshl_sat:
6545+
// sshl_sat(0, X) -> 0
6546+
// sshl_sat(INT_MAX, X) -> INT_MAX
6547+
// sshl_sat(INT_MIN, X) -> INT_MIN
6548+
// sshl_sat(X, 0) -> X
6549+
if (match(Op0, m_Zero()) || match(Op0, m_MaxSignedValue()) ||
6550+
match(Op0, m_SignMask()) || match(Op1, m_Zero()))
6551+
return Op0;
6552+
break;
65376553
case Intrinsic::uadd_sat:
65386554
// sat(MAX + X) -> MAX
65396555
// sat(X + MAX) -> MAX

llvm/test/Transforms/InstCombine/fold-ext-eq-c-with-op.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,7 @@ define i8 @fold_umax_zext_eq_9(i8 %x) {
128128
define i8 @fold_sshl_sat_sext_eq_3_rhs(i8 %x) {
129129
; CHECK-LABEL: @fold_sshl_sat_sext_eq_3_rhs(
130130
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 3
131-
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = sext i1 [[X_EQ]] to i8
132-
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.sshl.sat.i8(i8 [[X]], i8 [[X_EQ_EXT]])
131+
; CHECK-NEXT: [[R:%.*]] = select i1 [[X_EQ]], i8 127, i8 [[X]]
133132
; CHECK-NEXT: ret i8 [[R]]
134133
;
135134
%x_eq = icmp eq i8 %x, 3
@@ -141,8 +140,7 @@ define i8 @fold_sshl_sat_sext_eq_3_rhs(i8 %x) {
141140
define i8 @fold_ushl_sat_zext_eq_3_lhs(i8 %x) {
142141
; CHECK-LABEL: @fold_ushl_sat_zext_eq_3_lhs(
143142
; CHECK-NEXT: [[X_EQ:%.*]] = icmp eq i8 [[X:%.*]], 3
144-
; CHECK-NEXT: [[X_EQ_EXT:%.*]] = zext i1 [[X_EQ]] to i8
145-
; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ushl.sat.i8(i8 [[X_EQ_EXT]], i8 [[X]])
143+
; CHECK-NEXT: [[R:%.*]] = select i1 [[X_EQ]], i8 8, i8 0
146144
; CHECK-NEXT: ret i8 [[R]]
147145
;
148146
%x_eq = icmp eq i8 %x, 3

llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,7 @@ define <2 x i32> @sshl_sat_v2i32_unsafe_constant_vector(<2 x i32> %arg0) {
396396

397397
define <vscale x 2 x i32> @ushl_sat_v2i32_scalable_zeroinitializer(<vscale x 2 x i32> %arg0) {
398398
; CHECK-LABEL: @ushl_sat_v2i32_scalable_zeroinitializer(
399-
; CHECK-NEXT: [[CALL:%.*]] = call <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32> [[ARG0:%.*]], <vscale x 2 x i32> zeroinitializer)
400-
; CHECK-NEXT: [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL]]
399+
; CHECK-NEXT: [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL:%.*]]
401400
; CHECK-NEXT: ret <vscale x 2 x i32> [[FREEZE]]
402401
;
403402
%call = call <vscale x 2 x i32> @llvm.ushl.sat.nxv2i32(<vscale x 2 x i32> %arg0, <vscale x 2 x i32> zeroinitializer)
@@ -407,8 +406,7 @@ define <vscale x 2 x i32> @ushl_sat_v2i32_scalable_zeroinitializer(<vscale x 2 x
407406

408407
define <vscale x 2 x i32> @sshl_sat_v2i32_scalable_zeroinitializer(<vscale x 2 x i32> %arg0) {
409408
; CHECK-LABEL: @sshl_sat_v2i32_scalable_zeroinitializer(
410-
; CHECK-NEXT: [[CALL:%.*]] = call <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32> [[ARG0:%.*]], <vscale x 2 x i32> zeroinitializer)
411-
; CHECK-NEXT: [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL]]
409+
; CHECK-NEXT: [[FREEZE:%.*]] = freeze <vscale x 2 x i32> [[CALL:%.*]]
412410
; CHECK-NEXT: ret <vscale x 2 x i32> [[FREEZE]]
413411
;
414412
%call = call <vscale x 2 x i32> @llvm.sshl.sat.nxv2i32(<vscale x 2 x i32> %arg0, <vscale x 2 x i32> zeroinitializer)

0 commit comments

Comments
 (0)