brintos

brintos / llvm-project-archived public Read only

0
0
Text · 82.1 KiB · 2fd493f Raw
1345 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-cir %s -o %t.cir2// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR3// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-llvm %s -o %t-cir.ll4// RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM5// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll6// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG7 8typedef unsigned short vus2 __attribute__((ext_vector_type(2)));9typedef int vi4 __attribute__((ext_vector_type(4)));10typedef int vi6 __attribute__((ext_vector_type(6)));11typedef unsigned int uvi4 __attribute__((ext_vector_type(4)));12typedef int vi3 __attribute__((ext_vector_type(3)));13typedef int vi2 __attribute__((ext_vector_type(2)));14typedef float vf4 __attribute__((ext_vector_type(4)));15typedef double vd2 __attribute__((ext_vector_type(2)));16typedef _Float16 vh4 __attribute__((ext_vector_type(4)));17 18vi4 vec_a;19// CIR: cir.global external @[[VEC_A:.*]] = #cir.zero : !cir.vector<4 x !s32i>20 21// LLVM: @[[VEC_A:.*]] = global <4 x i32> zeroinitializer22 23// OGCG: @[[VEC_A:.*]] = global <4 x i32> zeroinitializer24 25vi3 vec_b;26// CIR: cir.global external @[[VEC_B:.*]] = #cir.zero : !cir.vector<3 x !s32i>27 28// LLVM: @[[VEC_B:.*]] = global <3 x i32> zeroinitializer29 30// OGCG: @[[VEC_B:.*]] = global <3 x i32> zeroinitializer31 32vi2 vec_c;33// CIR: cir.global external @[[VEC_C:.*]] = #cir.zero : !cir.vector<2 x !s32i>34 35// LLVM: @[[VEC_C:.*]] = global <2 x i32> zeroinitializer36 37// OGCG: @[[VEC_C:.*]] = global <2 x i32> zeroinitializer38 39vd2 vec_d;40 41// CIR: cir.global external @[[VEC_D:.*]] = #cir.zero : !cir.vector<2 x !cir.double>42 43// LLVM: @[[VEC_D:.*]] = global <2 x double> zeroinitialize44 45// OGCG: @[[VEC_D:.*]] = global <2 x double> zeroinitializer46 47vi4 vec_e = { 1, 2, 3, 4 };48 49// CIR: cir.global external @[[VEC_E:.*]] = #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> :50// CIR-SAME: !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>51 52// LLVM: @[[VEC_E:.*]] = global <4 x i32> <i32 1, i32 2, i32 3, i32 4>53 54// OGCG: @[[VEC_E:.*]] = global <4 x i32> <i32 1, i32 2, i32 3, i32 4>55 56int x = 5;57 58void foo() {59  vi4 a;60  vi3 b;61  vi2 c;62  vd2 d;63 64  vi4 e = { 1, 2, 3, 4 };65 66  vi4 f = { x, 5, 6, x + 1 };67 68  vi4 g = { 5 };69 70  vi4 h = {};71}72 73// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]74// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<3 x !s32i>, !cir.ptr<!cir.vector<3 x !s32i>>, ["b"]75// CIR: %[[VEC_C:.*]] = cir.alloca !cir.vector<2 x !s32i>, !cir.ptr<!cir.vector<2 x !s32i>>, ["c"]76// CIR: %[[VEC_D:.*]] = cir.alloca !cir.vector<2 x !cir.double>, !cir.ptr<!cir.vector<2 x !cir.double>>, ["d"]77// CIR: %[[VEC_E:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["e", init]78// CIR: %[[VEC_F:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["f", init]79// CIR: %[[VEC_G:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["g", init]80// CIR: %[[VEC_H:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["h", init]81// CIR: %[[VEC_E_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,82// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>83// CIR: cir.store{{.*}} %[[VEC_E_VAL]], %[[VEC_E]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>84// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>85// CIR: %[[X_VAL:.*]] = cir.load{{.*}} %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i86// CIR: %[[CONST_5:.*]] = cir.const #cir.int<5> : !s32i87// CIR: %[[CONST_6:.*]] = cir.const #cir.int<6> : !s32i88// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>89// CIR: %[[X:.*]] = cir.load{{.*}} %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i90// CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i91// CIR: %[[X_PLUS_1:.*]] = cir.binop(add, %[[X]], %[[CONST_1]]) nsw : !s32i92// CIR: %[[VEC_F_VAL:.*]] = cir.vec.create(%[[X_VAL]], %[[CONST_5]], %[[CONST_6]], %[[X_PLUS_1]] :93// CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>94// CIR: cir.store{{.*}} %[[VEC_F_VAL]], %[[VEC_F]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>95// CIR: %[[VEC_G_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<0> : !s32i,96// CIR-SAME: #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i>97// CIR: cir.store{{.*}} %[[VEC_G_VAL]], %[[VEC_G]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>98// CIR: %[[VEC_H_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i,99// CIR-SAME; #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i>100// CIR: cir.store{{.*}} %[[VEC_H_VAL]], %[[VEC_H]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>101 102// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16103// LLVM: %[[VEC_B:.*]] = alloca <3 x i32>, i64 1, align 16104// LLVM: %[[VEC_C:.*]] = alloca <2 x i32>, i64 1, align 8105// LLVM: %[[VEC_D:.*]] = alloca <2 x double>, i64 1, align 16106// LLVM: %[[VEC_E:.*]] = alloca <4 x i32>, i64 1, align 16107// LLVM: %[[VEC_F:.*]] = alloca <4 x i32>, i64 1, align 16108// LLVM: %[[VEC_G:.*]] = alloca <4 x i32>, i64 1, align 16109// LLVM: %[[VEC_H:.*]] = alloca <4 x i32>, i64 1, align 16110// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_E]], align 16111// LLVM: store <4 x i32> {{.*}}, ptr %[[VEC_F]], align 16112// LLVM: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_G]], align 16113// LLVM: store <4 x i32> zeroinitializer, ptr %[[VEC_H]], align 16114 115// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16116// OGCG: %[[VEC_B:.*]] = alloca <3 x i32>, align 16117// OGCG: %[[VEC_C:.*]] = alloca <2 x i32>, align 8118// OGCG: %[[VEC_D:.*]] = alloca <2 x double>, align 16119// OGCG: %[[VEC_E:.*]] = alloca <4 x i32>, align 16120// OGCG: %[[VEC_F:.*]] = alloca <4 x i32>, align 16121// OGCG: %[[VEC_G:.*]] = alloca <4 x i32>, align 16122// OGCG: %[[VEC_H:.*]] = alloca <4 x i32>, align 16123// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_E]], align 16124// OGCG: store <4 x i32> {{.*}}, ptr %[[VEC_F]], align 16125// OGCG: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_G]], align 16126// OGCG: store <4 x i32> zeroinitializer, ptr %[[VEC_H]], align 16127 128void foo2(vi4 p) {}129 130// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["p", init]131// CIR: cir.store{{.*}} %{{.*}}, %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>132 133// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16134// LLVM: store <4 x i32> %{{.*}}, ptr %[[VEC_A]], align 16135 136// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16137// OGCG: store <4 x i32> %{{.*}}, ptr %[[VEC_A]], align 16138 139void foo3() {140  vi4 a = { 1, 2, 3, 4 };141  int e = a[1];142}143 144// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]145// CIR: %[[INIT:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["e", init]146// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,147// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>148// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>149// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>150// CIR: %[[IDX:.*]] = cir.const #cir.int<1> : !s32i151// CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP]][%[[IDX]] : !s32i] : !cir.vector<4 x !s32i>152// CIR: cir.store{{.*}} %[[ELE]], %[[INIT]] : !s32i, !cir.ptr<!s32i>153 154// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16155// LLVM: %[[INIT:.*]] = alloca i32, i64 1, align 4156// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16157// LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16158// LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 1159// LLVM: store i32 %[[ELE]], ptr %[[INIT]], align 4160 161// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16162// OGCG: %[[INIT:.*]] = alloca i32, align 4163// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16164// OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16165// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 1166// OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4167 168void foo4() {169  vi4 a = { 1, 2, 3, 4 };170 171  int idx = 2;172  int e = a[idx];173}174 175// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]176// CIR: %[[IDX:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["idx", init]177// CIR: %[[INIT:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["e", init]178// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,179// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>180// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>181// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i182// CIR: cir.store{{.*}} %[[CONST_IDX]], %[[IDX]] : !s32i, !cir.ptr<!s32i>183// CIR: %[[TMP1:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>184// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[IDX]] : !cir.ptr<!s32i>, !s32i185// CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP1]][%[[TMP2]] : !s32i] : !cir.vector<4 x !s32i>186// CIR: cir.store{{.*}} %[[ELE]], %[[INIT]] : !s32i, !cir.ptr<!s32i>187 188// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16189// LLVM: %[[IDX:.*]] = alloca i32, i64 1, align 4190// LLVM: %[[INIT:.*]] = alloca i32, i64 1, align 4191// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16192// LLVM: store i32 2, ptr %[[IDX]], align 4193// LLVM: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16194// LLVM: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4195// LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]196// LLVM: store i32 %[[ELE]], ptr %[[INIT]], align 4197 198// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16199// OGCG: %[[IDX:.*]] = alloca i32, align 4200// OGCG: %[[INIT:.*]] = alloca i32, align 4201// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16202// OGCG: store i32 2, ptr %[[IDX]], align 4203// OGCG: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16204// OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4205// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]206// OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4207 208void foo5() {209  vi4 a = { 1, 2, 3, 4 };210 211  a[2] = 5;212}213 214// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]215// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,216// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>217// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>218// CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i219// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i220// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>221// CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[CONST_VAL]], %[[TMP]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>222// CIR: cir.store{{.*}} %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>223 224// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16225// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16226// LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16227// LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP]], i32 5, i32 2228// LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16229 230// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16231// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16232// OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16233// OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP]], i32 5, i32 2234// OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16235 236void foo6() {237  vi4 a = { 1, 2, 3, 4 };238  int idx = 2;239  int value = 5;240  a[idx] = value;241}242 243// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]244// CIR: %[[IDX:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["idx", init]245// CIR: %[[VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["value", init]246// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,247// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>248// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>249// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i250// CIR: cir.store{{.*}} %[[CONST_IDX]], %[[IDX]] : !s32i, !cir.ptr<!s32i>251// CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i252// CIR: cir.store{{.*}} %[[CONST_VAL]], %[[VAL]] : !s32i, !cir.ptr<!s32i>253// CIR: %[[TMP1:.*]] = cir.load{{.*}} %[[VAL]] : !cir.ptr<!s32i>, !s32i254// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[IDX]] : !cir.ptr<!s32i>, !s32i255// CIR: %[[TMP3:.*]] = cir.load{{.*}} %0 : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>256// CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[TMP1]], %[[TMP3]][%[[TMP2]] : !s32i] : !cir.vector<4 x !s32i>257// CIR: cir.store{{.*}} %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>258 259// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16260// LLVM: %[[IDX:.*]] = alloca i32, i64 1, align 4261// LLVM: %[[VAL:.*]] = alloca i32, i64 1, align 4262// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %1, align 16263// LLVM: store i32 2, ptr %[[IDX]], align 4264// LLVM: store i32 5, ptr %[[VAL]], align 4265// LLVM: %[[TMP1:.*]] = load i32, ptr %[[VAL]], align 4266// LLVM: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4267// LLVM: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16268// LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP3]], i32 %[[TMP1]], i32 %[[TMP2]]269// LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16270 271// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16272// OGCG: %[[IDX:.*]] = alloca i32, align 4273// OGCG: %[[VAL:.*]] = alloca i32, align 4274// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16275// OGCG: store i32 2, ptr %[[IDX]], align 4276// OGCG: store i32 5, ptr %[[VAL]], align 4277// OGCG: %[[TMP1:.*]] = load i32, ptr %[[VAL]], align 4278// OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4279// OGCG: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16280// OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP3]], i32 %[[TMP1]], i32 %[[TMP2]]281// OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16282 283void foo7() {284  vi4 a = {1, 2, 3, 4};285  a[2] += 5;286}287 288// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]289// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,290// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>291// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>292// CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i293// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i294// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>295// CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>296// CIR: %[[RES:.*]] = cir.binop(add, %[[ELE]], %[[CONST_VAL]]) nsw : !s32i297// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>298// CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[RES]], %[[TMP2]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>299// CIR: cir.store{{.*}} %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>300 301// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16302// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16303// LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16304// LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 2305// LLVM: %[[RES:.*]] = add nsw i32 %[[ELE]], 5306// LLVM: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16307// LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP2]], i32 %[[RES]], i32 2308// LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16309 310// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16311// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16312// OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16313// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 2314// OGCG: %[[RES:.*]] = add nsw i32 %[[ELE]], 5315// OGCG: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16316// OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP2]], i32 %[[RES]], i32 2317// OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16318 319 320void foo8() {321  vi4 a = { 1, 2, 3, 4 };322  vi4 plus_res = +a;323  vi4 minus_res = -a;324  vi4 not_res = ~a;325}326 327// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]328// CIR: %[[PLUS_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["plus_res", init]329// CIR: %[[MINUS_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["minus_res", init]330// CIR: %[[NOT_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["not_res", init]331// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,332// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>333// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>334// CIR: %[[TMP1:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>335// CIR: %[[PLUS:.*]] = cir.unary(plus, %[[TMP1]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>336// CIR: cir.store{{.*}} %[[PLUS]], %[[PLUS_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>337// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>338// CIR: %[[MINUS:.*]] = cir.unary(minus, %[[TMP2]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>339// CIR: cir.store{{.*}} %[[MINUS]], %[[MINUS_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>340// CIR: %[[TMP3:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>341// CIR: %[[NOT:.*]] = cir.unary(not, %[[TMP3]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>342// CIR: cir.store{{.*}} %[[NOT]], %[[NOT_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>343 344// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16345// LLVM: %[[PLUS_RES:.*]] = alloca <4 x i32>, i64 1, align 16346// LLVM: %[[MINUS_RES:.*]] = alloca <4 x i32>, i64 1, align 16347// LLVM: %[[NOT_RES:.*]] = alloca <4 x i32>, i64 1, align 16348// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16349// LLVM: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16350// LLVM: store <4 x i32> %[[TMP1]], ptr %[[PLUS_RES]], align 16351// LLVM: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16352// LLVM: %[[SUB:.*]] = sub <4 x i32> zeroinitializer, %[[TMP2]]353// LLVM: store <4 x i32> %[[SUB]], ptr %[[MINUS_RES]], align 16354// LLVM: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16355// LLVM: %[[NOT:.*]] = xor <4 x i32> %[[TMP3]], splat (i32 -1)356// LLVM: store <4 x i32> %[[NOT]], ptr %[[NOT_RES]], align 16357 358// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16359// OGCG: %[[PLUS_RES:.*]] = alloca <4 x i32>, align 16360// OGCG: %[[MINUS_RES:.*]] = alloca <4 x i32>, align 16361// OGCG: %[[NOT_RES:.*]] = alloca <4 x i32>, align 16362// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16363// OGCG: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16364// OGCG: store <4 x i32> %[[TMP1]], ptr %[[PLUS_RES]], align 16365// OGCG: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16366// OGCG: %[[SUB:.*]] = sub <4 x i32> zeroinitializer, %[[TMP2]]367// OGCG: store <4 x i32> %[[SUB]], ptr %[[MINUS_RES]], align 16368// OGCG: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16369// OGCG: %[[NOT:.*]] = xor <4 x i32> %[[TMP3]], splat (i32 -1)370// OGCG: store <4 x i32> %[[NOT]], ptr %[[NOT_RES]], align 16371 372void foo9() {373  vi4 a = {1, 2, 3, 4};374  vi4 b = {5, 6, 7, 8};375 376  vi4 shl = a << b;377  vi4 shr = a >> b;378}379 380// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]381// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]382// CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]383// CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shr", init]384// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,385// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>386// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>387// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<6> : !s32i,388// CIR-SAME: #cir.int<7> : !s32i, #cir.int<8> : !s32i]> : !cir.vector<4 x !s32i>389// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>390// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>391// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>392// CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>393// CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>394// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>395// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>396// CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>397// CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>398 399// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16400// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16401// LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 16402// LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 16403// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16404// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16405// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16406// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16407// LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]408// LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16409// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16410// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16411// LLVM: %[[SHR:.*]] = ashr <4 x i32> %[[TMP_A]], %[[TMP_B]]412// LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16413 414// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16415// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16416// OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 16417// OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 16418// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16419// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16420// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16421// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16422// OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]423// OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16424// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16425// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16426// OGCG: %[[SHR:.*]] = ashr <4 x i32> %[[TMP_A]], %[[TMP_B]]427// OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16428 429void foo10() {430  vi4 a = {1, 2, 3, 4};431  uvi4 b = {5u, 6u, 7u, 8u};432 433  vi4 shl = a << b;434  uvi4 shr = b >> a;435}436 437// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]438// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]439// CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]440// CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["shr", init]441// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,442// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>443// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>444// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !u32i, #cir.int<6> : !u32i,445// CIR-SAME: #cir.int<7> : !u32i, #cir.int<8> : !u32i]> : !cir.vector<4 x !u32i>446// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>447// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>448// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>449// CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !u32i>) -> !cir.vector<4 x !s32i>450// CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>451// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>452// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>453// CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_B]] : !cir.vector<4 x !u32i>, %[[TMP_A]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !u32i>454// CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>455 456// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16457// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16458// LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 16459// LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 16460// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16461// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16462// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16463// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16464// LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]465// LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16466// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16467// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16468// LLVM: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], %[[TMP_A]]469// LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16470 471// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16472// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16473// OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 16474// OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 16475// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16476// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16477// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16478// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16479// OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]480// OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16481// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16482// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16483// OGCG: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], %[[TMP_A]]484// OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16485 486void foo11() {487  vi4 a = {1, 2, 3, 4};488  vi4 b = {5, 6, 7, 8};489 490  vi4 c = a + b;491  vi4 d = a - b;492  vi4 e = a * b;493  vi4 f = a / b;494  vi4 g = a % b;495  vi4 h = a & b;496  vi4 i = a | b;497  vi4 j = a ^ b;498}499 500// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]501// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]502// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,503// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>504// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>505// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<6> : !s32i,506// CIR-SAME: #cir.int<7> : !s32i, #cir.int<8> : !s32i]> : !cir.vector<4 x !s32i>507// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>508// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>509// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>510// CIR: %[[ADD:.*]] = cir.binop(add, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>511// CIR: cir.store{{.*}} %[[ADD]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>512// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>513// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>514// CIR: %[[SUB:.*]] = cir.binop(sub, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>515// CIR: cir.store{{.*}} %[[SUB]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>516// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>517// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>518// CIR: %[[MUL:.*]] = cir.binop(mul, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>519// CIR: cir.store{{.*}} %[[MUL]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>520// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>521// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>522// CIR: %[[DIV:.*]] = cir.binop(div, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>523// CIR: cir.store{{.*}} %[[DIV]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>524// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>525// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>526// CIR: %[[REM:.*]] = cir.binop(rem, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>527// CIR: cir.store{{.*}} %[[REM]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>528// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>529// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>530// CIR: %[[AND:.*]] = cir.binop(and, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>531// CIR: cir.store{{.*}} %[[AND]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>532// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>533// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>534// CIR: %[[OR:.*]] = cir.binop(or, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>535// CIR: cir.store{{.*}} %[[OR]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>536// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>537// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>538// CIR: %[[XOR:.*]] = cir.binop(xor, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>539// CIR: cir.store{{.*}} %[[XOR]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>540 541// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16542// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16543// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16544// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16545// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16546// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16547// LLVM: %[[ADD:.*]] = add <4 x i32> %[[TMP_A]], %[[TMP_B]]548// LLVM: store <4 x i32> %[[ADD]], ptr {{.*}}, align 16549// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16550// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16551// LLVM: %[[SUB:.*]] = sub <4 x i32> %[[TMP_A]], %[[TMP_B]]552// LLVM: store <4 x i32> %[[SUB]], ptr {{.*}}, align 16553// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16554// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16555// LLVM: %[[MUL:.*]] = mul <4 x i32> %[[TMP_A]], %[[TMP_B]]556// LLVM: store <4 x i32> %[[MUL]], ptr {{.*}}, align 16557// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16558// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16559// LLVM: %[[DIV:.*]] = sdiv <4 x i32> %[[TMP_A]], %[[TMP_B]]560// LLVM: store <4 x i32> %[[DIV]], ptr {{.*}}, align 16561// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16562// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16563// LLVM: %[[REM:.*]] = srem <4 x i32> %[[TMP_A]], %[[TMP_B]]564// LLVM: store <4 x i32> %[[REM]], ptr {{.*}}, align 16565// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16566// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16567// LLVM: %[[AND:.*]] = and <4 x i32> %[[TMP_A]], %[[TMP_B]]568// LLVM: store <4 x i32> %[[AND]], ptr {{.*}}, align 16569// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16570// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16571// LLVM: %[[OR:.*]] = or <4 x i32> %[[TMP_A]], %[[TMP_B]]572// LLVM: store <4 x i32> %[[OR]], ptr {{.*}}, align 16573// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16574// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16575// LLVM: %[[XOR:.*]] = xor <4 x i32> %[[TMP_A]], %[[TMP_B]]576// LLVM: store <4 x i32> %[[XOR]], ptr {{.*}}, align 16577 578// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16579// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16580// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16581// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16582// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16583// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16584// OGCG: %[[ADD:.*]] = add <4 x i32> %[[TMP_A]], %[[TMP_B]]585// OGCG: store <4 x i32> %[[ADD]], ptr {{.*}}, align 16586// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16587// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16588// OGCG: %[[SUB:.*]] = sub <4 x i32> %[[TMP_A]], %[[TMP_B]]589// OGCG: store <4 x i32> %[[SUB]], ptr {{.*}}, align 16590// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16591// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16592// OGCG: %[[MUL:.*]] = mul <4 x i32> %[[TMP_A]], %[[TMP_B]]593// OGCG: store <4 x i32> %[[MUL]], ptr {{.*}}, align 16594// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16595// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16596// OGCG: %[[DIV:.*]] = sdiv <4 x i32> %[[TMP_A]], %[[TMP_B]]597// OGCG: store <4 x i32> %[[DIV]], ptr {{.*}}, align 16598// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16599// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16600// OGCG: %[[REM:.*]] = srem <4 x i32> %[[TMP_A]], %[[TMP_B]]601// OGCG: store <4 x i32> %[[REM]], ptr {{.*}}, align 16602// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16603// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16604// OGCG: %[[AND:.*]] = and <4 x i32> %[[TMP_A]], %[[TMP_B]]605// OGCG: store <4 x i32> %[[AND]], ptr {{.*}}, align 16606// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16607// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16608// OGCG: %[[OR:.*]] = or <4 x i32> %[[TMP_A]], %[[TMP_B]]609// OGCG: store <4 x i32> %[[OR]], ptr {{.*}}, align 16610// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16611// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16612// OGCG: %[[XOR:.*]] = xor <4 x i32> %[[TMP_A]], %[[TMP_B]]613// OGCG: store <4 x i32> %[[XOR]], ptr {{.*}}, align 16614 615void foo12() {616  vi4 a = {1, 2, 3, 4};617  vi4 b = {5, 6, 7, 8};618 619  vi4 c = a == b;620  vi4 d = a != b;621  vi4 e = a < b;622  vi4 f = a > b;623  vi4 g = a <= b;624  vi4 h = a >= b;625}626 627// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]628// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]629// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,630// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>631// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>632// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<6> : !s32i,633// CIR-SAME: #cir.int<7> : !s32i, #cir.int<8> : !s32i]> : !cir.vector<4 x !s32i>634// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>635// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>636// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>637// CIR: %[[EQ:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>638// CIR: cir.store{{.*}} %[[EQ]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>639// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>640// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>641// CIR: %[[NE:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>642// CIR: cir.store{{.*}} %[[NE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>643// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>644// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>645// CIR: %[[LT:.*]] = cir.vec.cmp(lt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>646// CIR: cir.store{{.*}} %[[LT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>647// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>648// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>649// CIR: %[[GT:.*]] = cir.vec.cmp(gt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>650// CIR: cir.store{{.*}} %[[GT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>651// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>652// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>653// CIR: %[[LE:.*]] = cir.vec.cmp(le, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>654// CIR: cir.store{{.*}} %[[LE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>655// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>656// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>657// CIR: %[[GE:.*]] = cir.vec.cmp(ge, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>658// CIR: cir.store{{.*}} %[[GE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>659 660// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16661// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16662// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16663// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16664// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16665// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16666// LLVM: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]667// LLVM: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>668// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16669// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16670// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16671// LLVM: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]672// LLVM: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>673// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16674// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16675// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16676// LLVM: %[[LT:.*]] = icmp slt <4 x i32> %17, %18677// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>678// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16679// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16680// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16681// LLVM: %[[GT:.*]] = icmp sgt <4 x i32> %[[TMP_A]], %[[TMP_B]]682// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>683// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16684// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16685// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16686// LLVM: %[[LE:.*]] = icmp sle <4 x i32> %[[TMP_A]], %[[TMP_B]]687// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>688// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16689// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16690// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16691// LLVM: %[[GE:.*]] = icmp sge <4 x i32> %[[TMP_A]], %[[TMP_B]]692// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>693// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16694 695// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16696// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16697// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16698// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16699// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16700// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16701// OGCG: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]702// OGCG: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>703// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16704// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16705// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16706// OGCG: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]707// OGCG: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>708// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16709// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16710// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16711// OGCG: %[[LT:.*]] = icmp slt <4 x i32> %[[TMP_A]], %[[TMP_B]]712// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>713// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16714// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16715// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16716// OGCG: %[[GT:.*]] = icmp sgt <4 x i32> %[[TMP_A]], %[[TMP_B]]717// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>718// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16719// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16720// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16721// OGCG: %[[LE:.*]] = icmp sle <4 x i32> %[[TMP_A]], %[[TMP_B]]722// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>723// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16724// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16725// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16726// OGCG: %[[GE:.*]] = icmp sge <4 x i32> %[[TMP_A]], %[[TMP_B]]727// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>728// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16729 730void foo13() {731  uvi4 a = {1u, 2u, 3u, 4u};732  uvi4 b = {5u, 6u, 7u, 8u};733 734  vi4 c = a == b;735  vi4 d = a != b;736  vi4 e = a < b;737  vi4 f = a > b;738  vi4 g = a <= b;739  vi4 h = a >= b;740}741 742// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["a", init]743// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]744// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !u32i, #cir.int<2> : !u32i,745// CIR-SAME: #cir.int<3> : !u32i, #cir.int<4> : !u32i]> : !cir.vector<4 x !u32i>746// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>747// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !u32i, #cir.int<6> : !u32i,748// CIR-SAME: #cir.int<7> : !u32i, #cir.int<8> : !u32i]> : !cir.vector<4 x !u32i>749// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>750// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>751// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>752// CIR: %[[EQ:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>753// CIR: cir.store{{.*}} %[[EQ]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>754// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>755// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>756// CIR: %[[NE:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>757// CIR: cir.store{{.*}} %[[NE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>758// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>759// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>760// CIR: %[[LT:.*]] = cir.vec.cmp(lt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>761// CIR: cir.store{{.*}} %[[LT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>762// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>763// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>764// CIR: %[[GT:.*]] = cir.vec.cmp(gt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>765// CIR: cir.store{{.*}} %[[GT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>766// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>767// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>768// CIR: %[[LE:.*]] = cir.vec.cmp(le, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>769// CIR: cir.store{{.*}} %[[LE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>770// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>771// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>772// CIR: %[[GE:.*]] = cir.vec.cmp(ge, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>773// CIR: cir.store{{.*}} %[[GE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>774 775// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16776// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16777// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16778// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16779// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16780// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16781// LLVM: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]782// LLVM: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>783// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16784// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16785// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16786// LLVM: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]787// LLVM: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>788// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16789// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16790// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16791// LLVM: %[[LT:.*]] = icmp ult <4 x i32> %17, %18792// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>793// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16794// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16795// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16796// LLVM: %[[GT:.*]] = icmp ugt <4 x i32> %[[TMP_A]], %[[TMP_B]]797// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>798// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16799// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16800// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16801// LLVM: %[[LE:.*]] = icmp ule <4 x i32> %[[TMP_A]], %[[TMP_B]]802// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>803// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16804// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16805// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16806// LLVM: %[[GE:.*]] = icmp uge <4 x i32> %[[TMP_A]], %[[TMP_B]]807// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>808// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16809 810// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16811// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16812// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16813// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16814// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16815// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16816// OGCG: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]817// OGCG: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>818// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16819// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16820// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16821// OGCG: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]822// OGCG: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>823// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16824// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16825// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16826// OGCG: %[[LT:.*]] = icmp ult <4 x i32> %[[TMP_A]], %[[TMP_B]]827// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>828// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16829// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16830// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16831// OGCG: %[[GT:.*]] = icmp ugt <4 x i32> %[[TMP_A]], %[[TMP_B]]832// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>833// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16834// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16835// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16836// OGCG: %[[LE:.*]] = icmp ule <4 x i32> %[[TMP_A]], %[[TMP_B]]837// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>838// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16839// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16840// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16841// OGCG: %[[GE:.*]] = icmp uge <4 x i32> %[[TMP_A]], %[[TMP_B]]842// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>843// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16844 845void foo14() {846  vf4 a = {1.0f, 2.0f, 3.0f, 4.0f};847  vf4 b = {5.0f, 6.0f, 7.0f, 8.0f};848 849  vi4 c = a == b;850  vi4 d = a != b;851  vi4 e = a < b;852  vi4 f = a > b;853  vi4 g = a <= b;854  vi4 h = a >= b;855}856 857// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>, ["a", init]858// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>, ["b", init]859// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.fp<1.000000e+00> : !cir.float, #cir.fp<2.000000e+00> : !cir.float,860// CIR-SAME: #cir.fp<3.000000e+00> : !cir.float, #cir.fp<4.000000e+00> : !cir.float]> : !cir.vector<4 x !cir.float>861// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>862// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.fp<5.000000e+00> : !cir.float, #cir.fp<6.000000e+00> : !cir.float,863// CIR-SAME: #cir.fp<7.000000e+00> : !cir.float, #cir.fp<8.000000e+00> : !cir.float]> : !cir.vector<4 x !cir.float>864// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>865// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>866// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>867// CIR: %[[EQ:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>868// CIR: cir.store{{.*}} %[[EQ]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>869// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>870// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>871// CIR: %[[NE:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>872// CIR: cir.store{{.*}} %[[NE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>873// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>874// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>875// CIR: %[[LT:.*]] = cir.vec.cmp(lt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>876// CIR: cir.store{{.*}} %[[LT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>877// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>878// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>879// CIR: %[[GT:.*]] = cir.vec.cmp(gt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>880// CIR: cir.store{{.*}} %[[GT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>881// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>882// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>883// CIR: %[[LE:.*]] = cir.vec.cmp(le, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>884// CIR: cir.store{{.*}} %[[LE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>885// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>886// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>887// CIR: %[[GE:.*]] = cir.vec.cmp(ge, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>888// CIR: cir.store{{.*}} %[[GE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>889 890// LLVM: %[[VEC_A:.*]] = alloca <4 x float>, i64 1, align 16891// LLVM: %[[VEC_B:.*]] = alloca <4 x float>, i64 1, align 16892// LLVM: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_A]], align 16893// LLVM: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_B]], align 16894// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16895// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16896// LLVM: %[[EQ:.*]] = fcmp oeq <4 x float> %[[TMP_A]], %[[TMP_B]]897// LLVM: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>898// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16899// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16900// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16901// LLVM: %[[NE:.*]] = fcmp une <4 x float> %[[TMP_A]], %[[TMP_B]]902// LLVM: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>903// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16904// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16905// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16906// LLVM: %[[LT:.*]] = fcmp olt <4 x float> %[[TMP_A]], %[[TMP_B]]907// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>908// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16909// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16910// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16911// LLVM: %[[GT:.*]] = fcmp ogt <4 x float> %[[TMP_A]], %[[TMP_B]]912// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>913// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16914// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16915// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16916// LLVM: %[[LE:.*]] = fcmp ole <4 x float> %[[TMP_A]], %[[TMP_B]]917// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>918// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16919// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16920// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16921// LLVM: %[[GE:.*]] = fcmp oge <4 x float> %[[TMP_A]], %[[TMP_B]]922// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>923// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16924 925// OGCG: %[[VEC_A:.*]] = alloca <4 x float>, align 16926// OGCG: %[[VEC_B:.*]] = alloca <4 x float>, align 16927// OGCG: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_A]], align 16928// OGCG: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_B]], align 16929// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16930// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16931// OGCG: %[[EQ:.*]] = fcmp oeq <4 x float> %[[TMP_A]], %[[TMP_B]]932// OGCG: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>933// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16934// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16935// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16936// OGCG: %[[NE:.*]] = fcmp une <4 x float> %[[TMP_A]], %[[TMP_B]]937// OGCG: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>938// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16939// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16940// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16941// OGCG: %[[LT:.*]] = fcmp olt <4 x float> %[[TMP_A]], %[[TMP_B]]942// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>943// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16944// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16945// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16946// OGCG: %[[GT:.*]] = fcmp ogt <4 x float> %[[TMP_A]], %[[TMP_B]]947// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>948// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16949// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16950// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16951// OGCG: %[[LE:.*]] = fcmp ole <4 x float> %[[TMP_A]], %[[TMP_B]]952// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>953// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16954// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16955// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16956// OGCG: %[[GE:.*]] = fcmp oge <4 x float> %[[TMP_A]], %[[TMP_B]]957// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>958// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16959 960void foo15() {961  vi4 a;962  vi4 b;963  vi4 r = __builtin_shufflevector(a, b);964}965 966// CIR: %[[TMP_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>967// CIR: %[[TMP_B:.*]] = cir.load{{>*}} {{.*}} : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>968// CIR: %[[NEW_VEC:.*]] = cir.vec.shuffle.dynamic %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>969 970// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr {{.*}}, align 16971// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr {{.*}}, align 16972// LLVM: %[[MASK:.*]] = and <4 x i32> %[[TMP_B]], splat (i32 3)973// LLVM: %[[SHUF_IDX_0:.*]] = extractelement <4 x i32> %[[MASK]], i64 0974// LLVM: %[[SHUF_ELE_0:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]975// LLVM: %[[SHUF_INS_0:.*]] = insertelement <4 x i32> undef, i32 %[[SHUF_ELE_0]], i64 0976// LLVM: %[[SHUF_IDX_1:.*]] = extractelement <4 x i32> %[[MASK]], i64 1977// LLVM: %[[SHUF_ELE_1:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]978// LLVM: %[[SHUF_INS_1:.*]] = insertelement <4 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 1979// LLVM: %[[SHUF_IDX_2:.*]] = extractelement <4 x i32> %[[MASK]], i64 2980// LLVM: %[[SHUF_ELE_2:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]981// LLVM: %[[SHUF_INS_2:.*]] = insertelement <4 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 2982// LLVM: %[[SHUF_IDX_3:.*]] = extractelement <4 x i32> %[[MASK]], i64 3983// LLVM: %[[SHUF_ELE_3:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]984// LLVM: %[[SHUF_INS_3:.*]] = insertelement <4 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 3985 986// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr {{.*}}, align 16987// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr {{.*}}, align 16988// OGCG: %[[MASK:.*]] = and <4 x i32> %[[TMP_B]], splat (i32 3)989// OGCG: %[[SHUF_IDX_0:.*]] = extractelement <4 x i32> %[[MASK]], i64 0990// OGCG: %[[SHUF_ELE_0:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]991// OGCG: %[[SHUF_INS_0:.*]] = insertelement <4 x i32> poison, i32 %[[SHUF_ELE_0]], i64 0992// OGCG: %[[SHUF_IDX_1:.*]] = extractelement <4 x i32> %[[MASK]], i64 1993// OGCG: %[[SHUF_ELE_1:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]994// OGCG: %[[SHUF_INS_1:.*]] = insertelement <4 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 1995// OGCG: %[[SHUF_IDX_2:.*]] = extractelement <4 x i32> %[[MASK]], i64 2996// OGCG: %[[SHUF_ELE_2:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]997// OGCG: %[[SHUF_INS_2:.*]] = insertelement <4 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 2998// OGCG: %[[SHUF_IDX_3:.*]] = extractelement <4 x i32> %[[MASK]], i64 3999// OGCG: %[[SHUF_ELE_3:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]1000// OGCG: %[[SHUF_INS_3:.*]] = insertelement <4 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 31001 1002void foo16() {1003  vi6 a;1004  vi6 b;1005  vi6 r = __builtin_shufflevector(a, b);1006}1007 1008// CIR: %[[TMP_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.vector<6 x !s32i>>, !cir.vector<6 x !s32i>1009// CIR: %[[TMP_B:.*]] = cir.load{{>*}} {{.*}} : !cir.ptr<!cir.vector<6 x !s32i>>, !cir.vector<6 x !s32i>1010// CIR: %[[NEW_VEC:.*]] = cir.vec.shuffle.dynamic %[[TMP_A]] : !cir.vector<6 x !s32i>, %[[TMP_B]] : !cir.vector<6 x !s32i>1011 1012// LLVM: %[[TMP_A:.*]] = load <6 x i32>, ptr {{.*}}, align 321013// LLVM: %[[TMP_B:.*]] = load <6 x i32>, ptr {{.*}}, align 321014// LLVM: %[[MASK:.*]] = and <6 x i32> %[[TMP_B]], splat (i32 7)1015// LLVM: %[[SHUF_IDX_0:.*]] = extractelement <6 x i32> %[[MASK]], i64 01016// LLVM: %[[SHUF_ELE_0:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]1017// LLVM: %[[SHUF_INS_0:.*]] = insertelement <6 x i32> undef, i32 %[[SHUF_ELE_0]], i64 01018// LLVM: %[[SHUF_IDX_1:.*]] = extractelement <6 x i32> %[[MASK]], i64 11019// LLVM: %[[SHUF_ELE_1:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]1020// LLVM: %[[SHUF_INS_1:.*]] = insertelement <6 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 11021// LLVM: %[[SHUF_IDX_2:.*]] = extractelement <6 x i32> %[[MASK]], i64 21022// LLVM: %[[SHUF_ELE_2:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]1023// LLVM: %[[SHUF_INS_2:.*]] = insertelement <6 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 21024// LLVM: %[[SHUF_IDX_3:.*]] = extractelement <6 x i32> %[[MASK]], i64 31025// LLVM: %[[SHUF_ELE_3:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]1026// LLVM: %[[SHUF_INS_3:.*]] = insertelement <6 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 31027 1028// OGCG: %[[TMP_A:.*]] = load <6 x i32>, ptr {{.*}}, align 321029// OGCG: %[[TMP_B:.*]] = load <6 x i32>, ptr {{.*}}, align 321030// OGCG: %[[MASK:.*]] = and <6 x i32> %[[TMP_B]], splat (i32 7)1031// OGCG: %[[SHUF_IDX_0:.*]] = extractelement <6 x i32> %[[MASK]], i64 01032// OGCG: %[[SHUF_ELE_0:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]1033// OGCG: %[[SHUF_INS_0:.*]] = insertelement <6 x i32> poison, i32 %[[SHUF_ELE_0]], i64 01034// OGCG: %[[SHUF_IDX_1:.*]] = extractelement <6 x i32> %[[MASK]], i64 11035// OGCG: %[[SHUF_ELE_1:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]1036// OGCG: %[[SHUF_INS_1:.*]] = insertelement <6 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 11037// OGCG: %[[SHUF_IDX_2:.*]] = extractelement <6 x i32> %[[MASK]], i64 21038// OGCG: %[[SHUF_ELE_2:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]1039// OGCG: %[[SHUF_INS_2:.*]] = insertelement <6 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 21040// OGCG: %[[SHUF_IDX_3:.*]] = extractelement <6 x i32> %[[MASK]], i64 31041// OGCG: %[[SHUF_ELE_3:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]1042// OGCG: %[[SHUF_INS_3:.*]] = insertelement <6 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 31043 1044void foo17() {1045  vd2 a;1046  vus2 W = __builtin_convertvector(a, vus2);1047}1048 1049// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<2 x !cir.double>, !cir.ptr<!cir.vector<2 x !cir.double>>, ["a"]1050// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<2 x !cir.double>>, !cir.vector<2 x !cir.double>1051// CIR: %[[RES:.*]] = cir.cast float_to_int %[[TMP]] : !cir.vector<2 x !cir.double> -> !cir.vector<2 x !u16i>1052 1053// LLVM: %[[VEC_A:.*]] = alloca <2 x double>, i64 1, align 161054// LLVM: %[[TMP:.*]] = load <2 x double>, ptr %[[VEC_A]], align 161055// LLVM: %[[RES:.*]]= fptoui <2 x double> %[[TMP]] to <2 x i16>1056 1057// OGCG: %[[VEC_A:.*]] = alloca <2 x double>, align 161058// OGCG: %[[TMP:.*]] = load <2 x double>, ptr %[[VEC_A]], align 161059// OGCG: %[[RES:.*]]= fptoui <2 x double> %[[TMP]] to <2 x i16>1060 1061void foo18() {1062  vi4 a = {1, 2, 3, 4};1063  vi4 shl = a << 3;1064 1065  uvi4 b = {1u, 2u, 3u, 4u};1066  uvi4 shr = b >> 3u;1067}1068 1069// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]1070// CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]1071// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]1072// CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["shr", init]1073// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i,1074// CIR-SAME: #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>1075// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1076// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1077// CIR: %[[SH_AMOUNT:.*]] = cir.const #cir.int<3> : !s32i1078// CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT]] : !s32i, !cir.vector<4 x !s32i>1079// CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>1080// CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1081// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !u32i, #cir.int<2> : !u32i,1082// CIR-SAME: #cir.int<3> : !u32i, #cir.int<4> : !u32i]> : !cir.vector<4 x !u32i>1083// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>1084// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>1085// CIR: %[[SH_AMOUNT:.*]] = cir.const #cir.int<3> : !u32i1086// CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT]] : !u32i, !cir.vector<4 x !u32i>1087// CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_B]] : !cir.vector<4 x !u32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !u32i>) -> !cir.vector<4 x !u32i>1088// CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>1089 1090// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 161091// LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 161092// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 161093// LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 161094// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 161095// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161096// LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)1097// LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 161098// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 161099// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161100// LLVM: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)1101// LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 161102 1103// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 161104// OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 161105// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 161106// OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 161107// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 161108// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161109// OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)1110// OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 161111// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 161112// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161113// OGCG: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)1114// OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 161115 1116void foo19() {1117  vi4 a;1118  vi4 b;1119  vi4 u = __builtin_shufflevector(a, b, 7, 5, 3, 1);1120}1121 1122// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1123// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1124// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1125// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1126// CIR: %[[SHUF:.*]] = cir.vec.shuffle(%[[TMP_A]], %[[TMP_B]] : !cir.vector<4 x !s32i>) [#cir.int<7> :1127// CIR-SAME: !s64i, #cir.int<5> : !s64i, #cir.int<3> : !s64i, #cir.int<1> : !s64i] : !cir.vector<4 x !s32i>1128 1129// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 161130// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 161131// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161132// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161133// LLVM: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 7, i32 5, i32 3, i32 1>1134 1135// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 161136// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 161137// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161138// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161139// OGCG: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 7, i32 5, i32 3, i32 1>1140 1141void foo20() {1142  vi4 a;1143  vi4 b;1144  vi4 u = __builtin_shufflevector(a, b, -1, 1, -1, 1);1145}1146 1147// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1148// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1149// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1150// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1151// CIR: %[[SHUF:.*]] = cir.vec.shuffle(%[[TMP_A]], %[[TMP_B]] : !cir.vector<4 x !s32i>) [#cir.int<-1> :1152// CIR-SAME: !s64i, #cir.int<1> : !s64i, #cir.int<-1> : !s64i, #cir.int<1> : !s64i] : !cir.vector<4 x !s32i>1153 1154// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 161155// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 161156// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161157// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161158// LLVM: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 poison, i32 1, i32 poison, i32 1>1159 1160// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 161161// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 161162// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161163// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161164// OGCG: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 poison, i32 1, i32 poison, i32 1>1165 1166void foo21() {1167  vi4 a;1168  unsigned long size = __builtin_vectorelements(a);1169}1170 1171// CIR: %[[INIT:.*]] = cir.alloca !u64i, !cir.ptr<!u64i>, ["size", init]1172// CIR: %[[SIZE:.*]] = cir.const #cir.int<4> : !u64i1173// CIR: cir.store align(8) %[[SIZE]], %[[INIT]] : !u64i, !cir.ptr<!u64i>1174 1175// LLVM: %[[SIZE:.*]] = alloca i64, i64 1, align 81176// LLVM: store i64 4, ptr %[[SIZE]], align 81177 1178// OGCG: %[[SIZE:.*]] = alloca i64, align 81179// OGCG: store i64 4, ptr %[[SIZE]], align 81180 1181void foo22() {1182  vi4 a;1183  vi4 b;1184  vi4 c = a || b;1185}1186 1187// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1188// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1189// CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init]1190// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i>1191// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1192// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1193// CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1194// CIR: %[[NE_B_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_B]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1195// CIR: %[[RESULT:.*]] = cir.binop(or, %[[NE_A_ZERO]], %[[NE_B_ZERO]]) : !cir.vector<4 x !s32i>1196// CIR: cir.store{{.*}} %[[RESULT]], %[[C_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1197 1198// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161199// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161200// LLVM: %[[C_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161201// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161202// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161203// LLVM: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1204// LLVM: %[[NE_A_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_A_ZERO]] to <4 x i32>1205// LLVM: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1206// LLVM: %[[NE_B_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_B_ZERO]] to <4 x i32>1207// LLVM: %[[RESULT:.*]] = or <4 x i32> %[[NE_A_ZERO_SEXT]], %[[NE_B_ZERO_SEXT]]1208// LLVM: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161209 1210// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161211// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161212// OGCG: %[[C_ADDR:.*]] = alloca <4 x i32>, align 161213// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161214// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161215// OGCG: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1216// OGCG: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1217// OGCG: %[[VEC_OR:.*]] = or <4 x i1> %[[NE_A_ZERO]], %[[NE_B_ZERO]]1218// OGCG: %[[RESULT:.*]] = sext <4 x i1> %[[VEC_OR]] to <4 x i32>1219// OGCG: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161220 1221void foo24() {1222  vh4 a;1223  vh4 b;1224  vh4 c = a + b;1225}1226 1227// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>, ["a"]1228// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>, ["b"]1229// CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>, ["c", init]1230// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !cir.f16>>, !cir.vector<4 x !cir.f16>1231// CIR: %[[TMP_A_F16:.*]] = cir.cast floating %[[TMP_A]] : !cir.vector<4 x !cir.f16> -> !cir.vector<4 x !cir.float>1232// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !cir.f16>>, !cir.vector<4 x !cir.f16>1233// CIR: %[[TMP_B_F16:.*]] = cir.cast floating %[[TMP_B]] : !cir.vector<4 x !cir.f16> -> !cir.vector<4 x !cir.float>1234// CIR: %[[RESULT:.*]] = cir.binop(add, %[[TMP_A_F16]], %[[TMP_B_F16]]) : !cir.vector<4 x !cir.float>1235// CIR: %[[RESULT_VF16:.*]] = cir.cast floating %[[RESULT]] : !cir.vector<4 x !cir.float> -> !cir.vector<4 x !cir.f16>1236// CIR: cir.store{{.*}} %[[RESULT_VF16]], %[[C_ADDR]] : !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>1237 1238// LLVM: %[[A_ADDR:.*]] = alloca <4 x half>, i64 1, align 81239// LLVM: %[[B_ADDR:.*]] = alloca <4 x half>, i64 1, align 81240// LLVM: %[[C_ADDR:.*]] = alloca <4 x half>, i64 1, align 81241// LLVM: %[[TMP_A:.*]] = load <4 x half>, ptr %[[A_ADDR]], align 81242// LLVM: %[[TMP_A_F16:.*]] = fpext <4 x half> %[[TMP_A]] to <4 x float>1243// LLVM: %[[TMP_B:.*]] = load <4 x half>, ptr %[[B_ADDR]], align 81244// LLVM: %[[TMP_B_F16:.*]] = fpext <4 x half> %[[TMP_B]] to <4 x float>1245// LLVM: %[[RESULT:.*]] = fadd <4 x float> %[[TMP_A_F16]], %[[TMP_B_F16]]1246// LLVM: %[[RESULT_VF16:.*]] = fptrunc <4 x float> %[[RESULT]] to <4 x half>1247// LLVM: store <4 x half> %[[RESULT_VF16]], ptr %[[C_ADDR]], align 81248 1249// OGCG: %[[A_ADDR:.*]] = alloca <4 x half>, align 81250// OGCG: %[[B_ADDR:.*]] = alloca <4 x half>, align 81251// OGCG: %[[C_ADDR:.*]] = alloca <4 x half>, align 81252// OGCG: %[[TMP_A:.*]] = load <4 x half>, ptr %[[A_ADDR]], align 81253// OGCG: %[[TMP_A_F16:.*]] = fpext <4 x half> %[[TMP_A]] to <4 x float>1254// OGCG: %[[TMP_B:.*]] = load <4 x half>, ptr %[[B_ADDR]], align 81255// OGCG: %[[TMP_B_F16:.*]] = fpext <4 x half> %[[TMP_B]] to <4 x float>1256// OGCG: %[[RESULT:.*]] = fadd <4 x float> %[[TMP_A_F16]], %[[TMP_B_F16]]1257// OGCG: %[[RESULT_VF16:.*]] = fptrunc <4 x float> %[[RESULT]] to <4 x half>1258// OGCG: store <4 x half> %[[RESULT_VF16]], ptr %[[C_ADDR]], align 81259 1260void foo23() {1261  vi4 a;1262  vi4 b;1263  vi4 c = a && b;1264}1265 1266// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1267// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1268// CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init]1269// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i>1270// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1271// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1272// CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1273// CIR: %[[NE_B_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_B]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1274// CIR: %[[RESULT:.*]] = cir.binop(and, %[[NE_A_ZERO]], %[[NE_B_ZERO]]) : !cir.vector<4 x !s32i>1275// CIR: cir.store{{.*}} %[[RESULT]], %[[C_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1276 1277// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161278// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161279// LLVM: %[[C_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161280// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161281// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161282// LLVM: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1283// LLVM: %[[NE_A_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_A_ZERO]] to <4 x i32>1284// LLVM: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1285// LLVM: %[[NE_B_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_B_ZERO]] to <4 x i32>1286// LLVM: %[[RESULT:.*]] = and <4 x i32> %[[NE_A_ZERO_SEXT]], %[[NE_B_ZERO_SEXT]]1287// LLVM: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161288 1289// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161290// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161291// OGCG: %[[C_ADDR:.*]] = alloca <4 x i32>, align 161292// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161293// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161294// OGCG: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1295// OGCG: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1296// OGCG: %[[VEC_OR:.*]] = and <4 x i1> %[[NE_A_ZERO]], %[[NE_B_ZERO]]1297// OGCG: %[[RESULT:.*]] = sext <4 x i1> %[[VEC_OR]] to <4 x i32>1298// OGCG: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161299 1300void logical_not() {1301   vi4 a;1302   vi4 b = !a;1303}1304 1305// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1306// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]1307// CIR: %[[TMP_A:.*]] = cir.load{{.*}}) %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1308// CIR: %[[CONST_V0:.*]] = cir.const #cir.zero : !cir.vector<4 x !s32i>1309// CIR: %[[RESULT:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[CONST_V0]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1310// CIR: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1311 1312// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161313// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161314// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161315// LLVM: %[[RESULT:.*]] = icmp eq <4 x i32> %[[TMP_A]], zeroinitializer1316// LLVM: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>1317// LLVM: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 161318 1319// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161320// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161321// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161322// OGCG: %[[RESULT:.*]] = icmp eq <4 x i32> %[[TMP_A]], zeroinitializer1323// OGCG: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>1324// OGCG: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 161325 1326void unary_extension() {1327  vi4 a;1328  vi4 b = __extension__ a;1329}1330 1331// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1332// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]1333// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1334// CIR: cir.store{{.*}} %[[TMP_A]], %[[B_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1335 1336// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161337// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161338// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161339// LLVM: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 161340 1341// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161342// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161343// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161344// OGCG: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 161345