| 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 | FileCheck %s | 5 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 | FileCheck %s |
| 6 | 6 |
| 7 declare void @use_value(i32) | 7 declare void @use_value(i32) |
| 8 | 8 |
| 9 ; Basic cmp/branch folding. | 9 ; Basic cmp/branch folding. |
| 10 define i32 @fold_cmp_br(i32 %arg1, i32 %arg2) { | 10 define i32 @fold_cmp_br(i32 %arg1, i32 %arg2) { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 %cmp1 = icmp slt i32 %arg1_trunc, %arg2_trunc | 102 %cmp1 = icmp slt i32 %arg1_trunc, %arg2_trunc |
| 103 %result = select i1 %cmp1, i64 %arg1, i64 %arg2 | 103 %result = select i1 %cmp1, i64 %arg1, i64 %arg2 |
| 104 ret i64 %result | 104 ret i64 %result |
| 105 } | 105 } |
| 106 | 106 |
| 107 ; CHECK-LABEL: fold_cmp_select_64 | 107 ; CHECK-LABEL: fold_cmp_select_64 |
| 108 ; CHECK: cmp | 108 ; CHECK: cmp |
| 109 ; CHECK: cmovl | 109 ; CHECK: cmovl |
| 110 ; CHECK: cmovl | 110 ; CHECK: cmovl |
| 111 | 111 |
| 112 define i64 @fold_cmp_select_64_undef(i64 %arg1) { |
| 113 entry: |
| 114 %arg1_trunc = trunc i64 %arg1 to i32 |
| 115 %cmp1 = icmp slt i32 undef, %arg1_trunc |
| 116 %result = select i1 %cmp1, i64 %arg1, i64 undef |
| 117 ret i64 %result |
| 118 } |
| 119 ; CHECK-LABEL: fold_cmp_select_64_undef |
| 120 ; CHECK: cmp |
| 121 ; CHECK: cmovl |
| 122 ; CHECK: cmovl |
| 112 | 123 |
| 113 ; Cmp/select folding with intervening instructions. | 124 ; Cmp/select folding with intervening instructions. |
| 114 define i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) { | 125 define i32 @fold_cmp_select_intervening_insts(i32 %arg1, i32 %arg2) { |
| 115 entry: | 126 entry: |
| 116 %cmp1 = icmp slt i32 %arg1, %arg2 | 127 %cmp1 = icmp slt i32 %arg1, %arg2 |
| 117 call void @use_value(i32 %arg1) | 128 call void @use_value(i32 %arg1) |
| 118 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 | 129 %result = select i1 %cmp1, i32 %arg1, i32 %arg2 |
| 119 ret i32 %result | 130 ret i32 %result |
| 120 } | 131 } |
| 121 | 132 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 ; CHECK: cmp | 205 ; CHECK: cmp |
| 195 ; CHECK: cmovne | 206 ; CHECK: cmovne |
| 196 ; CHECK: cmp | 207 ; CHECK: cmp |
| 197 ; CHECK: cmovne | 208 ; CHECK: cmovne |
| 198 ; CHECK: cmp | 209 ; CHECK: cmp |
| 199 ; CHECK: cmove | 210 ; CHECK: cmove |
| 200 ; CHECK: movzx | 211 ; CHECK: movzx |
| 201 ; CHECK: add | 212 ; CHECK: add |
| 202 ; CHECK: add | 213 ; CHECK: add |
| 203 ; CHECK: add | 214 ; CHECK: add |
| OLD | NEW |