| OLD | NEW |
| 1 ; This tests the optimization where producers and consumers of i1 (bool) | 1 ; This tests the optimization where producers and consumers of i1 (bool) |
| 2 ; variables are combined to implicitly use flags instead of explicitly using | 2 ; variables are combined to implicitly use flags instead of explicitly using |
| 3 ; stack or register variables. | 3 ; stack or register variables. |
| 4 | 4 |
| 5 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ | 5 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ |
| 6 ; RUN: -allow-externally-defined-symbols | FileCheck %s | 6 ; RUN: -allow-externally-defined-symbols | FileCheck %s |
| 7 | 7 |
| 8 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ | 8 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ |
| 9 ; RUN: --target arm32 -i %s --args -O2 --skip-unimplemented \ | 9 ; RUN: --target arm32 -i %s --args -O2 --skip-unimplemented \ |
| 10 ; RUN: -allow-externally-defined-symbols \ | 10 ; RUN: -allow-externally-defined-symbols \ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 branch1: | 21 branch1: |
| 22 ret i32 1 | 22 ret i32 1 |
| 23 branch2: | 23 branch2: |
| 24 ret i32 2 | 24 ret i32 2 |
| 25 } | 25 } |
| 26 | 26 |
| 27 ; CHECK-LABEL: fold_cmp_br | 27 ; CHECK-LABEL: fold_cmp_br |
| 28 ; CHECK: cmp | 28 ; CHECK: cmp |
| 29 ; CHECK: jge | 29 ; CHECK: jge |
| 30 ; ARM32-LABEL: fold_cmp_br | 30 ; ARM32-LABEL: fold_cmp_br |
| 31 ; ARM32: cmp | 31 ; ARM32: cmp r0, r1 |
| 32 ; ARM32: beq | 32 ; ARM32: bge |
| 33 ; ARM32: mov r0, #1 |
| 34 ; ARM32: bx lr |
| 35 ; ARM32: mov r0, #2 |
| 36 ; ARM32: bx lr |
| 33 | 37 |
| 34 | 38 |
| 35 ; Cmp/branch folding with intervening instructions. | 39 ; Cmp/branch folding with intervening instructions. |
| 36 define internal i32 @fold_cmp_br_intervening_insts(i32 %arg1, i32 %arg2) { | 40 define internal i32 @fold_cmp_br_intervening_insts(i32 %arg1, i32 %arg2) { |
| 37 entry: | 41 entry: |
| 38 %cmp1 = icmp slt i32 %arg1, %arg2 | 42 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 39 call void @use_value(i32 %arg1) | 43 call void @use_value(i32 %arg1) |
| 40 br i1 %cmp1, label %branch1, label %branch2 | 44 br i1 %cmp1, label %branch1, label %branch2 |
| 41 branch1: | 45 branch1: |
| 42 ret i32 1 | 46 ret i32 1 |
| 43 branch2: | 47 branch2: |
| 44 ret i32 2 | 48 ret i32 2 |
| 45 } | 49 } |
| 46 | 50 |
| 47 ; CHECK-LABEL: fold_cmp_br_intervening_insts | 51 ; CHECK-LABEL: fold_cmp_br_intervening_insts |
| 48 ; CHECK-NOT: cmp | 52 ; CHECK-NOT: cmp |
| 49 ; CHECK: call | 53 ; CHECK: call |
| 50 ; CHECK: cmp | 54 ; CHECK: cmp |
| 51 ; CHECK: jge | 55 ; CHECK: jge |
| 52 ; ARM32-LABEL: fold_cmp_br_intervening_insts | 56 ; ARM32-LABEL: fold_cmp_br_intervening_insts |
| 53 ; ARM32: push {{[{].*[}]}} | 57 ; ARM32: push {{[{].*[}]}} |
| 54 ; ARM32: movlt [[TMP:r[0-9]+]], #1 | 58 ; ARM32: bl use_value |
| 55 ; ARM32: mov [[P:r[4-7]]], [[TMP]] | 59 ; ARM32: cmp {{r[0-9]+}}, {{r[0-9]+}} |
| 56 ; ARM32: bl | 60 ; ARM32: bge |
| 57 ; ARM32: cmp [[P]], #0 | 61 ; ARM32: mov r0, #1 |
| 58 ; ARM32: beq | 62 ; ARM32: bx lr |
| 63 ; ARM32: mov r0, #2 |
| 64 ; ARM32: bx lr |
| 59 | 65 |
| 60 | 66 |
| 61 ; Cmp/branch non-folding because of live-out. | 67 ; Cmp/branch non-folding because of live-out. |
| 62 define internal i32 @no_fold_cmp_br_liveout(i32 %arg1, i32 %arg2) { | 68 define internal i32 @no_fold_cmp_br_liveout(i32 %arg1, i32 %arg2) { |
| 63 entry: | 69 entry: |
| 64 %cmp1 = icmp slt i32 %arg1, %arg2 | 70 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 65 br label %next | 71 br label %next |
| 66 next: | 72 next: |
| 67 br i1 %cmp1, label %branch1, label %branch2 | 73 br i1 %cmp1, label %branch1, label %branch2 |
| 68 branch1: | 74 branch1: |
| (...skipping 26 matching lines...) Expand all Loading... |
| 95 ret i32 2 | 101 ret i32 2 |
| 96 } | 102 } |
| 97 | 103 |
| 98 ; CHECK-LABEL: no_fold_cmp_br_non_whitelist | 104 ; CHECK-LABEL: no_fold_cmp_br_non_whitelist |
| 99 ; CHECK: cmp | 105 ; CHECK: cmp |
| 100 ; CHECK: set | 106 ; CHECK: set |
| 101 ; CHECK: movzx | 107 ; CHECK: movzx |
| 102 ; CHECK: cmp | 108 ; CHECK: cmp |
| 103 ; CHECK: je | 109 ; CHECK: je |
| 104 ; ARM32-LABEL: no_fold_cmp_br_non_whitelist | 110 ; ARM32-LABEL: no_fold_cmp_br_non_whitelist |
| 105 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 106 ; ARM32: cmp r0, r1 | 111 ; ARM32: cmp r0, r1 |
| 112 ; ARM32: movge [[R:r[0-9]+]], #0 |
| 107 ; ARM32: movlt [[R]], #1 | 113 ; ARM32: movlt [[R]], #1 |
| 108 ; ARM32: mov [[R2:r[0-9]+]], [[R]] | 114 ; ARM32: cmp r0, r1 |
| 109 ; ARM32: and [[R3:r[0-9]+]], [[R2]], #1 | 115 ; ARM32: bge |
| 110 ; ARM32: cmp [[R]] | 116 ; ARM32: bx lr |
| 111 ; ARM32: beq | 117 ; ARM32: mov r0, #2 |
| 118 ; ARM32: bx lr |
| 112 | 119 |
| 113 | 120 |
| 114 ; Basic cmp/select folding. | 121 ; Basic cmp/select folding. |
| 115 define internal i32 @fold_cmp_select(i32 %arg1, i32 %arg2) { | 122 define internal i32 @fold_cmp_select(i32 %arg1, i32 %arg2) { |
| 116 entry: | 123 entry: |
| 117 %cmp1 = icmp slt i32 %arg1, %arg2 | 124 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 118 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 | 125 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 |
| 119 ret i32 %result | 126 ret i32 %result |
| 120 } | 127 } |
| 121 | 128 |
| 122 ; CHECK-LABEL: fold_cmp_select | 129 ; CHECK-LABEL: fold_cmp_select |
| 123 ; CHECK: cmp | 130 ; CHECK: cmp |
| 124 ; CHECK: cmovl | 131 ; CHECK: cmovl |
| 125 ; ARM32-LABEL: fold_cmp_select | 132 ; ARM32-LABEL: fold_cmp_select |
| 126 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 127 ; ARM32: cmp r0, r1 | 133 ; ARM32: cmp r0, r1 |
| 128 ; ARM32: movlt [[R]], #1 | 134 ; ARM32: movlt {{r[0-9]+}}, r0 |
| 129 ; ARM32: cmp [[R]], #0 | |
| 130 | |
| 131 | 135 |
| 132 ; 64-bit cmp/select folding. | 136 ; 64-bit cmp/select folding. |
| 133 define internal i64 @fold_cmp_select_64(i64 %arg1, i64 %arg2) { | 137 define internal i64 @fold_cmp_select_64(i64 %arg1, i64 %arg2) { |
| 134 entry: | 138 entry: |
| 135 %arg1_trunc = trunc i64 %arg1 to i32 | 139 %arg1_trunc = trunc i64 %arg1 to i32 |
| 136 %arg2_trunc = trunc i64 %arg2 to i32 | 140 %arg2_trunc = trunc i64 %arg2 to i32 |
| 137 %cmp1 = icmp slt i32 %arg1_trunc, %arg2_trunc | 141 %cmp1 = icmp slt i32 %arg1_trunc, %arg2_trunc |
| 138 %result = select i1 %cmp1, i64 %arg1, i64 %arg2 | 142 %result = select i1 %cmp1, i64 %arg1, i64 %arg2 |
| 139 ret i64 %result | 143 ret i64 %result |
| 140 } | 144 } |
| 141 | 145 |
| 142 ; CHECK-LABEL: fold_cmp_select_64 | 146 ; CHECK-LABEL: fold_cmp_select_64 |
| 143 ; CHECK: cmp | 147 ; CHECK: cmp |
| 144 ; CHECK: cmovl | 148 ; CHECK: cmovl |
| 145 ; CHECK: cmovl | 149 ; CHECK: cmovl |
| 146 ; ARM32-LABEL: fold_cmp_select_64 | 150 ; ARM32-LABEL: fold_cmp_select_64 |
| 147 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 148 ; ARM32: cmp r0, r2 | 151 ; ARM32: cmp r0, r2 |
| 149 ; ARM32: movlt [[R]], #1 | 152 ; ARM32: movlt [[LOW:r[0-9]+]], r0 |
| 150 ; ARM32: cmp [[R]], #0 | 153 ; ARM32: movlt [[HIGH:r[0-9]+]], r1 |
| 151 ; ARM32: movne | 154 ; ARM32: mov r0, [[LOW]] |
| 152 ; ARM32: movne | 155 ; ARM32: mov r1, [[HIGH]] |
| 153 ; ARM32-DAG: mov r0 | |
| 154 ; ARM32-DAG: mov r1 | |
| 155 ; ARM32: bx lr | 156 ; ARM32: bx lr |
| 156 | 157 |
| 157 | 158 |
| 158 define internal i64 @fold_cmp_select_64_undef(i64 %arg1) { | 159 define internal i64 @fold_cmp_select_64_undef(i64 %arg1) { |
| 159 entry: | 160 entry: |
| 160 %arg1_trunc = trunc i64 %arg1 to i32 | 161 %arg1_trunc = trunc i64 %arg1 to i32 |
| 161 %cmp1 = icmp slt i32 undef, %arg1_trunc | 162 %cmp1 = icmp slt i32 undef, %arg1_trunc |
| 162 %result = select i1 %cmp1, i64 %arg1, i64 undef | 163 %result = select i1 %cmp1, i64 %arg1, i64 undef |
| 163 ret i64 %result | 164 ret i64 %result |
| 164 } | 165 } |
| 165 ; CHECK-LABEL: fold_cmp_select_64_undef | 166 ; CHECK-LABEL: fold_cmp_select_64_undef |
| 166 ; CHECK: cmp | 167 ; CHECK: cmp |
| 167 ; CHECK: cmovl | 168 ; CHECK: cmovl |
| 168 ; CHECK: cmovl | 169 ; CHECK: cmovl |
| 169 ; ARM32-LABEL: fold_cmp_select_64_undef | 170 ; ARM32-LABEL: fold_cmp_select_64_undef |
| 170 ; ARM32: cmp {{r[0-9]+}}, r0 | 171 ; ARM32: cmp {{r[0-9]+}}, r0 |
| 171 ; ARM32: movlt [[R:r[0-9]+]], #1 | 172 ; ARM32: movge |
| 172 ; ARM32: cmp [[R]] | 173 ; ARM32: movlt |
| 173 ; ARM32: movne | 174 ; ARM32: movge |
| 174 ; ARM32: movne | 175 ; ARM32: movlt |
| 175 ; ARM32-DAG: mov r0 | |
| 176 ; ARM32-DAG: mov r1 | |
| 177 ; ARM32: bx lr | 176 ; ARM32: bx lr |
| 178 | 177 |
| 179 | 178 |
| 180 ; Cmp/select folding with intervening instructions. | 179 ; Cmp/select folding with intervening instructions. |
| 181 define internal i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) { | 180 define internal i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) { |
| 182 entry: | 181 entry: |
| 183 %cmp1 = icmp slt i32 %arg1, %arg2 | 182 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 184 call void @use_value(i32 %arg1) | 183 call void @use_value(i32 %arg1) |
| 185 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 | 184 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 |
| 186 ret i32 %result | 185 ret i32 %result |
| 187 } | 186 } |
| 188 | 187 |
| 189 ; CHECK-LABEL: fold_cmp_select_intervening_insts | 188 ; CHECK-LABEL: fold_cmp_select_intervening_insts |
| 190 ; CHECK-NOT: cmp | 189 ; CHECK-NOT: cmp |
| 191 ; CHECK: call | 190 ; CHECK: call |
| 192 ; CHECK: cmp | 191 ; CHECK: cmp |
| 193 ; CHECK: cmovl | 192 ; CHECK: cmovl |
| 194 ; ARM32-LABEL: fold_cmp_select_intervening_insts | 193 ; ARM32-LABEL: fold_cmp_select_intervening_insts |
| 195 ; ARM32: mov [[RES0:r[4-7]+]], r0 | 194 ; ARM32: bl use_value |
| 196 ; ARM32: mov [[RES1:r[4-7]+]], r1 | |
| 197 ; ARM32: mov [[R:r[0-9]+]], #0 | |
| 198 ; ARM32: cmp r{{[0-9]+}}, r{{[0-9]+}} | 195 ; ARM32: cmp r{{[0-9]+}}, r{{[0-9]+}} |
| 199 ; ARM32: movlt [[R]], #1 | 196 ; ARM32: movlt |
| 200 ; ARM32: mov [[R2:r[4-7]]], [[R]] | 197 ; ARM32: bx lr |
| 201 ; ARM32: bl use_value | |
| 202 ; ARM32: cmp [[R2]], #0 | |
| 203 ; ARM32: movne [[RES1]], [[RES0]] | |
| 204 ; ARM32: mov r0, [[RES1]] | |
| 205 | |
| 206 | 198 |
| 207 ; Cmp/multi-select folding. | 199 ; Cmp/multi-select folding. |
| 208 define internal i32 @fold_cmp_select_multi(i32 %arg1, i32 %arg2) { | 200 define internal i32 @fold_cmp_select_multi(i32 %arg1, i32 %arg2) { |
| 209 entry: | 201 entry: |
| 210 %cmp1 = icmp slt i32 %arg1, %arg2 | 202 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 211 %a = select i1 %cmp1, i32 %arg1, i32 %arg2 | 203 %a = select i1 %cmp1, i32 %arg1, i32 %arg2 |
| 212 %b = select i1 %cmp1, i32 %arg2, i32 %arg1 | 204 %b = select i1 %cmp1, i32 %arg2, i32 %arg1 |
| 213 %c = select i1 %cmp1, i32 123, i32 %arg1 | 205 %c = select i1 %cmp1, i32 123, i32 %arg1 |
| 214 %partial = add i32 %a, %b | 206 %partial = add i32 %a, %b |
| 215 %result = add i32 %partial, %c | 207 %result = add i32 %partial, %c |
| 216 ret i32 %result | 208 ret i32 %result |
| 217 } | 209 } |
| 218 | 210 |
| 219 ; CHECK-LABEL: fold_cmp_select_multi | 211 ; CHECK-LABEL: fold_cmp_select_multi |
| 220 ; CHECK: cmp | 212 ; CHECK: cmp |
| 221 ; CHECK: cmovl | 213 ; CHECK: cmovl |
| 222 ; CHECK: cmp | 214 ; CHECK: cmp |
| 223 ; CHECK: cmovl | 215 ; CHECK: cmovl |
| 224 ; CHECK: cmp | 216 ; CHECK: cmp |
| 225 ; CHECK: cmovge | 217 ; CHECK: cmovge |
| 226 ; CHECK: add | 218 ; CHECK: add |
| 227 ; CHECK: add | 219 ; CHECK: add |
| 228 ; ARM32-LABEL: fold_cmp_select_multi | 220 ; ARM32-LABEL: fold_cmp_select_multi |
| 229 ; ARM32: mov [[T0:r[0-9]+]], #0 | |
| 230 ; ARM32: cmp r0, r1 | 221 ; ARM32: cmp r0, r1 |
| 231 ; ARM32: movlt [[T0]], #1 | 222 ; ARM32: movlt {{r[0-9]+}}, r0 |
| 232 ; ARM32: uxtb [[T1:r[0-9]+]], [[T1]] | 223 ; ARM32: cmp r0, r1 |
| 233 ; ARM32-NEXT: cmp [[T1]], #0 | 224 ; ARM32: movlt {{r[0-9]+}}, r1 |
| 234 ; ARM32: movne [[T2:r[0-9]+]], r0 | 225 ; ARM32: cmp r0, r1 |
| 235 ; ARM32: uxtb [[T3:r[0-9]+]], [[T3]] | 226 ; ARM32: movlt {{r[0-9]+}}, #123 |
| 236 ; ARM32-NEXT: cmp [[T3]], #0 | 227 ; ARM32: add |
| 237 ; ARM32: movne [[T4:r[0-9]+]], r1 | 228 ; ARM32: add |
| 238 ; ARM32: uxtb [[T5:r[0-9]+]], [[T5]] | |
| 239 ; ARM32-NEXT: cmp [[T5]], #0 | |
| 240 ; ARM32: movne [[T6:r[0-9]+]], #123 | |
| 241 ; ARM32: add [[T7:r[0-9]+]], [[T2]], [[T4]] | |
| 242 ; ARM32: add {{r[0-9]+}}, [[T7]], [[T6]] | |
| 243 ; ARM32: bx lr | 229 ; ARM32: bx lr |
| 244 | 230 |
| 245 | 231 |
| 246 ; Cmp/multi-select non-folding because of live-out. | 232 ; Cmp/multi-select non-folding because of live-out. |
| 247 define internal i32 @no_fold_cmp_select_multi_liveout(i32 %arg1, i32 %arg2) { | 233 define internal i32 @no_fold_cmp_select_multi_liveout(i32 %arg1, i32 %arg2) { |
| 248 entry: | 234 entry: |
| 249 %cmp1 = icmp slt i32 %arg1, %arg2 | 235 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 250 %a = select i1 %cmp1, i32 %arg1, i32 %arg2 | 236 %a = select i1 %cmp1, i32 %arg1, i32 %arg2 |
| 251 %b = select i1 %cmp1, i32 %arg2, i32 %arg1 | 237 %b = select i1 %cmp1, i32 %arg2, i32 %arg1 |
| 252 br label %next | 238 br label %next |
| 253 next: | 239 next: |
| 254 %c = select i1 %cmp1, i32 123, i32 %arg1 | 240 %c = select i1 %cmp1, i32 123, i32 %arg1 |
| 255 %partial = add i32 %a, %b | 241 %partial = add i32 %a, %b |
| 256 %result = add i32 %partial, %c | 242 %result = add i32 %partial, %c |
| 257 ret i32 %result | 243 ret i32 %result |
| 258 } | 244 } |
| 259 | 245 |
| 260 ; CHECK-LABEL: no_fold_cmp_select_multi_liveout | 246 ; CHECK-LABEL: no_fold_cmp_select_multi_liveout |
| 261 ; CHECK: set | 247 ; CHECK: set |
| 262 ; CHECK: cmp | 248 ; CHECK: cmp |
| 263 ; CHECK: cmovne | 249 ; CHECK: cmovne |
| 264 ; CHECK: cmp | 250 ; CHECK: cmp |
| 265 ; CHECK: cmovne | 251 ; CHECK: cmovne |
| 266 ; CHECK: cmp | 252 ; CHECK: cmp |
| 267 ; CHECK: cmove | 253 ; CHECK: cmove |
| 268 ; CHECK: add | 254 ; CHECK: add |
| 269 ; CHECK: add | 255 ; CHECK: add |
| 270 ; ARM32-LABEL: no_fold_cmp_select_multi_liveout | 256 ; ARM32-LABEL: no_fold_cmp_select_multi_liveout |
| 271 ; ARM32-LABEL: fold_cmp_select_multi | 257 ; ARM32-LABEL: fold_cmp_select_multi |
| 272 ; ARM32: mov [[T0:r[0-9]+]], #0 | |
| 273 ; ARM32: cmp r0, r1 | 258 ; ARM32: cmp r0, r1 |
| 259 ; ARM32: movge [[T0:r[0-9]+]], #0 |
| 274 ; ARM32: movlt [[T0]], #1 | 260 ; ARM32: movlt [[T0]], #1 |
| 275 ; ARM32: uxtb [[T2:r[0-9]+]], [[T2]] | 261 ; ARM32: uxtb [[T1:r[0-9]+]], [[T1]] |
| 276 ; ARM32-NEXT: cmp [[T2]], #0 | 262 ; ARM32-NEXT: cmp [[T1]], #0 |
| 277 ; ARM32: movne [[T1]], r0 | 263 ; ARM32: movne [[T2:r[0-9]+]], r0 |
| 278 ; ARM32: uxtb [[T4:r[0-9]+]], [[T4]] | 264 ; ARM32: uxtb [[T3:r[0-9]+]], [[T3]] |
| 279 ; ARM32-NEXT: cmp [[T4]], #0 | 265 ; ARM32-NEXT: cmp [[T3]], #0 |
| 280 ; ARM32: movne [[T3]], r1 | 266 ; ARM32: movne [[T4:r[0-9]+]], r1 |
| 281 ; ARM32-LABEL: .Lno_fold_cmp_select_multi_liveout$next: | 267 ; ARM32-LABEL: .Lno_fold_cmp_select_multi_liveout$next: |
| 282 ; ARM32: uxtb [[T5:r[0-9]+]], [[T5]] | 268 ; ARM32: uxtb [[T5:r[0-9]+]], [[T5]] |
| 283 ; ARM32: cmp [[T5]], #0 | 269 ; ARM32: cmp [[T5]], #0 |
| 284 ; ARM32: movne [[T6:r[0-9]+]], #123 | 270 ; ARM32: movne [[T6:r[0-9]+]], #123 |
| 285 ; ARM32: add [[T7:r[0-9]+]], [[T2]], [[T4]] | 271 ; ARM32: add |
| 286 ; ARM32: add {{r[0-9]+}}, [[T7]], [[T6]] | 272 ; ARM32: add |
| 287 ; ARM32: bx lr | 273 ; ARM32: bx lr |
| 288 | 274 |
| 289 ; Cmp/multi-select non-folding because of extra non-whitelisted uses. | 275 ; Cmp/multi-select non-folding because of extra non-whitelisted uses. |
| 290 define internal i32 @no_fold_cmp_select_multi_non_whitelist(i32 %arg1, | 276 define internal i32 @no_fold_cmp_select_multi_non_whitelist(i32 %arg1, |
| 291 i32 %arg2) { | 277 i32 %arg2) { |
| 292 entry: | 278 entry: |
| 293 %cmp1 = icmp slt i32 %arg1, %arg2 | 279 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 294 %a = select i1 %cmp1, i32 %arg1, i32 %arg2 | 280 %a = select i1 %cmp1, i32 %arg1, i32 %arg2 |
| 295 %b = select i1 %cmp1, i32 %arg2, i32 %arg1 | 281 %b = select i1 %cmp1, i32 %arg2, i32 %arg1 |
| 296 %c = select i1 %cmp1, i32 123, i32 %arg1 | 282 %c = select i1 %cmp1, i32 123, i32 %arg1 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 307 ; CHECK: cmovne | 293 ; CHECK: cmovne |
| 308 ; CHECK: cmp | 294 ; CHECK: cmp |
| 309 ; CHECK: cmovne | 295 ; CHECK: cmovne |
| 310 ; CHECK: cmp | 296 ; CHECK: cmp |
| 311 ; CHECK: cmove | 297 ; CHECK: cmove |
| 312 ; CHECK: movzx | 298 ; CHECK: movzx |
| 313 ; CHECK: add | 299 ; CHECK: add |
| 314 ; CHECK: add | 300 ; CHECK: add |
| 315 ; CHECK: add | 301 ; CHECK: add |
| 316 ; ARM32-LABEL: no_fold_cmp_select_multi_non_whitelist | 302 ; ARM32-LABEL: no_fold_cmp_select_multi_non_whitelist |
| 317 ; ARM32: mov [[T0:r[0-9]+]], #0 | |
| 318 ; ARM32: cmp r0, r1 | 303 ; ARM32: cmp r0, r1 |
| 319 ; ARM32: movlt [[T0]], #1 | 304 ; ARM32: movge [[R0:r[0-9]+]] |
| 320 ; ARM32: uxtb [[T1:r[0-9]+]], [[T1]] | 305 ; ARM32: movlt [[R0]] |
| 321 ; ARM32-NEXT: cmp [[T1]], #0 | 306 ; ARM32: cmp r0, r1 |
| 322 ; ARM32: movne [[T2:r[0-9]+]], r0 | 307 ; ARM32: movge [[R1:r[0-9]+]] |
| 323 ; ARM32: uxtb [[T3:r[0-9]+]], [[T3]] | 308 ; ARM32: movlt [[R1]] |
| 324 ; ARM32-NEXT: cmp [[T3]], #0 | 309 ; ARM32: cmp r0, r1 |
| 325 ; ARM32: movne [[T4:r[0-9]+]], r1 | 310 ; ARM32: movge [[R2:r[0-9]+]] |
| 326 ; ARM32: uxtb [[T5:r[0-9]+]], [[T5]] | 311 ; ARM32: movlt [[R2]] |
| 327 ; ARM32-NEXT: cmp [[T5]], #0 | 312 ; ARM32: cmp r0, r1 |
| 328 ; ARM32: movne [[T6:r[0-9]+]], #123 | 313 ; ARM32: movge [[R3:r[0-9]+]] |
| 329 ; ARM32: and [[T7:r[0-9]+]], [[T0]], #1 | 314 ; ARM32: movlt [[R3]] |
| 330 ; ARM32: add [[T8:r[0-9]+]], [[T2]], [[T4]] | 315 ; ARM32: add |
| 331 ; ARM32: add {{r[0-9]+}}, [[T8]], [[T7]] | 316 ; ARM32: add |
| 317 ; ARM32: add |
| 332 ; ARM32: bx lr | 318 ; ARM32: bx lr |
| OLD | NEW |