Skip to content

Commit d2e835b

Browse files
nikicdyung
authored andcommitted
[SelectOptimize] Fix incorrect -1 immediate for large integers (#170860)
This was creating a -1 with zero extension, while it needs to use sign extension. (cherry picked from commit 1165e41)
1 parent 4b24e73 commit d2e835b

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

llvm/lib/CodeGen/SelectOptimize.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ static Value *getTrueOrFalseValue(
502502
} else {
503503
assert((isa<AShrOperator>(AuxI) || isa<SExtInst>(AuxI)) &&
504504
"Unexpected opcode");
505-
CBO->setOperand(CondIdx, ConstantInt::get(CBO->getType(), -1));
505+
CBO->setOperand(CondIdx, ConstantInt::getAllOnesValue(CBO->getType()));
506506
}
507507

508508
unsigned OtherIdx = 1 - CondIdx;

llvm/test/CodeGen/AArch64/selectopt-cast.ll

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,3 +901,49 @@ loop:
901901
exit:
902902
ret void
903903
}
904+
905+
define void @sext_i128() {
906+
; CHECK-LABEL: @sext_i128(
907+
; CHECK-NEXT: entry:
908+
; CHECK-NEXT: br label [[LOOP:%.*]]
909+
; CHECK: loop:
910+
; CHECK-NEXT: [[I:%.*]] = icmp slt i128 0, 0
911+
; CHECK-NEXT: [[I2:%.*]] = sext i1 [[I]] to i128
912+
; CHECK-NEXT: [[I3:%.*]] = or i128 [[I2]], 0
913+
; CHECK-NEXT: [[I4:%.*]] = icmp slt i128 [[I3]], 0
914+
; CHECK-NEXT: [[I5:%.*]] = sext i1 [[I4]] to i128
915+
; CHECK-NEXT: [[I4_FROZEN:%.*]] = freeze i1 [[I4]]
916+
; CHECK-NEXT: br i1 [[I4_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END:%.*]]
917+
; CHECK: select.true.sink:
918+
; CHECK-NEXT: [[TMP0:%.*]] = add i128 -1, 0
919+
; CHECK-NEXT: br label [[SELECT_END]]
920+
; CHECK: select.end:
921+
; CHECK-NEXT: [[I6:%.*]] = phi i128 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ 0, [[LOOP]] ]
922+
; CHECK-NEXT: [[I7:%.*]] = icmp slt i128 [[I6]], 0
923+
; CHECK-NEXT: [[I8:%.*]] = sext i1 [[I7]] to i128
924+
; CHECK-NEXT: [[I7_FROZEN:%.*]] = freeze i1 [[I7]]
925+
; CHECK-NEXT: br i1 [[I7_FROZEN]], label [[SELECT_TRUE_SINK2:%.*]], label [[SELECT_END1:%.*]]
926+
; CHECK: select.true.sink2:
927+
; CHECK-NEXT: [[TMP1:%.*]] = add i128 -1, 0
928+
; CHECK-NEXT: br label [[SELECT_END1]]
929+
; CHECK: select.end1:
930+
; CHECK-NEXT: [[I9:%.*]] = phi i128 [ [[TMP1]], [[SELECT_TRUE_SINK2]] ], [ 0, [[SELECT_END]] ]
931+
; CHECK-NEXT: [[I10:%.*]] = or i128 [[I9]], 0
932+
; CHECK-NEXT: br label [[LOOP]]
933+
;
934+
entry:
935+
br label %loop
936+
937+
loop:
938+
%i = icmp slt i128 0, 0
939+
%i2 = sext i1 %i to i128
940+
%i3 = or i128 %i2, 0
941+
%i4 = icmp slt i128 %i3, 0
942+
%i5 = sext i1 %i4 to i128
943+
%i6 = add i128 %i5, 0
944+
%i7 = icmp slt i128 %i6, 0
945+
%i8 = sext i1 %i7 to i128
946+
%i9 = add i128 %i8, 0
947+
%i10 = or i128 %i9, 0
948+
br label %loop
949+
}

0 commit comments

Comments
 (0)