1 ; RUN: opt < %s -instcombine -S | FileCheck %s 2 3 ; CHECK-LABEL: test1 4 ; CHECK: ret i1 true 5 define i1 @test1(i8 %A) { 6 %B = sitofp i8 %A to double 7 %C = fcmp ult double %B, 128.0 8 ret i1 %C 9 } 10 11 ; CHECK-LABEL: test2 12 ; CHECK: ret i1 true 13 define i1 @test2(i8 %A) { 14 %B = sitofp i8 %A to double 15 %C = fcmp ugt double %B, -128.1 16 ret i1 %C 17 } 18 19 ; CHECK-LABEL: test3 20 ; CHECK: ret i1 true 21 define i1 @test3(i8 %A) { 22 %B = sitofp i8 %A to double 23 %C = fcmp ule double %B, 127.0 24 ret i1 %C 25 } 26 27 ; CHECK-LABEL: test4 28 ; CHECK: icmp ne i8 %A, 127 29 ; CHECK-NEXT: ret i1 30 define i1 @test4(i8 %A) { 31 %B = sitofp i8 %A to double 32 %C = fcmp ult double %B, 127.0 33 ret i1 %C 34 } 35 36 ; CHECK-LABEL: test5 37 ; CHECK: ret i32 38 define i32 @test5(i32 %A) { 39 %B = sitofp i32 %A to double 40 %C = fptosi double %B to i32 41 %D = uitofp i32 %C to double 42 %E = fptoui double %D to i32 43 ret i32 %E 44 } 45 46 ; CHECK-LABEL: test6 47 ; CHECK: and i32 %A, 39 48 ; CHECK-NEXT: ret i32 49 define i32 @test6(i32 %A) { 50 %B = and i32 %A, 7 51 %C = and i32 %A, 32 52 %D = sitofp i32 %B to double 53 %E = sitofp i32 %C to double 54 %F = fadd double %D, %E 55 %G = fptosi double %F to i32 56 ret i32 %G 57 } 58 59 ; CHECK-LABEL: test7 60 ; CHECK: ret i32 61 define i32 @test7(i32 %A) nounwind { 62 %B = sitofp i32 %A to double 63 %C = fptoui double %B to i32 64 ret i32 %C 65 } 66 67 ; CHECK-LABEL: test8 68 ; CHECK: ret i32 69 define i32 @test8(i32 %A) nounwind { 70 %B = uitofp i32 %A to double 71 %C = fptosi double %B to i32 72 ret i32 %C 73 } 74 75 ; CHECK-LABEL: test9 76 ; CHECK: zext i8 77 ; CHECK-NEXT: ret i32 78 define i32 @test9(i8 %A) nounwind { 79 %B = sitofp i8 %A to float 80 %C = fptoui float %B to i32 81 ret i32 %C 82 } 83 84 ; CHECK-LABEL: test10 85 ; CHECK: sext i8 86 ; CHECK-NEXT: ret i32 87 define i32 @test10(i8 %A) nounwind { 88 %B = sitofp i8 %A to float 89 %C = fptosi float %B to i32 90 ret i32 %C 91 } 92 93 ; If the input value is outside of the range of the output cast, it's 94 ; undefined behavior, so we can assume it fits. 95 ; CHECK-LABEL: test11 96 ; CHECK: trunc 97 ; CHECK-NEXT: ret i8 98 define i8 @test11(i32 %A) nounwind { 99 %B = sitofp i32 %A to float 100 %C = fptosi float %B to i8 101 ret i8 %C 102 } 103 104 ; If the input value is negative, it'll be outside the range of the 105 ; output cast, and thus undefined behavior. 106 ; CHECK-LABEL: test12 107 ; CHECK: zext i8 108 ; CHECK-NEXT: ret i32 109 define i32 @test12(i8 %A) nounwind { 110 %B = sitofp i8 %A to float 111 %C = fptoui float %B to i32 112 ret i32 %C 113 } 114 115 ; This can't fold because the 25-bit input doesn't fit in the mantissa. 116 ; CHECK-LABEL: test13 117 ; CHECK: uitofp 118 ; CHECK-NEXT: fptoui 119 define i32 @test13(i25 %A) nounwind { 120 %B = uitofp i25 %A to float 121 %C = fptoui float %B to i32 122 ret i32 %C 123 } 124 125 ; But this one can. 126 ; CHECK-LABEL: test14 127 ; CHECK: zext i24 128 ; CHECK-NEXT: ret i32 129 define i32 @test14(i24 %A) nounwind { 130 %B = uitofp i24 %A to float 131 %C = fptoui float %B to i32 132 ret i32 %C 133 } 134 135 ; And this one can too. 136 ; CHECK-LABEL: test15 137 ; CHECK: trunc i32 138 ; CHECK-NEXT: ret i24 139 define i24 @test15(i32 %A) nounwind { 140 %B = uitofp i32 %A to float 141 %C = fptoui float %B to i24 142 ret i24 %C 143 } 144 145 ; This can fold because the 25-bit input is signed and we disard the sign bit. 146 ; CHECK-LABEL: test16 147 ; CHECK: zext 148 define i32 @test16(i25 %A) nounwind { 149 %B = sitofp i25 %A to float 150 %C = fptoui float %B to i32 151 ret i32 %C 152 } 153 154 ; This can't fold because the 26-bit input won't fit the mantissa 155 ; even after disarding the signed bit. 156 ; CHECK-LABEL: test17 157 ; CHECK: sitofp 158 ; CHECK-NEXT: fptoui 159 define i32 @test17(i26 %A) nounwind { 160 %B = sitofp i26 %A to float 161 %C = fptoui float %B to i32 162 ret i32 %C 163 } 164 165 ; This can fold because the 54-bit output is signed and we disard the sign bit. 166 ; CHECK-LABEL: test18 167 ; CHECK: trunc 168 define i54 @test18(i64 %A) nounwind { 169 %B = sitofp i64 %A to double 170 %C = fptosi double %B to i54 171 ret i54 %C 172 } 173 174 ; This can't fold because the 55-bit output won't fit the mantissa 175 ; even after disarding the sign bit. 176 ; CHECK-LABEL: test19 177 ; CHECK: sitofp 178 ; CHECK-NEXT: fptosi 179 define i55 @test19(i64 %A) nounwind { 180 %B = sitofp i64 %A to double 181 %C = fptosi double %B to i55 182 ret i55 %C 183 } 184 185