Skip to content

Commit 13af0e0

Browse files
committed
[SCCP] Add nneg flag to uitofp if its operand is non-negative
Similiar to the `InstCombine` changes, just furthering the support of the `uitofp nneg` support.
1 parent 3b5fdd5 commit 13af0e0

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

llvm/lib/Transforms/Utils/SCCPSolver.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ static bool refineInstruction(SCCPSolver &Solver,
143143
Changed = true;
144144
}
145145
}
146-
} else if (isa<ZExtInst>(Inst) && !Inst.hasNonNeg()) {
146+
} else if (isa<PossiblyNonNegInst>(Inst) && !Inst.hasNonNeg()) {
147147
auto Range = GetRange(Inst.getOperand(0));
148148
if (Range.isAllNonNegative()) {
149149
Inst.setNonNeg();
@@ -191,14 +191,16 @@ static bool replaceSignedInst(SCCPSolver &Solver,
191191

192192
Instruction *NewInst = nullptr;
193193
switch (Inst.getOpcode()) {
194-
// Note: We do not fold sitofp -> uitofp here because that could be more
195-
// expensive in codegen and may not be reversible in the backend.
194+
case Instruction::SIToFP:
196195
case Instruction::SExt: {
197-
// If the source value is not negative, this is a zext.
196+
// If the source value is not negative, this is a zext/uitofp.
198197
Value *Op0 = Inst.getOperand(0);
199198
if (InsertedValues.count(Op0) || !isNonNegative(Op0))
200199
return false;
201-
NewInst = new ZExtInst(Op0, Inst.getType(), "", Inst.getIterator());
200+
NewInst = CastInst::Create(Inst.getOpcode() == Instruction::SExt
201+
? Instruction::ZExt
202+
: Instruction::UIToFP,
203+
Op0, Inst.getType(), "", Inst.getIterator());
202204
NewInst->setNonNeg();
203205
break;
204206
}

llvm/test/Transforms/SCCP/ip-ranges-casts.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ define i1 @caller.sext() {
167167
define internal i1 @f.fptosi(i32 %x) {
168168
; CHECK-LABEL: define internal i1 @f.fptosi(
169169
; CHECK-SAME: i32 [[X:%.*]]) {
170-
; CHECK-NEXT: [[TO_DOUBLE:%.*]] = sitofp i32 [[X]] to double
170+
; CHECK-NEXT: [[TO_DOUBLE:%.*]] = uitofp nneg i32 [[X]] to double
171171
; CHECK-NEXT: [[ADD:%.*]] = fadd double 0.000000e+00, [[TO_DOUBLE]]
172172
; CHECK-NEXT: [[TO_I32:%.*]] = fptosi double [[ADD]] to i32
173173
; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i32 [[TO_I32]], 300
@@ -209,7 +209,7 @@ define i1 @caller.fptosi() {
209209
define internal i1 @f.fpext(i16 %x) {
210210
; CHECK-LABEL: define internal i1 @f.fpext(
211211
; CHECK-SAME: i16 [[X:%.*]]) {
212-
; CHECK-NEXT: [[TO_FLOAT:%.*]] = sitofp i16 [[X]] to float
212+
; CHECK-NEXT: [[TO_FLOAT:%.*]] = uitofp nneg i16 [[X]] to float
213213
; CHECK-NEXT: [[TO_DOUBLE:%.*]] = fpext float [[TO_FLOAT]] to double
214214
; CHECK-NEXT: [[TO_I64:%.*]] = fptoui float [[TO_FLOAT]] to i64
215215
; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i64 [[TO_I64]], 300
@@ -293,7 +293,7 @@ define i1 @int_range_to_double_cast(i32 %a) {
293293
; CHECK-LABEL: define i1 @int_range_to_double_cast(
294294
; CHECK-SAME: i32 [[A:%.*]]) {
295295
; CHECK-NEXT: [[R:%.*]] = and i32 [[A]], 255
296-
; CHECK-NEXT: [[T4:%.*]] = sitofp i32 [[R]] to double
296+
; CHECK-NEXT: [[T4:%.*]] = uitofp nneg i32 [[R]] to double
297297
; CHECK-NEXT: [[T10:%.*]] = fadd double 0.000000e+00, [[T4]]
298298
; CHECK-NEXT: [[T11:%.*]] = fcmp olt double [[T4]], [[T10]]
299299
; CHECK-NEXT: ret i1 [[T11]]

llvm/test/Transforms/SCCP/sitofp.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
define float @sitofp_and(i8 %x) {
55
; CHECK-LABEL: @sitofp_and(
66
; CHECK-NEXT: [[PX:%.*]] = and i8 [[X:%.*]], 127
7-
; CHECK-NEXT: [[R:%.*]] = sitofp i8 [[PX]] to float
7+
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[PX]] to float
88
; CHECK-NEXT: ret float [[R]]
99
;
1010
%px = and i8 %x, 127
@@ -23,7 +23,7 @@ define half @sitofp_const(i8 %x) {
2323
define double @sitofp_zext(i7 %x) {
2424
; CHECK-LABEL: @sitofp_zext(
2525
; CHECK-NEXT: [[PX:%.*]] = zext i7 [[X:%.*]] to i8
26-
; CHECK-NEXT: [[R:%.*]] = sitofp i8 [[PX]] to double
26+
; CHECK-NEXT: [[R:%.*]] = uitofp nneg i8 [[PX]] to double
2727
; CHECK-NEXT: ret double [[R]]
2828
;
2929
%px = zext i7 %x to i8
@@ -52,7 +52,7 @@ define float @dominating_condition(i32 %x) {
5252
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
5353
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
5454
; CHECK: t:
55-
; CHECK-NEXT: [[A:%.*]] = sitofp i32 [[X]] to float
55+
; CHECK-NEXT: [[A:%.*]] = uitofp nneg i32 [[X]] to float
5656
; CHECK-NEXT: br label [[EXIT:%.*]]
5757
; CHECK: f:
5858
; CHECK-NEXT: br label [[EXIT]]
@@ -86,7 +86,7 @@ define float @dominating_condition_alt(i32 %x) {
8686
; CHECK: t:
8787
; CHECK-NEXT: br label [[EXIT:%.*]]
8888
; CHECK: f:
89-
; CHECK-NEXT: [[A:%.*]] = sitofp i32 [[X]] to float
89+
; CHECK-NEXT: [[A:%.*]] = uitofp nneg i32 [[X]] to float
9090
; CHECK-NEXT: br label [[EXIT]]
9191
; CHECK: exit:
9292
; CHECK-NEXT: [[COND:%.*]] = phi float [ -4.200000e+01, [[T]] ], [ [[A]], [[F]] ]

0 commit comments

Comments
 (0)