Skip to content

Commit 444e53f

Browse files
authored
[SelectOpt] Fix incorrect IR for SUB when comparison dependent operand is first (#119362)
1 parent 4f93327 commit 444e53f

File tree

2 files changed

+10
-11
lines changed

2 files changed

+10
-11
lines changed

llvm/lib/CodeGen/SelectOptimize.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,12 @@ void SelectOptimizeImpl::collectSelectGroups(BasicBlock &BB,
806806
break;
807807
}
808808

809-
for (unsigned Idx = 0; Idx < 2; Idx++) {
809+
// Iterate through operands and find dependant on recognised sign
810+
// extending auxiliary select-like instructions. The operand index does
811+
// not matter for Add and Or. However, for Sub, we can only safely
812+
// transform when the operand is second.
813+
unsigned Idx = BO->getOpcode() == Instruction::Sub ? 1 : 0;
814+
for (; Idx < 2; Idx++) {
810815
auto *Op = BO->getOperand(Idx);
811816
auto It = SelectInfo.find(Op);
812817
if (It != SelectInfo.end() && It->second.IsAuxiliary) {

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -427,22 +427,16 @@ define void @test_sub_zext_first_op(ptr %dst, ptr %src, i64 %j.start, i64 %p, i6
427427
; CHECK-NEXT: entry:
428428
; CHECK-NEXT: br label [[LOOP:%.*]]
429429
; CHECK: loop:
430-
; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[SELECT_END:%.*]] ]
431-
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[SELECT_END]] ]
432-
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[SELECT_END]] ]
430+
; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
431+
; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[J_START:%.*]], [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LOOP]] ]
432+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[I_START:%.*]], [[ENTRY]] ], [ [[J_NEXT]], [[LOOP]] ]
433433
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
434434
; CHECK-NEXT: [[L_I:%.*]] = load ptr, ptr [[GEP_DST]], align 8
435435
; CHECK-NEXT: [[GEP_J:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 [[J]]
436436
; CHECK-NEXT: [[L_J:%.*]] = load ptr, ptr [[GEP_J]], align 8
437437
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
438438
; CHECK-NEXT: [[DEC:%.*]] = zext i1 [[CMP3]] to i64
439-
; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
440-
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END]]
441-
; CHECK: select.true.sink:
442-
; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i64 1, [[J]]
443-
; CHECK-NEXT: br label [[SELECT_END]]
444-
; CHECK: select.end:
445-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[LOOP]] ]
439+
; CHECK-NEXT: [[J_NEXT]] = sub nsw i64 [[DEC]], [[J]]
446440
; CHECK-NEXT: [[GEP_DST1:%.*]] = getelementptr inbounds ptr, ptr [[DST1:%.*]], i64 [[IV1]]
447441
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST1]], align 8
448442
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV1]], 1

0 commit comments

Comments
 (0)