|  | 
|  | 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 | 
|  | 2 | +; RUN: opt < %s -passes=instcombine -S | FileCheck %s | 
|  | 3 | + | 
|  | 4 | +define i40 @select_reconstruction_i40(i40 %arg0) { | 
|  | 5 | +; CHECK-LABEL: define i40 @select_reconstruction_i40( | 
|  | 6 | +; CHECK-SAME: i40 [[ARG0:%.*]]) { | 
|  | 7 | +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[ARG0]] to i8 | 
|  | 8 | +; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 2 | 
|  | 9 | +; CHECK-NEXT:    [[TMP7:%.*]] = and i40 [[ARG0]], -256 | 
|  | 10 | +; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP2]], i8 0, i8 [[TMP1]] | 
|  | 11 | +; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP2]], i40 0, i40 [[TMP7]] | 
|  | 12 | +; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP4]] to i40 | 
|  | 13 | +; CHECK-NEXT:    [[TMP3:%.*]] = or disjoint i40 [[TMP5]], [[TMP6]] | 
|  | 14 | +; CHECK-NEXT:    ret i40 [[TMP3]] | 
|  | 15 | +; | 
|  | 16 | +  %1 = trunc i40 %arg0 to i8 | 
|  | 17 | +  %2 = icmp eq i8 %1, 2 | 
|  | 18 | +  %3 = and i40 %arg0, -256 | 
|  | 19 | +  %4 = select i1 %2, i8 0, i8 %1 | 
|  | 20 | +  %5 = select i1 %2, i40 0, i40 %3 | 
|  | 21 | +  %6 = zext i8 %4 to i40 | 
|  | 22 | +  %7 = or disjoint i40 %5, %6 | 
|  | 23 | +  ret i40 %7 | 
|  | 24 | +} | 
|  | 25 | + | 
|  | 26 | +define i40 @select_reconstruction_any_cmp_val(i40 %arg0, i8 %arg1) { | 
|  | 27 | +; CHECK-LABEL: define i40 @select_reconstruction_any_cmp_val( | 
|  | 28 | +; CHECK-SAME: i40 [[ARG0:%.*]], i8 [[ARG1:%.*]]) { | 
|  | 29 | +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[ARG0]] to i8 | 
|  | 30 | +; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[ARG1]], [[TMP1]] | 
|  | 31 | +; CHECK-NEXT:    [[TMP7:%.*]] = and i40 [[ARG0]], -256 | 
|  | 32 | +; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP2]], i8 0, i8 [[TMP1]] | 
|  | 33 | +; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP2]], i40 0, i40 [[TMP7]] | 
|  | 34 | +; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP4]] to i40 | 
|  | 35 | +; CHECK-NEXT:    [[TMP3:%.*]] = or disjoint i40 [[TMP5]], [[TMP6]] | 
|  | 36 | +; CHECK-NEXT:    ret i40 [[TMP3]] | 
|  | 37 | +; | 
|  | 38 | +  %1 = trunc i40 %arg0 to i8 | 
|  | 39 | +  %2 = icmp eq i8 %1, %arg1 | 
|  | 40 | +  %3 = and i40 %arg0, -256 | 
|  | 41 | +  %4 = select i1 %2, i8 0, i8 %1 | 
|  | 42 | +  %5 = select i1 %2, i40 0, i40 %3 | 
|  | 43 | +  %6 = zext i8 %4 to i40 | 
|  | 44 | +  %7 = or disjoint i40 %5, %6 | 
|  | 45 | +  ret i40 %7 | 
|  | 46 | +} | 
|  | 47 | + | 
|  | 48 | +define i40 @select_reconstruction_257_mask(i40 %arg0) { | 
|  | 49 | +; CHECK-LABEL: define i40 @select_reconstruction_257_mask( | 
|  | 50 | +; CHECK-SAME: i40 [[ARG0:%.*]]) { | 
|  | 51 | +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[ARG0]] to i8 | 
|  | 52 | +; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 2 | 
|  | 53 | +; CHECK-NEXT:    [[TMP3:%.*]] = and i40 [[ARG0]], -257 | 
|  | 54 | +; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP2]], i8 0, i8 [[TMP1]] | 
|  | 55 | +; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP2]], i40 0, i40 [[TMP3]] | 
|  | 56 | +; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i40 | 
|  | 57 | +; CHECK-NEXT:    [[TMP7:%.*]] = or disjoint i40 [[TMP4]], [[TMP6]] | 
|  | 58 | +; CHECK-NEXT:    ret i40 [[TMP7]] | 
|  | 59 | +; | 
|  | 60 | +  %1 = trunc i40 %arg0 to i8 | 
|  | 61 | +  %2 = icmp eq i8 %1, 2 | 
|  | 62 | +  %3 = and i40 %arg0, -257 | 
|  | 63 | +  %4 = select i1 %2, i8 0, i8 %1 | 
|  | 64 | +  %5 = select i1 %2, i40 0, i40 %3 | 
|  | 65 | +  %6 = zext i8 %4 to i40 | 
|  | 66 | +  %7 = or disjoint i40 %5, %6 | 
|  | 67 | +  ret i40 %7 | 
|  | 68 | +} | 
|  | 69 | + | 
|  | 70 | +define i40 @select_reconstruction_i16_mask(i40 %arg0) { | 
|  | 71 | +; CHECK-LABEL: define i40 @select_reconstruction_i16_mask( | 
|  | 72 | +; CHECK-SAME: i40 [[ARG0:%.*]]) { | 
|  | 73 | +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i40 [[ARG0]] to i16 | 
|  | 74 | +; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i16 [[TMP1]], 2 | 
|  | 75 | +; CHECK-NEXT:    [[TMP7:%.*]] = and i40 [[ARG0]], -65356 | 
|  | 76 | +; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP2]], i16 0, i16 [[TMP1]] | 
|  | 77 | +; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP2]], i40 0, i40 [[TMP7]] | 
|  | 78 | +; CHECK-NEXT:    [[TMP6:%.*]] = zext i16 [[TMP4]] to i40 | 
|  | 79 | +; CHECK-NEXT:    [[TMP3:%.*]] = or disjoint i40 [[TMP5]], [[TMP6]] | 
|  | 80 | +; CHECK-NEXT:    ret i40 [[TMP3]] | 
|  | 81 | +; | 
|  | 82 | +  %1 = trunc i40 %arg0 to i16 | 
|  | 83 | +  %2 = icmp eq i16 %1, 2 | 
|  | 84 | +  %3 = and i40 %arg0, -65356 | 
|  | 85 | +  %4 = select i1 %2, i16 0, i16 %1 | 
|  | 86 | +  %5 = select i1 %2, i40 0, i40 %3 | 
|  | 87 | +  %6 = zext i16 %4 to i40 | 
|  | 88 | +  %7 = or disjoint i40 %5, %6 | 
|  | 89 | +  ret i40 %7 | 
|  | 90 | +} | 
|  | 91 | + | 
|  | 92 | +define <2 x i32> @select_reconstruction_vec_any_cmp_val(<2 x i32> %arg0, <2 x i8> %arg1) { | 
|  | 93 | +; CHECK-LABEL: define <2 x i32> @select_reconstruction_vec_any_cmp_val( | 
|  | 94 | +; CHECK-SAME: <2 x i32> [[ARG0:%.*]], <2 x i8> [[ARG1:%.*]]) { | 
|  | 95 | +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[ARG0]] to <2 x i8> | 
|  | 96 | +; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <2 x i8> [[ARG1]], [[TMP1]] | 
|  | 97 | +; CHECK-NEXT:    [[TMP3:%.*]] = and <2 x i32> [[ARG0]], splat (i32 -256) | 
|  | 98 | +; CHECK-NEXT:    [[TMP4:%.*]] = select <2 x i1> [[TMP2]], <2 x i8> zeroinitializer, <2 x i8> [[TMP1]] | 
|  | 99 | +; CHECK-NEXT:    [[TMP5:%.*]] = select <2 x i1> [[TMP2]], <2 x i32> zeroinitializer, <2 x i32> [[TMP3]] | 
|  | 100 | +; CHECK-NEXT:    [[TMP6:%.*]] = zext <2 x i8> [[TMP4]] to <2 x i32> | 
|  | 101 | +; CHECK-NEXT:    [[TMP7:%.*]] = or disjoint <2 x i32> [[TMP5]], [[TMP6]] | 
|  | 102 | +; CHECK-NEXT:    ret <2 x i32> [[TMP7]] | 
|  | 103 | +; | 
|  | 104 | +  %1 = trunc <2 x i32> %arg0 to <2 x i8> | 
|  | 105 | +  %2 = icmp eq <2 x i8> %1, %arg1 | 
|  | 106 | +  %3 = and <2 x i32> %arg0, <i32 -256, i32 -256> | 
|  | 107 | +  %4 = select <2 x i1> %2, <2 x i8> <i8 0, i8 0>, <2 x i8> %1 | 
|  | 108 | +  %5 = select <2 x i1> %2, <2 x i32> <i32 0, i32 0>, <2 x i32> %3 | 
|  | 109 | +  %6 = zext <2 x i8> %4 to <2 x i32> | 
|  | 110 | +  %7 = or <2 x i32> %5, %6 | 
|  | 111 | +  ret <2 x i32> %7 | 
|  | 112 | +} | 
0 commit comments