1; RUN: opt < %s -instcombine -S | FileCheck %s 2 3; CHECK-LABEL: test1 4; CHECK: ret i1 true 5define 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 13define 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 21define 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 30define 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 38define 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 49define 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 61define 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 69define 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 78define 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 87define 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 98define 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 109define 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 119define 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 129define 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 139define 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 148define 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 159define 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 168define 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 179define 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