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