1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2 ; RUN: opt < %s -instcombine -S | FileCheck %s 3 4 ; No selects should remain. 5 6 define i41 @zext(i1 %C) { 7 ; CHECK-LABEL: @zext( 8 ; CHECK-NEXT: [[V:%.*]] = zext i1 %C to i41 9 ; CHECK-NEXT: ret i41 [[V]] 10 ; 11 %V = select i1 %C, i41 1, i41 0 12 ret i41 %V 13 } 14 15 define i41 @sext(i1 %C) { 16 ; CHECK-LABEL: @sext( 17 ; CHECK-NEXT: [[V:%.*]] = sext i1 %C to i41 18 ; CHECK-NEXT: ret i41 [[V]] 19 ; 20 %V = select i1 %C, i41 -1, i41 0 21 ret i41 %V 22 } 23 24 define i999 @not_zext(i1 %C) { 25 ; CHECK-LABEL: @not_zext( 26 ; CHECK-NEXT: [[TMP1:%.*]] = zext i1 %C to i999 27 ; CHECK-NEXT: [[V:%.*]] = xor i999 [[TMP1]], 1 28 ; CHECK-NEXT: ret i999 [[V]] 29 ; 30 %V = select i1 %C, i999 0, i999 1 31 ret i999 %V 32 } 33 34 define i999 @not_sext(i1 %C) { 35 ; CHECK-LABEL: @not_sext( 36 ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 %C, true 37 ; CHECK-NEXT: [[V:%.*]] = sext i1 [[NOT_C]] to i999 38 ; CHECK-NEXT: ret i999 [[V]] 39 ; 40 %V = select i1 %C, i999 0, i999 -1 41 ret i999 %V 42 } 43 44 ; Vector selects of vector splat constants match APInt too. 45 46 define <2 x i41> @zext_vec(<2 x i1> %C) { 47 ; CHECK-LABEL: @zext_vec( 48 ; CHECK-NEXT: [[V:%.*]] = zext <2 x i1> %C to <2 x i41> 49 ; CHECK-NEXT: ret <2 x i41> [[V]] 50 ; 51 %V = select <2 x i1> %C, <2 x i41> <i41 1, i41 1>, <2 x i41> <i41 0, i41 0> 52 ret <2 x i41> %V 53 } 54 55 define <2 x i32> @sext_vec(<2 x i1> %C) { 56 ; CHECK-LABEL: @sext_vec( 57 ; CHECK-NEXT: [[V:%.*]] = sext <2 x i1> %C to <2 x i32> 58 ; CHECK-NEXT: ret <2 x i32> [[V]] 59 ; 60 %V = select <2 x i1> %C, <2 x i32> <i32 -1, i32 -1>, <2 x i32> <i32 0, i32 0> 61 ret <2 x i32> %V 62 } 63 64 define <2 x i999> @not_zext_vec(<2 x i1> %C) { 65 ; CHECK-LABEL: @not_zext_vec( 66 ; CHECK-NEXT: [[TMP1:%.*]] = zext <2 x i1> %C to <2 x i999> 67 ; CHECK-NEXT: [[V:%.*]] = xor <2 x i999> [[TMP1]], <i999 1, i999 1> 68 ; CHECK-NEXT: ret <2 x i999> [[V]] 69 ; 70 %V = select <2 x i1> %C, <2 x i999> <i999 0, i999 0>, <2 x i999> <i999 1, i999 1> 71 ret <2 x i999> %V 72 } 73 74 define <2 x i64> @not_sext_vec(<2 x i1> %C) { 75 ; CHECK-LABEL: @not_sext_vec( 76 ; CHECK-NEXT: [[NOT_C:%.*]] = xor <2 x i1> %C, <i1 true, i1 true> 77 ; CHECK-NEXT: [[V:%.*]] = sext <2 x i1> [[NOT_C]] to <2 x i64> 78 ; CHECK-NEXT: ret <2 x i64> [[V]] 79 ; 80 %V = select <2 x i1> %C, <2 x i64> <i64 0, i64 0>, <2 x i64> <i64 -1, i64 -1> 81 ret <2 x i64> %V 82 } 83 84 ; But don't touch this - we would need 3 instructions to extend and splat the scalar select condition. 85 86 define <2 x i32> @scalar_select_of_vectors(i1 %c) { 87 ; CHECK-LABEL: @scalar_select_of_vectors( 88 ; CHECK-NEXT: [[V:%.*]] = select i1 %c, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer 89 ; CHECK-NEXT: ret <2 x i32> [[V]] 90 ; 91 %V = select i1 %c, <2 x i32> <i32 1, i32 1>, <2 x i32> zeroinitializer 92 ret <2 x i32> %V 93 } 94 95 ;; (x <s 0) ? -1 : 0 -> ashr x, 31 96 97 define i41 @test3(i41 %X) { 98 ; CHECK-LABEL: @test3( 99 ; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i41 %X, 40 100 ; CHECK-NEXT: ret i41 [[X_LOBIT]] 101 ; 102 %t = icmp slt i41 %X, 0 103 %V = select i1 %t, i41 -1, i41 0 104 ret i41 %V 105 } 106 107 ;; (x <s 0) ? -1 : 0 -> ashr x, 31 108 109 define i1023 @test4(i1023 %X) { 110 ; CHECK-LABEL: @test4( 111 ; CHECK-NEXT: [[X_LOBIT:%.*]] = ashr i1023 %X, 1022 112 ; CHECK-NEXT: ret i1023 [[X_LOBIT]] 113 ; 114 %t = icmp slt i1023 %X, 0 115 %V = select i1 %t, i1023 -1, i1023 0 116 ret i1023 %V 117 } 118 119 ;; ((X & 27) ? 27 : 0) 120 121 define i41 @test5(i41 %X) { 122 ; CHECK-LABEL: @test5( 123 ; CHECK-NEXT: [[Y:%.*]] = and i41 %X, 32 124 ; CHECK-NEXT: ret i41 [[Y]] 125 ; 126 %Y = and i41 %X, 32 127 %t = icmp ne i41 %Y, 0 128 %V = select i1 %t, i41 32, i41 0 129 ret i41 %V 130 } 131 132 ;; ((X & 27) ? 27 : 0) 133 134 define i1023 @test6(i1023 %X) { 135 ; CHECK-LABEL: @test6( 136 ; CHECK-NEXT: [[Y:%.*]] = and i1023 %X, 64 137 ; CHECK-NEXT: ret i1023 [[Y]] 138 ; 139 %Y = and i1023 %X, 64 140 %t = icmp ne i1023 %Y, 0 141 %V = select i1 %t, i1023 64, i1023 0 142 ret i1023 %V 143 } 144 145