143 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S %s -passes=scalarize-masked-mem-intrin -mtriple=x86_64-linux-gnu | FileCheck %s3 4define <2 x i64> @scalarize_v2i64(ptr %p, <2 x i1> %mask, <2 x i64> %passthru) {5; CHECK-LABEL: @scalarize_v2i64(6; CHECK-NEXT: [[SCALAR_MASK:%.*]] = bitcast <2 x i1> [[MASK:%.*]] to i27; CHECK-NEXT: [[TMP1:%.*]] = and i2 [[SCALAR_MASK]], 18; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i2 [[TMP1]], 09; CHECK-NEXT: br i1 [[TMP2]], label [[COND_LOAD:%.*]], label [[ELSE:%.*]]10; CHECK: cond.load:11; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[P:%.*]], i32 012; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 813; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[PASSTHRU:%.*]], i64 [[TMP4]], i64 014; CHECK-NEXT: br label [[ELSE]]15; CHECK: else:16; CHECK-NEXT: [[RES_PHI_ELSE:%.*]] = phi <2 x i64> [ [[TMP5]], [[COND_LOAD]] ], [ [[PASSTHRU]], [[TMP0:%.*]] ]17; CHECK-NEXT: [[TMP6:%.*]] = and i2 [[SCALAR_MASK]], -218; CHECK-NEXT: [[TMP7:%.*]] = icmp ne i2 [[TMP6]], 019; CHECK-NEXT: br i1 [[TMP7]], label [[COND_LOAD1:%.*]], label [[ELSE2:%.*]]20; CHECK: cond.load1:21; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[P]], i32 122; CHECK-NEXT: [[TMP9:%.*]] = load i64, ptr [[TMP8]], align 823; CHECK-NEXT: [[TMP10:%.*]] = insertelement <2 x i64> [[RES_PHI_ELSE]], i64 [[TMP9]], i64 124; CHECK-NEXT: br label [[ELSE2]]25; CHECK: else2:26; CHECK-NEXT: [[RES_PHI_ELSE3:%.*]] = phi <2 x i64> [ [[TMP10]], [[COND_LOAD1]] ], [ [[RES_PHI_ELSE]], [[ELSE]] ]27; CHECK-NEXT: ret <2 x i64> [[RES_PHI_ELSE3]]28;29 %ret = call <2 x i64> @llvm.masked.load.v2i64.p0(ptr %p, i32 128, <2 x i1> %mask, <2 x i64> %passthru)30 ret <2 x i64> %ret31}32 33define <2 x i64> @scalarize_v2i64_ones_mask(ptr %p, <2 x i64> %passthru) {34; CHECK-LABEL: @scalarize_v2i64_ones_mask(35; CHECK-NEXT: [[RET:%.*]] = load <2 x i64>, ptr [[P:%.*]], align 836; CHECK-NEXT: ret <2 x i64> [[RET]]37;38 %ret = call <2 x i64> @llvm.masked.load.v2i64.p0(ptr %p, i32 8, <2 x i1> <i1 true, i1 true>, <2 x i64> %passthru)39 ret <2 x i64> %ret40}41 42define <2 x i64> @scalarize_v2i64_zero_mask(ptr %p, <2 x i64> %passthru) {43; CHECK-LABEL: @scalarize_v2i64_zero_mask(44; CHECK-NEXT: ret <2 x i64> [[PASSTHRU:%.*]]45;46 %ret = call <2 x i64> @llvm.masked.load.v2i64.p0(ptr %p, i32 8, <2 x i1> <i1 false, i1 false>, <2 x i64> %passthru)47 ret <2 x i64> %ret48}49 50define <2 x i64> @scalarize_v2i64_const_mask(ptr %p, <2 x i64> %passthru) {51; CHECK-LABEL: @scalarize_v2i64_const_mask(52; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[P:%.*]], i32 153; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[TMP1]], align 854; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[PASSTHRU:%.*]], i64 [[TMP2]], i64 155; CHECK-NEXT: ret <2 x i64> [[TMP3]]56;57 %ret = call <2 x i64> @llvm.masked.load.v2i64.p0(ptr %p, i32 8, <2 x i1> <i1 false, i1 true>, <2 x i64> %passthru)58 ret <2 x i64> %ret59}60 61define <2 x i64> @scalarize_v2i64_splat_mask(ptr %p, i1 %mask, <2 x i64> %passthrough) {62; CHECK-LABEL: @scalarize_v2i64_splat_mask(63; CHECK-NEXT: [[MASK_VEC:%.*]] = insertelement <2 x i1> poison, i1 [[MASK:%.*]], i32 064; CHECK-NEXT: [[MASK_SPLAT:%.*]] = shufflevector <2 x i1> [[MASK_VEC]], <2 x i1> poison, <2 x i32> zeroinitializer65; CHECK-NEXT: [[MASK_SPLAT_FIRST:%.*]] = extractelement <2 x i1> [[MASK_SPLAT]], i64 066; CHECK-NEXT: br i1 [[MASK_SPLAT_FIRST]], label [[COND_LOAD:%.*]], label [[TMP1:%.*]]67; CHECK: cond.load:68; CHECK-NEXT: [[RET_COND_LOAD:%.*]] = load <2 x i64>, ptr [[P:%.*]], align 869; CHECK-NEXT: br label [[TMP1]]70; CHECK: 1:71; CHECK-NEXT: [[RET:%.*]] = phi <2 x i64> [ [[RET_COND_LOAD]], [[COND_LOAD]] ], [ [[PASSTHROUGH:%.*]], [[TMP0:%.*]] ]72; CHECK-NEXT: ret <2 x i64> [[RET]]73;74 %mask.vec = insertelement <2 x i1> poison, i1 %mask, i32 075 %mask.splat = shufflevector <2 x i1> %mask.vec, <2 x i1> poison, <2 x i32> zeroinitializer76 %ret = call <2 x i64> @llvm.masked.load.v2i64.p0(ptr %p, i32 8, <2 x i1> %mask.splat, <2 x i64> %passthrough)77 ret <2 x i64> %ret78}79 80; This use a byte sized but non power of 2 element size. This used to crash due to bad alignment calculation.81define <2 x i24> @scalarize_v2i24(ptr %p, <2 x i1> %mask, <2 x i24> %passthru) {82; CHECK-LABEL: @scalarize_v2i24(83; CHECK-NEXT: [[SCALAR_MASK:%.*]] = bitcast <2 x i1> [[MASK:%.*]] to i284; CHECK-NEXT: [[TMP1:%.*]] = and i2 [[SCALAR_MASK]], 185; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i2 [[TMP1]], 086; CHECK-NEXT: br i1 [[TMP2]], label [[COND_LOAD:%.*]], label [[ELSE:%.*]]87; CHECK: cond.load:88; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i24, ptr [[P:%.*]], i32 089; CHECK-NEXT: [[TMP4:%.*]] = load i24, ptr [[TMP3]], align 190; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i24> [[PASSTHRU:%.*]], i24 [[TMP4]], i64 091; CHECK-NEXT: br label [[ELSE]]92; CHECK: else:93; CHECK-NEXT: [[RES_PHI_ELSE:%.*]] = phi <2 x i24> [ [[TMP5]], [[COND_LOAD]] ], [ [[PASSTHRU]], [[TMP0:%.*]] ]94; CHECK-NEXT: [[TMP6:%.*]] = and i2 [[SCALAR_MASK]], -295; CHECK-NEXT: [[TMP7:%.*]] = icmp ne i2 [[TMP6]], 096; CHECK-NEXT: br i1 [[TMP7]], label [[COND_LOAD1:%.*]], label [[ELSE2:%.*]]97; CHECK: cond.load1:98; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i24, ptr [[P]], i32 199; CHECK-NEXT: [[TMP9:%.*]] = load i24, ptr [[TMP8]], align 1100; CHECK-NEXT: [[TMP10:%.*]] = insertelement <2 x i24> [[RES_PHI_ELSE]], i24 [[TMP9]], i64 1101; CHECK-NEXT: br label [[ELSE2]]102; CHECK: else2:103; CHECK-NEXT: [[RES_PHI_ELSE3:%.*]] = phi <2 x i24> [ [[TMP10]], [[COND_LOAD1]] ], [ [[RES_PHI_ELSE]], [[ELSE]] ]104; CHECK-NEXT: ret <2 x i24> [[RES_PHI_ELSE3]]105;106 %ret = call <2 x i24> @llvm.masked.load.v2i24.p0(ptr %p, i32 8, <2 x i1> %mask, <2 x i24> %passthru)107 ret <2 x i24> %ret108}109 110; This use a byte sized but non power of 2 element size. This used to crash due to bad alignment calculation.111define <2 x i48> @scalarize_v2i48(ptr %p, <2 x i1> %mask, <2 x i48> %passthru) {112; CHECK-LABEL: @scalarize_v2i48(113; CHECK-NEXT: [[SCALAR_MASK:%.*]] = bitcast <2 x i1> [[MASK:%.*]] to i2114; CHECK-NEXT: [[TMP1:%.*]] = and i2 [[SCALAR_MASK]], 1115; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i2 [[TMP1]], 0116; CHECK-NEXT: br i1 [[TMP2]], label [[COND_LOAD:%.*]], label [[ELSE:%.*]]117; CHECK: cond.load:118; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i48, ptr [[P:%.*]], i32 0119; CHECK-NEXT: [[TMP4:%.*]] = load i48, ptr [[TMP3]], align 2120; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i48> [[PASSTHRU:%.*]], i48 [[TMP4]], i64 0121; CHECK-NEXT: br label [[ELSE]]122; CHECK: else:123; CHECK-NEXT: [[RES_PHI_ELSE:%.*]] = phi <2 x i48> [ [[TMP5]], [[COND_LOAD]] ], [ [[PASSTHRU]], [[TMP0:%.*]] ]124; CHECK-NEXT: [[TMP6:%.*]] = and i2 [[SCALAR_MASK]], -2125; CHECK-NEXT: [[TMP7:%.*]] = icmp ne i2 [[TMP6]], 0126; CHECK-NEXT: br i1 [[TMP7]], label [[COND_LOAD1:%.*]], label [[ELSE2:%.*]]127; CHECK: cond.load1:128; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i48, ptr [[P]], i32 1129; CHECK-NEXT: [[TMP9:%.*]] = load i48, ptr [[TMP8]], align 2130; CHECK-NEXT: [[TMP10:%.*]] = insertelement <2 x i48> [[RES_PHI_ELSE]], i48 [[TMP9]], i64 1131; CHECK-NEXT: br label [[ELSE2]]132; CHECK: else2:133; CHECK-NEXT: [[RES_PHI_ELSE3:%.*]] = phi <2 x i48> [ [[TMP10]], [[COND_LOAD1]] ], [ [[RES_PHI_ELSE]], [[ELSE]] ]134; CHECK-NEXT: ret <2 x i48> [[RES_PHI_ELSE3]]135;136 %ret = call <2 x i48> @llvm.masked.load.v2i48.p0(ptr %p, i32 16, <2 x i1> %mask, <2 x i48> %passthru)137 ret <2 x i48> %ret138}139 140declare <2 x i24> @llvm.masked.load.v2i24.p0(ptr, i32, <2 x i1>, <2 x i24>)141declare <2 x i48> @llvm.masked.load.v2i48.p0(ptr, i32, <2 x i1>, <2 x i48>)142declare <2 x i64> @llvm.masked.load.v2i64.p0(ptr, i32, <2 x i1>, <2 x i64>)143