@@ -81,3 +81,71 @@ entry:
8181}
8282
8383declare void @use (i64 )
84+
85+ define i64 @test_extract_select_insert_left (ptr %p1 , i64 %v ) {
86+ ; CHECK-LABEL: define i64 @test_extract_select_insert_left(
87+ ; CHECK-SAME: ptr [[P1:%.*]], i64 [[V:%.*]]) {
88+ ; CHECK-NEXT: [[CALL:%.*]] = call { ptr, i64 } @foo()
89+ ; CHECK-NEXT: [[ELM1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1
90+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[ELM1]], [[V]]
91+ ; CHECK-NEXT: [[FCA0:%.*]] = insertvalue { ptr, i64 } poison, ptr [[P1]], 0
92+ ; CHECK-NEXT: [[FCA1:%.*]] = insertvalue { ptr, i64 } [[FCA0]], i64 4294967294, 1
93+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], { ptr, i64 } [[FCA1]], { ptr, i64 } [[CALL]]
94+ ; CHECK-NEXT: [[RES:%.*]] = extractvalue { ptr, i64 } [[SELECT]], 1
95+ ; CHECK-NEXT: ret i64 [[RES]]
96+ ;
97+ %call = call { ptr , i64 } @foo ()
98+ %elm1 = extractvalue { ptr , i64 } %call , 1
99+ %cmp = icmp eq i64 %elm1 , %v
100+ %fca0 = insertvalue { ptr , i64 } poison, ptr %p1 , 0
101+ %fca1 = insertvalue { ptr , i64 } %fca0 , i64 4294967294 , 1
102+ %select = select i1 %cmp , { ptr , i64 } %fca1 , { ptr , i64 } %call
103+ %res = extractvalue { ptr , i64 } %select , 1
104+ ret i64 %res
105+ }
106+
107+ define i64 @test_extract_select_insert_right (ptr %p1 , i64 %v ) {
108+ ; CHECK-LABEL: define i64 @test_extract_select_insert_right(
109+ ; CHECK-SAME: ptr [[P1:%.*]], i64 [[V:%.*]]) {
110+ ; CHECK-NEXT: [[CALL:%.*]] = call { ptr, i64 } @foo()
111+ ; CHECK-NEXT: [[ELM1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1
112+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[ELM1]], [[V]]
113+ ; CHECK-NEXT: [[FCA0:%.*]] = insertvalue { ptr, i64 } poison, ptr [[P1]], 0
114+ ; CHECK-NEXT: [[FCA1:%.*]] = insertvalue { ptr, i64 } [[FCA0]], i64 4294967294, 1
115+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], { ptr, i64 } [[CALL]], { ptr, i64 } [[FCA1]]
116+ ; CHECK-NEXT: [[RES:%.*]] = extractvalue { ptr, i64 } [[SELECT]], 1
117+ ; CHECK-NEXT: ret i64 [[RES]]
118+ ;
119+ %call = call { ptr , i64 } @foo ()
120+ %elm1 = extractvalue { ptr , i64 } %call , 1
121+ %cmp = icmp eq i64 %elm1 , %v
122+ %fca0 = insertvalue { ptr , i64 } poison, ptr %p1 , 0
123+ %fca1 = insertvalue { ptr , i64 } %fca0 , i64 4294967294 , 1
124+ %select = select i1 %cmp , { ptr , i64 } %call , { ptr , i64 } %fca1
125+ %res = extractvalue { ptr , i64 } %select , 1
126+ ret i64 %res
127+ }
128+
129+ define i64 @test_extract_select_insert_negative (ptr %p1 , i64 %v ) {
130+ ; CHECK-LABEL: define i64 @test_extract_select_insert_negative(
131+ ; CHECK-SAME: ptr [[P1:%.*]], i64 [[V:%.*]]) {
132+ ; CHECK-NEXT: [[CALL:%.*]] = call { ptr, i64 } @foo()
133+ ; CHECK-NEXT: [[CALL2:%.*]] = call { ptr, i64 } @foo()
134+ ; CHECK-NEXT: [[ELM1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1
135+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[ELM1]], [[V]]
136+ ; CHECK-NEXT: [[FCA1:%.*]] = insertvalue { ptr, i64 } [[CALL2]], ptr [[P1]], 0
137+ ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], { ptr, i64 } [[CALL]], { ptr, i64 } [[FCA1]]
138+ ; CHECK-NEXT: [[RES:%.*]] = extractvalue { ptr, i64 } [[SELECT]], 1
139+ ; CHECK-NEXT: ret i64 [[RES]]
140+ ;
141+ %call = call { ptr , i64 } @foo ()
142+ %call2 = call { ptr , i64 } @foo ()
143+ %elm1 = extractvalue { ptr , i64 } %call , 1
144+ %cmp = icmp eq i64 %elm1 , %v
145+ %fca1 = insertvalue { ptr , i64 } %call2 , ptr %p1 , 0
146+ %select = select i1 %cmp , { ptr , i64 } %call , { ptr , i64 } %fca1
147+ %res = extractvalue { ptr , i64 } %select , 1
148+ ret i64 %res
149+ }
150+
151+ declare { ptr , i64 } @foo ()
0 commit comments