brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 9369d55 Raw
128 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; Tests to verify proper functioning of the icmp folding implemented in5;  InstCombiner::foldICmpBitCastConstant6; Specifically, folding:7;   icmp <pred> iN X, C8;  where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN9;    and C is a splat of a K-bit pattern10;    and SC is a constant vector = <C', C', C', ..., C'>11; Into:12;  %E = extractelement <M x iK> %vec, i32 C'13;  icmp <pred> iK %E, trunc(C)14 15define i1 @test_i1_0(i1 %val) {16; CHECK-LABEL: @test_i1_0(17; CHECK-NEXT:    [[COND:%.*]] = xor i1 [[VAL:%.*]], true18; CHECK-NEXT:    ret i1 [[COND]]19;20  %insvec = insertelement <4 x i1> undef, i1 %val, i32 021  %vec = shufflevector <4 x i1> %insvec, <4 x i1> undef, <4 x i32> zeroinitializer22  %cast = bitcast <4 x i1> %vec to i423  %cond = icmp eq i4 %cast, 024  ret i1 %cond25}26 27define i1 @test_i1_0_2(i1 %val) {28; CHECK-LABEL: @test_i1_0_2(29; CHECK-NEXT:    [[COND:%.*]] = xor i1 [[VAL:%.*]], true30; CHECK-NEXT:    ret i1 [[COND]]31;32  %insvec = insertelement <4 x i1> undef, i1 %val, i32 233  %vec = shufflevector <4 x i1> %insvec, <4 x i1> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>34  %cast = bitcast <4 x i1> %vec to i435  %cond = icmp eq i4 %cast, 036  ret i1 %cond37}38 39define i1 @test_i1_m1(i1 %val) {40; CHECK-LABEL: @test_i1_m1(41; CHECK-NEXT:    ret i1 [[VAL:%.*]]42;43  %insvec = insertelement <4 x i1> undef, i1 %val, i32 044  %vec = shufflevector <4 x i1> %insvec, <4 x i1> undef, <4 x i32> zeroinitializer45  %cast = bitcast <4 x i1> %vec to i446  %cond = icmp eq i4 %cast, -147  ret i1 %cond48}49 50define i1 @test_i8_pattern(i8 %val) {51; CHECK-LABEL: @test_i8_pattern(52; CHECK-NEXT:    [[COND:%.*]] = icmp eq i8 [[VAL:%.*]], 7253; CHECK-NEXT:    ret i1 [[COND]]54;55  %insvec = insertelement <4 x i8> undef, i8 %val, i32 056  %vec = shufflevector <4 x i8> %insvec, <4 x i8> undef, <4 x i32> zeroinitializer57  %cast = bitcast <4 x i8> %vec to i3258  %cond = icmp eq i32 %cast, 121269664859  ret i1 %cond60}61 62define i1 @test_i8_pattern_2(i8 %val) {63; CHECK-LABEL: @test_i8_pattern_2(64; CHECK-NEXT:    [[COND:%.*]] = icmp eq i8 [[VAL:%.*]], 7265; CHECK-NEXT:    ret i1 [[COND]]66;67  %insvec = insertelement <4 x i8> undef, i8 %val, i32 268  %vec = shufflevector <4 x i8> %insvec, <4 x i8> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>69  %cast = bitcast <4 x i8> %vec to i3270  %cond = icmp eq i32 %cast, 121269664871  ret i1 %cond72}73 74; Make sure we don't try to fold if the shufflemask has differing element values75define i1 @test_i8_pattern_3(<4 x i8> %invec) {76; CHECK-LABEL: @test_i8_pattern_3(77; CHECK-NEXT:    [[VEC:%.*]] = shufflevector <4 x i8> [[INVEC:%.*]], <4 x i8> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>78; CHECK-NEXT:    [[CAST:%.*]] = bitcast <4 x i8> [[VEC]] to i3279; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[CAST]], 121269664880; CHECK-NEXT:    ret i1 [[COND]]81;82  %vec = shufflevector <4 x i8> %invec, <4 x i8> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>83  %cast = bitcast <4 x i8> %vec to i3284  %cond = icmp eq i32 %cast, 121269664885  ret i1 %cond86}87 88; Make sure we don't try to fold if the compared-to constant isn't a splatted value89define i1 @test_i8_nopattern(i8 %val) {90; CHECK-LABEL: @test_i8_nopattern(91; CHECK-NEXT:    [[INSVEC:%.*]] = insertelement <4 x i8> poison, i8 [[VAL:%.*]], i64 092; CHECK-NEXT:    [[VEC:%.*]] = shufflevector <4 x i8> [[INSVEC]], <4 x i8> poison, <4 x i32> zeroinitializer93; CHECK-NEXT:    [[CAST:%.*]] = bitcast <4 x i8> [[VEC]] to i3294; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[CAST]], 121269664795; CHECK-NEXT:    ret i1 [[COND]]96;97  %insvec = insertelement <4 x i8> undef, i8 %val, i32 098  %vec = shufflevector <4 x i8> %insvec, <4 x i8> undef, <4 x i32> zeroinitializer99  %cast = bitcast <4 x i8> %vec to i32100  %cond = icmp eq i32 %cast, 1212696647101  ret i1 %cond102}103 104; Verify that we fold more than just the eq predicate105define i1 @test_i8_ult_pattern(i8 %val) {106; CHECK-LABEL: @test_i8_ult_pattern(107; CHECK-NEXT:    [[COND:%.*]] = icmp ult i8 [[VAL:%.*]], 72108; CHECK-NEXT:    ret i1 [[COND]]109;110  %insvec = insertelement <4 x i8> undef, i8 %val, i32 0111  %vec = shufflevector <4 x i8> %insvec, <4 x i8> undef, <4 x i32> zeroinitializer112  %cast = bitcast <4 x i8> %vec to i32113  %cond = icmp ult i32 %cast, 1212696648114  ret i1 %cond115}116 117define i1 @extending_shuffle_with_weird_types(<2 x i9> %v) {118; CHECK-LABEL: @extending_shuffle_with_weird_types(119; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i9> [[V:%.*]], i64 0120; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i9 [[TMP1]], 1121; CHECK-NEXT:    ret i1 [[CMP]]122;123  %splat = shufflevector <2 x i9> %v, <2 x i9> undef, <3 x i32> zeroinitializer124  %cast = bitcast <3 x i9> %splat to i27125  %cmp = icmp slt i27 %cast, 262657 ; 0x040201126  ret i1 %cmp127}128