7777
7878declare 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+
100142declare { ptr , i64 } @foo ()
0 commit comments