Skip to content

Commit f44cade

Browse files
committed
Add new test cases.
1 parent a9999a7 commit f44cade

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1692,7 +1692,7 @@ Instruction *InstCombinerImpl::FoldOpIntoSelect(Instruction &Op, SelectInst *SI,
16921692

16931693
Value *TV = SI->getTrueValue();
16941694
Value *FV = SI->getFalseValue();
1695-
if ((Op.getOpcode() == Instruction::ExtractValue) &&
1695+
if (Op.getOpcode() == Instruction::ExtractValue &&
16961696
(isa<InsertValueInst>(TV) || isa<InsertValueInst>(FV))) {
16971697
// extract (select (cond, insert(agg, elem), FV))
16981698
// -> select (cond, elem, extract(FV))

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

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ entry:
7777

7878
declare void @use(i64)
7979

80-
define i64 @test_extract_select_insert(ptr %p1, i64 %v) {
81-
; CHECK-LABEL: define i64 @test_extract_select_insert(
80+
define i64 @test_extract_select_insert_left(ptr %p1, i64 %v) {
81+
; CHECK-LABEL: define i64 @test_extract_select_insert_left(
8282
; CHECK-SAME: ptr [[P1:%.*]], i64 [[V:%.*]]) {
8383
; CHECK-NEXT: [[CALL:%.*]] = call { ptr, i64 } @foo()
8484
; CHECK-NEXT: [[ELM1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1
@@ -97,4 +97,46 @@ define i64 @test_extract_select_insert(ptr %p1, i64 %v) {
9797
ret i64 %res
9898
}
9999

100+
define i64 @test_extract_select_insert_right(ptr %p1, i64 %v) {
101+
; CHECK-LABEL: define i64 @test_extract_select_insert_right(
102+
; CHECK-SAME: ptr [[P1:%.*]], i64 [[V:%.*]]) {
103+
; CHECK-NEXT: [[CALL:%.*]] = call { ptr, i64 } @foo()
104+
; CHECK-NEXT: [[ELM1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1
105+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[ELM1]], [[V]]
106+
; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1
107+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i64 [[TMP1]], i64 4294967294
108+
; CHECK-NEXT: ret i64 [[RES]]
109+
;
110+
%call = call { ptr, i64 } @foo()
111+
%elm1 = extractvalue { ptr, i64 } %call, 1
112+
%cmp = icmp eq i64 %elm1, %v
113+
%fca0 = insertvalue { ptr, i64 } poison, ptr %p1, 0
114+
%fca1 = insertvalue { ptr, i64 } %fca0, i64 4294967294, 1
115+
%select = select i1 %cmp, { ptr, i64 } %call, { ptr, i64 } %fca1
116+
%res = extractvalue { ptr, i64 } %select, 1
117+
ret i64 %res
118+
}
119+
120+
define i64 @test_extract_select_insert_negative(ptr %p1, i64 %v) {
121+
; CHECK-LABEL: define i64 @test_extract_select_insert_negative(
122+
; CHECK-SAME: ptr [[P1:%.*]], i64 [[V:%.*]]) {
123+
; CHECK-NEXT: [[CALL:%.*]] = call { ptr, i64 } @foo()
124+
; CHECK-NEXT: [[CALL2:%.*]] = call { ptr, i64 } @foo()
125+
; CHECK-NEXT: [[ELM1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1
126+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[ELM1]], [[V]]
127+
; CHECK-NEXT: [[FCA1:%.*]] = insertvalue { ptr, i64 } [[CALL2]], ptr [[P1]], 0
128+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], { ptr, i64 } [[CALL]], { ptr, i64 } [[FCA1]]
129+
; CHECK-NEXT: [[RES:%.*]] = extractvalue { ptr, i64 } [[SELECT]], 1
130+
; CHECK-NEXT: ret i64 [[RES]]
131+
;
132+
%call = call { ptr, i64 } @foo()
133+
%call2 = call { ptr, i64 } @foo()
134+
%elm1 = extractvalue { ptr, i64 } %call, 1
135+
%cmp = icmp eq i64 %elm1, %v
136+
%fca1 = insertvalue { ptr, i64 } %call2, ptr %p1, 0
137+
%select = select i1 %cmp, { ptr, i64 } %call, { ptr, i64 } %fca1
138+
%res = extractvalue { ptr, i64 } %select, 1
139+
ret i64 %res
140+
}
141+
100142
declare { ptr, i64 } @foo()

0 commit comments

Comments
 (0)