1 ; Simple test of non-fused compare/branch. 2 3 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \ 4 ; RUN: -allow-externally-defined-symbols | FileCheck %s 5 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ 6 ; RUN: -allow-externally-defined-symbols | FileCheck --check-prefix=OPTM1 %s 7 8 define internal void @icmpEqZero64() { 9 entry: 10 %cmp = icmp eq i64 123, 0 11 br i1 %cmp, label %if.then, label %if.end 12 13 if.then: ; preds = %entry 14 call void @func() 15 br label %if.end 16 17 if.end: ; preds = %if.then, %if.end 18 ret void 19 } 20 ; The following checks are not strictly necessary since one of the RUN 21 ; lines actually runs the output through the assembler. 22 ; CHECK-LABEL: icmpEqZero64 23 ; CHECK: or 24 ; CHECK-NOT: set 25 ; OPTM1-LABEL: icmpEqZero64 26 ; OPTM1: or 27 ; OPTM1-NEXT: sete 28 29 define internal void @icmpNeZero64() { 30 entry: 31 %cmp = icmp ne i64 123, 0 32 br i1 %cmp, label %if.then, label %if.end 33 34 if.then: ; preds = %entry 35 call void @func() 36 br label %if.end 37 38 if.end: ; preds = %if.then, %if.end 39 ret void 40 } 41 ; The following checks are not strictly necessary since one of the RUN 42 ; lines actually runs the output through the assembler. 43 ; CHECK-LABEL: icmpNeZero64 44 ; CHECK: or 45 ; CHECK-NOT: set 46 ; OPTM1-LABEL: icmpNeZero64 47 ; OPTM1: or 48 ; OPTM1-NEXT: setne 49 50 define internal void @icmpSgeZero64() { 51 entry: 52 %cmp = icmp sge i64 123, 0 53 br i1 %cmp, label %if.then, label %if.end 54 55 if.then: ; preds = %entry 56 call void @func() 57 br label %if.end 58 59 if.end: ; preds = %if.then, %if.end 60 ret void 61 } 62 ; The following checks are not strictly necessary since one of the RUN 63 ; lines actually runs the output through the assembler. 64 ; CHECK-LABEL: icmpSgeZero64 65 ; CHECK: test eax,0x80000000 66 ; CHECK-NOT: sete 67 ; OPTM1-LABEL: icmpSgeZero64 68 ; OPTM1: test eax,0x80000000 69 ; OPTM1-NEXT: sete 70 71 define internal void @icmpSltZero64() { 72 entry: 73 %cmp = icmp slt i64 123, 0 74 br i1 %cmp, label %if.then, label %if.end 75 76 if.then: ; preds = %entry 77 call void @func() 78 br label %if.end 79 80 if.end: ; preds = %if.then, %if.end 81 ret void 82 } 83 ; The following checks are not strictly necessary since one of the RUN 84 ; lines actually runs the output through the assembler. 85 ; CHECK-LABEL: icmpSltZero64 86 ; CHECK: test eax,0x80000000 87 ; CHECK-NOT: setne 88 ; OPTM1-LABEL: icmpSltZero64 89 ; OPTM1: test eax,0x80000000 90 ; OPTM1-NEXT: setne 91 92 define internal void @icmpUltZero64() { 93 entry: 94 %cmp = icmp ult i64 123, 0 95 br i1 %cmp, label %if.then, label %if.end 96 97 if.then: ; preds = %entry 98 call void @func() 99 br label %if.end 100 101 if.end: ; preds = %if.then, %if.end 102 ret void 103 } 104 ; The following checks are not strictly necessary since one of the RUN 105 ; lines actually runs the output through the assembler. 106 ; CHECK-LABEL: icmpUltZero64 107 ; CHECK: mov [[RESULT:.*]],0x0 108 ; CHECK-NEXT: cmp [[RESULT]],0x0 109 ; OPTM1-LABEL: icmpUltZero64 110 ; OPTM1: mov [[RESULT:.*]],0x0 111 ; OPTM1-NEXT: cmp [[RESULT]],0x0 112 113 define internal void @icmpUgeZero64() { 114 entry: 115 %cmp = icmp uge i64 123, 0 116 br i1 %cmp, label %if.then, label %if.end 117 118 if.then: ; preds = %entry 119 call void @func() 120 br label %if.end 121 122 if.end: ; preds = %if.then, %if.end 123 ret void 124 } 125 ; The following checks are not strictly necessary since one of the RUN 126 ; lines actually runs the output through the assembler. 127 ; CHECK-LABEL: icmpUgeZero64 128 ; CHECK: mov [[RESULT:.*]],0x1 129 ; CHECK-NEXT: cmp [[RESULT]],0x0 130 ; OPTM1-LABEL: icmpUgeZero64 131 ; OPTM1: mov [[RESULT:.*]],0x1 132 ; OPTM1-NEXT: cmp [[RESULT]],0x0 133 134 define internal void @icmpUltZero32() { 135 entry: 136 %cmp = icmp ult i32 123, 0 137 br i1 %cmp, label %if.then, label %if.end 138 139 if.then: ; preds = %entry 140 %cmp_ext = zext i1 %cmp to i32 141 call void @use(i32 %cmp_ext) 142 br label %if.end 143 144 if.end: ; preds = %if.then, %if.end 145 ret void 146 } 147 ; The following checks are not strictly necessary since one of the RUN 148 ; lines actually runs the output through the assembler. 149 ; CHECK-LABEL: icmpUltZero32 150 ; CHECK: mov [[RESULT:.*]],0x0 151 ; CHECK-NEXT: cmp [[RESULT]],0x0 152 ; OPTM1-LABEL: icmpUltZero32 153 ; OPTM1: mov [[RESULT:.*]],0x0 154 ; OPTM1: cmp [[RESULT]],0x0 155 156 define internal void @icmpUgeZero32() { 157 entry: 158 %cmp = icmp uge i32 123, 0 159 br i1 %cmp, label %if.then, label %if.end 160 161 if.then: ; preds = %entry 162 %cmp_ext = zext i1 %cmp to i32 163 call void @use(i32 %cmp_ext) 164 br label %if.end 165 166 if.end: ; preds = %if.then, %if.end 167 ret void 168 } 169 ; The following checks are not strictly necessary since one of the RUN 170 ; lines actually runs the output through the assembler. 171 ; CHECK-LABEL: icmpUgeZero32 172 ; CHECK: mov [[RESULT:.*]],0x1 173 ; CHECK-NEXT: cmp [[RESULT]],0x0 174 ; OPTM1-LABEL: icmpUgeZero32 175 ; OPTM1: mov [[RESULT:.*]],0x1 176 ; OPTM1-NEXT: cmp [[RESULT]],0x0 177 178 define internal void @icmpUltZero16() { 179 entry: 180 %cmp = icmp ult i16 123, 0 181 br i1 %cmp, label %if.then, label %if.end 182 183 if.then: ; preds = %entry 184 %cmp_ext = zext i1 %cmp to i32 185 call void @use(i32 %cmp_ext) 186 br label %if.end 187 188 if.end: ; preds = %if.then, %if.end 189 ret void 190 } 191 ; The following checks are not strictly necessary since one of the RUN 192 ; lines actually runs the output through the assembler. 193 ; CHECK-LABEL: icmpUltZero16 194 ; CHECK: mov [[RESULT:.*]],0x0 195 ; CHECK-NEXT: cmp [[RESULT]],0x0 196 ; OPTM1-LABEL: icmpUltZero16 197 ; OPTM1: mov [[RESULT:.*]],0x0 198 ; OPTM1-NEXT: cmp [[RESULT]],0x0 199 200 define internal void @icmpUgeZero16() { 201 entry: 202 %cmp = icmp uge i16 123, 0 203 br i1 %cmp, label %if.then, label %if.end 204 205 if.then: ; preds = %entry 206 %cmp_ext = zext i1 %cmp to i32 207 call void @use(i32 %cmp_ext) 208 br label %if.end 209 210 if.end: ; preds = %if.then, %if.end 211 ret void 212 } 213 ; The following checks are not strictly necessary since one of the RUN 214 ; lines actually runs the output through the assembler. 215 ; CHECK-LABEL: icmpUgeZero16 216 ; CHECK: mov [[RESULT:.*]],0x1 217 ; CHECK-NEXT: cmp [[RESULT]],0x0 218 ; OPTM1-LABEL: icmpUgeZero16 219 ; OPTM1: mov [[RESULT:.*]],0x1 220 ; OPTM1-NEXT: cmp [[RESULT]],0x0 221 222 define internal void @icmpUltZero8() { 223 entry: 224 %cmp = icmp ult i8 123, 0 225 br i1 %cmp, label %if.then, label %if.end 226 227 if.then: ; preds = %entry 228 %cmp_ext = zext i1 %cmp to i32 229 call void @use(i32 %cmp_ext) 230 br label %if.end 231 232 if.end: ; preds = %if.then, %if.end 233 ret void 234 } 235 ; The following checks are not strictly necessary since one of the RUN 236 ; lines actually runs the output through the assembler. 237 ; CHECK-LABEL: icmpUltZero8 238 ; CHECK: mov [[RESULT:.*]],0x0 239 ; CHECK-NEXT: cmp [[RESULT]],0x0 240 ; OPTM1-LABEL: icmpUltZero8 241 ; OPTM1: mov [[RESULT:.*]],0x0 242 ; OPTM1-NEXT: cmp [[RESULT]],0x0 243 244 define internal void @icmpUgeZero8() { 245 entry: 246 %cmp = icmp uge i8 123, 0 247 br i1 %cmp, label %if.then, label %if.end 248 249 if.then: ; preds = %entry 250 %cmp_ext = zext i1 %cmp to i32 251 call void @use(i32 %cmp_ext) 252 br label %if.end 253 254 if.end: ; preds = %if.then, %if.end 255 ret void 256 } 257 ; The following checks are not strictly necessary since one of the RUN 258 ; lines actually runs the output through the assembler. 259 ; CHECK-LABEL: icmpUgeZero8 260 ; CHECK: mov [[RESULT:.*]],0x1 261 ; CHECK-NEXT: cmp [[RESULT]],0x0 262 ; OPTM1-LABEL: icmpUgeZero8 263 ; OPTM1: mov [[RESULT:.*]],0x1 264 ; OPTM1-NEXT: cmp [[RESULT]],0x0 265 266 declare void @func() 267 declare void @use(i32) 268