Skip to content

Commit 5fb1ec2

Browse files
committed
[CVP] Convert sitofp -> uitofp nneg and add nneg flag to uitofp
Similiar to the `InstCombine` changes, just furthering the scope of the canonicalization/`uitofp nneg` support
1 parent 4850e32 commit 5fb1ec2

File tree

3 files changed

+52
-15
lines changed

3 files changed

+52
-15
lines changed

llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ STATISTIC(NumAShrsConverted, "Number of ashr converted to lshr");
6262
STATISTIC(NumAShrsRemoved, "Number of ashr removed");
6363
STATISTIC(NumSRems, "Number of srem converted to urem");
6464
STATISTIC(NumSExt, "Number of sext converted to zext");
65+
STATISTIC(NumSIToFP, "Number of sitofp converted to uitofp");
6566
STATISTIC(NumSICmps, "Number of signed icmp preds simplified to unsigned");
6667
STATISTIC(NumAnd, "Number of ands removed");
6768
STATISTIC(NumNW, "Number of no-wrap deductions");
@@ -89,7 +90,7 @@ STATISTIC(NumSMinMax,
8990
"Number of llvm.s{min,max} intrinsics simplified to unsigned");
9091
STATISTIC(NumUDivURemsNarrowedExpanded,
9192
"Number of bound udiv's/urem's expanded");
92-
STATISTIC(NumZExt, "Number of non-negative deductions");
93+
STATISTIC(NumNNeg, "Number of zext/uitofp non-negative deductions");
9394

