Skip to content

Commit b7cc95e

Browse files
committed
!fixup update after rebase
1 parent 99a675d commit b7cc95e

File tree

2 files changed

+45
-62
lines changed

2 files changed

+45
-62
lines changed

llvm/lib/CodeGen/SelectOptimize.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,10 @@ static Value *getTrueOrFalseValue(
496496

497497
auto *CBO = BO->clone();
498498
auto CondIdx = SI.getConditionOpIndex();
499-
CBO->setOperand(CondIdx, ConstantInt::get(CBO->getType(), 1));
499+
bool HasSExt = isa<SExtInst>(CBO->getOperand(CondIdx));
500+
Constant *CI = HasSExt ? ConstantInt::get(CBO->getType(), -1)
501+
: ConstantInt::get(CBO->getType(), 1);
502+
CBO->setOperand(CondIdx, CI);
500503

501504
unsigned OtherIdx = 1 - CondIdx;
502505
if (auto *IV = dyn_cast<Instruction>(CBO->getOperand(OtherIdx))) {
@@ -769,7 +772,7 @@ void SelectOptimizeImpl::collectSelectGroups(BasicBlock &BB,
769772
// inserted position.
770773
auto ProcessSelectInfo = [&SelectInfo](Instruction *I) {
771774
Value *Cond;
772-
if (match(I, m_OneUse(m_ZExt(m_Value(Cond)))) &&
775+
if (match(I, m_OneUse(m_ZExtOrSExt(m_Value(Cond)))) &&
773776
Cond->getType()->isIntegerTy(1)) {
774777
bool Inverted = match(Cond, m_Not(m_Value(Cond)));
775778
return SelectInfo.insert({I, {Cond, true, Inverted, 0}}).first;
@@ -793,9 +796,9 @@ void SelectOptimizeImpl::collectSelectGroups(BasicBlock &BB,
793796
case Instruction::Sub: {
794797
Value *X;
795798
if (!((PatternMatch::match(I->getOperand(0),
796-
m_OneUse(m_ZExt(m_Value(X)))) ||
799+
m_OneUse(m_ZExtOrSExt(m_Value(X)))) ||
797800
PatternMatch::match(I->getOperand(1),
798-
m_OneUse(m_ZExt(m_Value(X))))) &&
801+
m_OneUse(m_ZExtOrSExt(m_Value(X))))) &&
799802
X->getType()->isIntegerTy(1)))
800803
return SelectInfo.end();
801804
break;

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

Lines changed: 38 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,12 @@ define void @test_add_sext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
178178
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
179179
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[CMP3]] to i64
180180
; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
181-
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[J]], -1
182-
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
183-
; CHECK: select.false:
181+
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END]]
182+
; CHECK: select.true.sink:
183+
; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[J]], -1
184184
; CHECK-NEXT: br label [[SELECT_END]]
185185
; CHECK: select.end:
186-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
186+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[LOOP]] ]
187187
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
188188
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
189189
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -231,13 +231,13 @@ define void @test_add_sext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
231231
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
232232
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
233233
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
234-
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
235-
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[J]], -1
234+
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
236235
; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
237-
; CHECK: select.false:
236+
; CHECK: select.false.sink:
237+
; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[J]], -1
238238
; CHECK-NEXT: br label [[SELECT_END]]
239239
; CHECK: select.end:
240-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
240+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE]] ]
241241
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
242242
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
243243
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -286,19 +286,14 @@ define void @test_add_sext_not_and_regular_select(ptr %dst, ptr %src, i64 %j.sta
286286
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
287287
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
288288
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
289-
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
290-
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[J]], -1
291-
; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
292-
; CHECK: select.false:
293-
; CHECK-NEXT: br label [[SELECT_END]]
294-
; CHECK: select.end:
295-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
296289
; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
297-
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
298-
; CHECK: select.false2:
290+
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE_SINK:%.*]]
291+
; CHECK: select.false.sink:
292+
; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[J]], -1
299293
; CHECK-NEXT: br label [[SELECT_END1]]
300-
; CHECK: select.end1:
301-
; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[SELECT_END]] ], [ [[L_J]], [[SELECT_FALSE2]] ]
294+
; CHECK: select.end:
295+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE_SINK]] ]
296+
; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[LOOP]] ], [ [[L_J]], [[SELECT_FALSE_SINK]] ]
302297
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
303298
; CHECK-NEXT: store ptr [[SINK]], ptr [[GEP_DST]], align 8
304299
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -351,20 +346,15 @@ define void @test_add_sext_not_and_regular_select2(ptr %dst, ptr %src, i64 %j.st
351346
; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[ARRAYIDX1_I]], align 8
352347
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i64 [[TMP2]], [[TMP3]]
353348
; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
354-
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
355-
; CHECK: select.false:
356-
; CHECK-NEXT: br label [[SELECT_END]]
349+
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE:%.*]]
350+
; CHECK: select.false.sink:
351+
; CHECK-NEXT: [[TMP5:%.*]] = add nsw i64 [[J]], -1
352+
; CHECK-NEXT: br label [[SELECT_END1]]
357353
; CHECK: select.end:
358354
; CHECK-NEXT: [[DOTSINK:%.*]] = phi ptr [ [[TMP0]], [[LOOP]] ], [ [[TMP1]], [[SELECT_FALSE]] ]
355+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP5]], [[SELECT_FALSE]] ]
359356
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
360357
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
361-
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
362-
; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[J]], -1
363-
; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
364-
; CHECK: select.false2:
365-
; CHECK-NEXT: br label [[SELECT_END1]]
366-
; CHECK: select.end1:
367-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP5]], [[SELECT_END]] ], [ [[J]], [[SELECT_FALSE2]] ]
368358
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
369359
; CHECK-NEXT: store ptr [[DOTSINK]], ptr [[TMP4]], align 8
370360
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -579,12 +569,12 @@ define void @test_sub_sext(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.star
579569
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
580570
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[CMP3]] to i64
581571
; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
582-
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[J]], -1
583-
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
584-
; CHECK: select.false:
572+
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END]]
573+
; CHECK: select.true.sink:
574+
; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i64 [[J]], -1
585575
; CHECK-NEXT: br label [[SELECT_END]]
586576
; CHECK: select.end:
587-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
577+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[LOOP]] ]
588578
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
589579
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
590580
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -632,13 +622,13 @@ define void @test_sub_sext_not(ptr %dst, ptr %src, i64 %j.start, i64 %p, i64 %i.
632622
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
633623
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
634624
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
635-
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
636-
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[J]], -1
625+
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
637626
; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END]], label [[SELECT_FALSE:%.*]]
638-
; CHECK: select.false:
627+
; CHECK: select.false.sink:
628+
; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i64 [[J]], -1
639629
; CHECK-NEXT: br label [[SELECT_END]]
640630
; CHECK: select.end:
641-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
631+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE]] ]
642632
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
643633
; CHECK-NEXT: store i64 [[J_NEXT]], ptr [[GEP_DST]], align 8
644634
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -687,19 +677,14 @@ define void @test_sub_sext_not_and_regular_select(ptr %dst, ptr %src, i64 %j.sta
687677
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult ptr [[L_I]], [[L_J]]
688678
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
689679
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
690-
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
691-
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[J]], -1
692-
; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
693-
; CHECK: select.false:
694-
; CHECK-NEXT: br label [[SELECT_END]]
695-
; CHECK: select.end:
696-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP0]], [[LOOP]] ], [ [[J]], [[SELECT_FALSE]] ]
697680
; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
698-
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
699-
; CHECK: select.false2:
681+
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE_SINK:%.*]]
682+
; CHECK: select.false.sink:
683+
; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i64 [[J]], -1
700684
; CHECK-NEXT: br label [[SELECT_END1]]
701-
; CHECK: select.end1:
702-
; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[SELECT_END]] ], [ [[L_J]], [[SELECT_FALSE2]] ]
685+
; CHECK: select.end:
686+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP0]], [[SELECT_FALSE_SINK]] ]
687+
; CHECK-NEXT: [[SINK:%.*]] = phi ptr [ [[L_I]], [[LOOP]] ], [ [[L_J]], [[SELECT_FALSE_SINK]] ]
703688
; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
704689
; CHECK-NEXT: store ptr [[SINK]], ptr [[GEP_DST]], align 8
705690
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
@@ -752,20 +737,15 @@ define void @test_sub_sext_not_and_regular_select2(ptr %dst, ptr %src, i64 %j.st
752737
; CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[ARRAYIDX1_I]], align 8
753738
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i64 [[TMP2]], [[TMP3]]
754739
; CHECK-NEXT: [[CMP3_FROZEN:%.*]] = freeze i1 [[CMP3]]
755-
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]
756-
; CHECK: select.false:
757-
; CHECK-NEXT: br label [[SELECT_END]]
740+
; CHECK-NEXT: br i1 [[CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE:%.*]]
741+
; CHECK: select.false.sink:
742+
; CHECK-NEXT: [[TMP5:%.*]] = sub nsw i64 [[J]], -1
743+
; CHECK-NEXT: br label [[SELECT_END1]]
758744
; CHECK: select.end:
759745
; CHECK-NEXT: [[DOTSINK:%.*]] = phi ptr [ [[TMP0]], [[LOOP]] ], [ [[TMP1]], [[SELECT_FALSE]] ]
746+
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[J]], [[LOOP]] ], [ [[TMP5]], [[SELECT_FALSE]] ]
760747
; CHECK-NEXT: [[NOT_CMP3:%.*]] = xor i1 [[CMP3]], true
761748
; CHECK-NEXT: [[DEC:%.*]] = sext i1 [[NOT_CMP3]] to i64
762-
; CHECK-NEXT: [[NOT_CMP3_FROZEN:%.*]] = freeze i1 [[NOT_CMP3]]
763-
; CHECK-NEXT: [[TMP5:%.*]] = sub i64 [[J]], -1
764-
; CHECK-NEXT: br i1 [[NOT_CMP3_FROZEN]], label [[SELECT_END1]], label [[SELECT_FALSE2:%.*]]
765-
; CHECK: select.false2:
766-
; CHECK-NEXT: br label [[SELECT_END1]]
767-
; CHECK: select.end1:
768-
; CHECK-NEXT: [[J_NEXT]] = phi i64 [ [[TMP5]], [[SELECT_END]] ], [ [[J]], [[SELECT_FALSE2]] ]
769749
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[IV]]
770750
; CHECK-NEXT: store ptr [[DOTSINK]], ptr [[TMP4]], align 8
771751
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1

0 commit comments

Comments
 (0)