Skip to content

Commit 3e87236

Browse files
committed
[InstCombine] Canonicalize extractvalue + select
1 parent 7358b20 commit 3e87236

File tree

2 files changed

+13
-11
lines changed

2 files changed

+13
-11
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3834,6 +3834,16 @@ Instruction *InstCombinerImpl::visitExtractValueInst(ExtractValueInst &EV) {
38343834
if (Instruction *Res = foldOpIntoPhi(EV, PN))
38353835
return Res;
38363836

3837+
// Canonicalize extract (select Cond, TV, FV)
3838+
// -> select cond, (extract TV), (extract FV)
3839+
if (auto *SI = dyn_cast<SelectInst>(Agg)) {
3840+
Value *Cond = SI->getCondition();
3841+
Value *TV = Builder.CreateExtractValue(SI->getTrueValue(), EV.getIndices());
3842+
Value *FV =
3843+
Builder.CreateExtractValue(SI->getFalseValue(), EV.getIndices());
3844+
return SelectInst::Create(Cond, TV, FV);
3845+
}
3846+
38373847
// We could simplify extracts from other values. Note that nested extracts may
38383848
// already be simplified implicitly by the above: extract (extract (insert) )
38393849
// will be translated into extract ( insert ( extract ) ) first and then just

llvm/test/Transforms/InstCombine/extract-select-agg.ll

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ define i64 @test_select_agg_constant(i64 %val, i1 %cond) {
55
; CHECK-LABEL: define i64 @test_select_agg_constant(
66
; CHECK-SAME: i64 [[VAL:%.*]], i1 [[COND:%.*]]) {
77
; CHECK-NEXT: entry:
8-
; CHECK-NEXT: [[A:%.*]] = insertvalue { i64, i64 } { i64 1, i64 poison }, i64 [[VAL]], 1
9-
; CHECK-NEXT: [[B:%.*]] = insertvalue { i64, i64 } { i64 0, i64 poison }, i64 [[VAL]], 1
10-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], { i64, i64 } [[A]], { i64, i64 } [[B]]
11-
; CHECK-NEXT: [[RET:%.*]] = extractvalue { i64, i64 } [[SEL]], 0
8+
; CHECK-NEXT: [[RET:%.*]] = zext i1 [[COND]] to i64
129
; CHECK-NEXT: ret i64 [[RET]]
1310
;
1411
entry:
@@ -23,14 +20,9 @@ define void @test_select_agg_multiuse(i1 %cond, i64 %v1, i64 %v2, i64 %v3, i64 %
2320
; CHECK-LABEL: define void @test_select_agg_multiuse(
2421
; CHECK-SAME: i1 [[COND:%.*]], i64 [[V1:%.*]], i64 [[V2:%.*]], i64 [[V3:%.*]], i64 [[V4:%.*]]) {
2522
; CHECK-NEXT: entry:
26-
; CHECK-NEXT: [[A0:%.*]] = insertvalue { i64, i64 } poison, i64 [[V1]], 0
27-
; CHECK-NEXT: [[A1:%.*]] = insertvalue { i64, i64 } [[A0]], i64 [[V2]], 1
28-
; CHECK-NEXT: [[B0:%.*]] = insertvalue { i64, i64 } poison, i64 [[V3]], 0
29-
; CHECK-NEXT: [[B1:%.*]] = insertvalue { i64, i64 } [[B0]], i64 [[V4]], 1
30-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND]], { i64, i64 } [[A1]], { i64, i64 } [[B1]]
31-
; CHECK-NEXT: [[X:%.*]] = extractvalue { i64, i64 } [[SEL]], 0
23+
; CHECK-NEXT: [[X:%.*]] = select i1 [[COND]], i64 [[V1]], i64 [[V3]]
3224
; CHECK-NEXT: call void @use(i64 [[X]])
33-
; CHECK-NEXT: [[Y:%.*]] = extractvalue { i64, i64 } [[SEL]], 1
25+
; CHECK-NEXT: [[Y:%.*]] = select i1 [[COND]], i64 [[V2]], i64 [[V4]]
3426
; CHECK-NEXT: call void @use(i64 [[Y]])
3527
; CHECK-NEXT: ret void
3628
;

0 commit comments

Comments
 (0)