@@ -81,3 +81,71 @@ entry:
81
81
}
82
82
83
83
declare 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