Skip to content

Commit 1165e41

Browse files
authored
[SelectOptimize] Fix incorrect -1 immediate for large integers (#170860)
This was creating a -1 with zero extension, while it needs to use sign extension.
1 parent 5874ddf commit 1165e41

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-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: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,3 +901,40 @@ loop:
901901
exit:
902902
ret void
903903
}
904+
905+
declare void @use(i128)
906+
907+
define void @sext_i128(ptr %a) {
908+
; CHECK-LABEL: @sext_i128(
909+
; CHECK-NEXT: entry:
910+
; CHECK-NEXT: br label [[LOOP:%.*]]
911+
; CHECK: loop:
912+
; CHECK-NEXT: [[LOAD:%.*]] = load i128, ptr [[A:%.*]], align 16
913+
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i128 [[LOAD]], 0
914+
; CHECK-NEXT: [[SEXT1:%.*]] = sext i1 [[CMP1]] to i128
915+
; CHECK-NEXT: [[CMP1_FROZEN:%.*]] = freeze i1 [[CMP1]]
916+
; CHECK-NEXT: br i1 [[CMP1_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: [[ADD:%.*]] = phi i128 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ 0, [[LOOP]] ]
922+
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i128 [[ADD]], 0
923+
; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP]], label [[EXIT:%.*]]
924+
; CHECK: exit:
925+
; CHECK-NEXT: ret void
926+
;
927+
entry:
928+
br label %loop
929+
930+
loop:
931+
%load = load i128, ptr %a, align 16
932+
%cmp1 = icmp slt i128 %load, 0
933+
%sext1 = sext i1 %cmp1 to i128
934+
%add = add i128 %sext1, 0
935+
%cmp2 = icmp slt i128 %add, 0
936+
br i1 %cmp2, label %loop, label %exit
937+
938+
exit:
939+
ret void
940+
}

0 commit comments

Comments
 (0)