Skip to content

Commit df9c00b

Browse files
authored
[CVP] Use at-use info in processBinOp (#88523)
This patch uses `getConstantRangeAtUse` to infer nsw/nuw flags with at-use info. It will enables more optimizations in InstCombine. Compile-time impact: http://llvm-compile-time-tracker.com/compare.php?from=a5ed14bc8e122fa5ac0aa81f8d8390931bd6b4e4&to=a83d3402b663439b91cb37a046fb7ac0220ba5c7&stat=instructions%3Au Related issue: #87854
1 parent 3cf8535 commit df9c00b

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp

+4-7
Original file line numberDiff line numberDiff line change
@@ -1105,13 +1105,10 @@ static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI) {
11051105
return false;
11061106

11071107
Instruction::BinaryOps Opcode = BinOp->getOpcode();
1108-
Value *LHS = BinOp->getOperand(0);
1109-
Value *RHS = BinOp->getOperand(1);
1110-
1111-
ConstantRange LRange =
1112-
LVI->getConstantRange(LHS, BinOp, /*UndefAllowed*/ false);
1113-
ConstantRange RRange =
1114-
LVI->getConstantRange(RHS, BinOp, /*UndefAllowed*/ false);
1108+
ConstantRange LRange = LVI->getConstantRangeAtUse(BinOp->getOperandUse(0),
1109+
/*UndefAllowed=*/false);
1110+
ConstantRange RRange = LVI->getConstantRangeAtUse(BinOp->getOperandUse(1),
1111+
/*UndefAllowed=*/false);
11151112

11161113
bool Changed = false;
11171114
bool NewNUW = false, NewNSW = false;

llvm/test/Transforms/CorrelatedValuePropagation/cond-at-use.ll

+34
Original file line numberDiff line numberDiff line change
@@ -596,3 +596,37 @@ define i16 @and_elide_poison_flags_missing_noundef(i16 %a) {
596596
%sel = select i1 %cmp, i16 %and, i16 24
597597
ret i16 %sel
598598
}
599+
600+
define i32 @pr87854(i32 noundef %x.1, i32 noundef %i) {
601+
; CHECK-LABEL: @pr87854(
602+
; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[X_1:%.*]], -1
603+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[COND]])
604+
; CHECK-NEXT: [[INBOUNDS:%.*]] = icmp ult i32 [[I:%.*]], [[X_1]]
605+
; CHECK-NEXT: [[NEXT:%.*]] = add nuw i32 [[I]], 1
606+
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[INBOUNDS]], i32 [[NEXT]], i32 -1
607+
; CHECK-NEXT: ret i32 [[SPEC_SELECT]]
608+
;
609+
%cond = icmp sgt i32 %x.1, -1
610+
tail call void @llvm.assume(i1 %cond)
611+
%inbounds = icmp ult i32 %i, %x.1
612+
%next = add i32 %i, 1
613+
%spec.select = select i1 %inbounds, i32 %next, i32 -1
614+
ret i32 %spec.select
615+
}
616+
617+
define i64 @test_shl_nsw_at_use(i64 noundef %x) {
618+
; CHECK-LABEL: @test_shl_nsw_at_use(
619+
; CHECK-NEXT: [[ADD:%.*]] = add i64 [[X:%.*]], 2147483648
620+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[ADD]], 4294967296
621+
; CHECK-NEXT: [[SHL:%.*]] = shl nsw i64 [[X]], 32
622+
; CHECK-NEXT: [[SHR:%.*]] = ashr exact i64 [[SHL]], 32
623+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i64 [[SHR]], i64 0
624+
; CHECK-NEXT: ret i64 [[RES]]
625+
;
626+
%add = add i64 %x, 2147483648
627+
%cmp = icmp ult i64 %add, 4294967296
628+
%shl = shl i64 %x, 32
629+
%shr = ashr exact i64 %shl, 32
630+
%res = select i1 %cmp, i64 %shr, i64 0
631+
ret i64 %res
632+
}

llvm/test/Transforms/CorrelatedValuePropagation/phi-common-val.ll

+2-1
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,13 @@ bb3:
156156
define i32 @PR43802_without_nowrap(i32 %arg) {
157157
; CHECK-LABEL: @PR43802_without_nowrap(
158158
; CHECK-NEXT: entry:
159-
; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[ARG:%.*]]
159+
; CHECK-NEXT: [[SUB1:%.*]] = sub nsw i32 0, [[ARG:%.*]]
160160
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[ARG]], -2147483648
161161
; CHECK-NEXT: br i1 [[CMP]], label [[BB2:%.*]], label [[BB3:%.*]]
162162
; CHECK: bb2:
163163
; CHECK-NEXT: br label [[BB3]]
164164
; CHECK: bb3:
165+
; CHECK-NEXT: [[SUB:%.*]] = phi i32 [ -2147483648, [[BB2]] ], [ [[SUB1]], [[ENTRY:%.*]] ]
165166
; CHECK-NEXT: ret i32 [[SUB]]
166167
;
167168
entry:

0 commit comments

Comments
 (0)