9495
static Constant *getConstantAt(Value *V, Instruction *At, LazyValueInfo *LVI) {
9596
if (Constant *C = LVI->getConstant(V, At))
@@ -1075,20 +1076,50 @@ static bool processSExt(SExtInst *SDI, LazyValueInfo *LVI) {
10751076
return true;
10761077
}
10771078

1078-
static bool processZExt(ZExtInst *ZExt, LazyValueInfo *LVI) {
1079-
if (ZExt->getType()->isVectorTy())
1079+
static bool processPossibleNonNeg(Instruction *I, LazyValueInfo *LVI) {
1080+
assert(isa<PossiblyNonNegInst>(I) && "Requires PossiblyNonNeg instruction");
1081+
if (I->getType()->isVectorTy())
10801082
return false;
10811083

1082-
if (ZExt->hasNonNeg())
1084+
if (I->hasNonNeg())
10831085
return false;
10841086

1085-
const Use &Base = ZExt->getOperandUse(0);
1087+
const Use &Base = I->getOperandUse(0);
10861088
if (!LVI->getConstantRangeAtUse(Base, /*UndefAllowed*/ false)
10871089
.isAllNonNegative())
10881090
return false;
10891091

1090-
++NumZExt;
1091-
ZExt->setNonNeg();
1092+
++NumNNeg;
1093+
I->setNonNeg();
1094+
1095+
return true;
1096+
}
1097+
1098+
static bool processZExt(ZExtInst *ZExt, LazyValueInfo *LVI) {
1099+
return processPossibleNonNeg(ZExt, LVI);
1100+
}
1101+
1102+
static bool processUIToFP(UIToFPInst *UIToFP, LazyValueInfo *LVI) {
1103+
return processPossibleNonNeg(UIToFP, LVI);
1104+
}
1105+
1106+
static bool processSIToFP(SIToFPInst *SIToFP, LazyValueInfo *LVI) {
1107+
if (SIToFP->getType()->isVectorTy())
1108+
return false;
1109+
1110+
const Use &Base = SIToFP->getOperandUse(0);
1111+
if (!LVI->getConstantRangeAtUse(Base, /*UndefAllowed*/ false)
1112+
.isAllNonNegative())
1113+
return false;
1114+
1115+
++NumSIToFP;
1116+
auto *UIToFP = CastInst::Create(Instruction::UIToFP, Base, SIToFP->getType(),
1117+
"", SIToFP->getIterator());
1118+
UIToFP->takeName(SIToFP);
1119+
UIToFP->setDebugLoc(SIToFP->getDebugLoc());
1120+
UIToFP->setNonNeg();
1121+
SIToFP->replaceAllUsesWith(UIToFP);
1122+
SIToFP->eraseFromParent();
10921123

10931124
return true;
10941125
}
@@ -1200,6 +1231,12 @@ static bool runImpl(Function &F, LazyValueInfo *LVI, DominatorTree *DT,
12001231
case Instruction::ZExt:
12011232
BBChanged |= processZExt(cast<ZExtInst>(&II), LVI);
12021233
break;
1234+
case Instruction::UIToFP:
1235+
BBChanged |= processUIToFP(cast<UIToFPInst>(&II), LVI);
1236+
break;
1237+
case Instruction::SIToFP:
1238+
BBChanged |= processSIToFP(cast<SIToFPInst>(&II), LVI);
1239+
break;
12031240
case Instruction::Add:
12041241
case Instruction::Sub:
12051242
case Instruction::Mul:

llvm/test/Transforms/CorrelatedValuePropagation/sitofp.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ define void @test1_fptosi(i32 %n) {
1212
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
1313
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
1414
; CHECK: for.body:
15-
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[A]] to float
15+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp nneg i32 [[A]] to float
1616
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
1717
; CHECK-NEXT: [[EXT]] = fptosi float [[EXT_WIDE]] to i32
1818
; CHECK-NEXT: br label [[FOR_COND]]
@@ -46,7 +46,7 @@ define void @test1_fptoui(i32 %n) {
4646
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
4747
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
4848
; CHECK: for.body:
49-
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[A]] to float
49+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp nneg i32 [[A]] to float
5050
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
5151
; CHECK-NEXT: [[EXT]] = fptoui float [[EXT_WIDE]] to i32
5252
; CHECK-NEXT: br label [[FOR_COND]]
@@ -113,7 +113,7 @@ define void @test3(i32 %n) {
113113
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
114114
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
115115
; CHECK: bb:
116-
; CHECK-NEXT: [[EXT_WIDE:%.*]] = sitofp i32 [[N]] to float
116+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp nneg i32 [[N]] to float
117117
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
118118
; CHECK-NEXT: br label [[EXIT]]
119119
; CHECK: exit:
@@ -192,7 +192,7 @@ exit:
192192
define double @test_infer_at_use(i32 noundef %n) {
193193
; CHECK-LABEL: @test_infer_at_use(
194194
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
195-
; CHECK-NEXT: [[EXT:%.*]] = sitofp i32 [[N]] to double
195+
; CHECK-NEXT: [[EXT:%.*]] = uitofp nneg i32 [[N]] to double
196196
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], double [[EXT]], double 0.000000e+00
197197
; CHECK-NEXT: ret double [[SELECT]]
198198
;

llvm/test/Transforms/CorrelatedValuePropagation/uitofp.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ define void @test1_fptosi(i32 %n) {
1212
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
1313
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
1414
; CHECK: for.body:
15-
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp i32 [[A]] to float
15+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp nneg i32 [[A]] to float
1616
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
1717
; CHECK-NEXT: [[EXT]] = fptosi float [[EXT_WIDE]] to i32
1818
; CHECK-NEXT: br label [[FOR_COND]]
@@ -46,7 +46,7 @@ define void @test1_fptoui(i32 %n) {
4646
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
4747
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
4848
; CHECK: for.body:
49-
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp i32 [[A]] to float
49+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp nneg i32 [[A]] to float
5050
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
5151
; CHECK-NEXT: [[EXT]] = fptoui float [[EXT_WIDE]] to i32
5252
; CHECK-NEXT: br label [[FOR_COND]]
@@ -113,7 +113,7 @@ define void @test3(i32 %n) {
113113
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
114114
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
115115
; CHECK: bb:
116-
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp i32 [[N]] to float
116+
; CHECK-NEXT: [[EXT_WIDE:%.*]] = uitofp nneg i32 [[N]] to float
117117
; CHECK-NEXT: call void @use.f32(float [[EXT_WIDE]])
118118
; CHECK-NEXT: br label [[EXIT]]
119119
; CHECK: exit:
@@ -192,7 +192,7 @@ exit:
192192
define double @test_infer_at_use(i32 noundef %n) {
193193
; CHECK-LABEL: @test_infer_at_use(
194194
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
195-
; CHECK-NEXT: [[EXT:%.*]] = uitofp i32 [[N]] to double
195+
; CHECK-NEXT: [[EXT:%.*]] = uitofp nneg i32 [[N]] to double
196196
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], double [[EXT]], double 0.000000e+00
197197
; CHECK-NEXT: ret double [[SELECT]]
198198
;

0 commit comments

Comments
 (0)