brintos

brintos / llvm-project-archived public Read only

0
0
Text · 85.3 KiB · 86551d2 Raw
1413 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__((vector_size(4)));9typedef int vi4 __attribute__((vector_size(16)));10typedef int vi6 __attribute__((vector_size(24)));11typedef unsigned int uvi4 __attribute__((vector_size(16)));12typedef float vf4 __attribute__((vector_size(16)));13typedef double vd2 __attribute__((vector_size(16)));14typedef long long vll2 __attribute__((vector_size(16)));15typedef _Float16 vh4 __attribute__((vector_size(8)));16 17vi4 vec_a;18// CIR: cir.global external @[[VEC_A:.*]] = #cir.zero : !cir.vector<4 x !s32i>19 20// LLVM: @[[VEC_A:.*]] = global <4 x i32> zeroinitializer21 22// OGCG: @[[VEC_A:.*]] = global <4 x i32> zeroinitializer23 24vd2 b;25// CIR: cir.global external @[[VEC_B:.*]] = #cir.zero : !cir.vector<2 x !cir.double>26 27// LLVM: @[[VEC_B:.*]] = global <2 x double> zeroinitialize28 29// OGCG: @[[VEC_B:.*]] = global <2 x double> zeroinitializer30 31vll2 c;32// CIR: cir.global external @[[VEC_C:.*]] = #cir.zero : !cir.vector<2 x !s64i>33 34// LLVM: @[[VEC_C:.*]] = global <2 x i64> zeroinitialize35 36// OGCG: @[[VEC_C:.*]] = global <2 x i64> zeroinitializer37 38vi4 d = { 1, 2, 3, 4 };39 40// CIR: cir.global external @[[VEC_D:.*]] = #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> :41// CIR-SAME: !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>42 43// LLVM: @[[VEC_D:.*]] = global <4 x i32> <i32 1, i32 2, i32 3, i32 4>44 45// OGCG: @[[VEC_D:.*]] = global <4 x i32> <i32 1, i32 2, i32 3, i32 4>46 47int x = 5;48 49void foo() {50  vi4 a;51  vd2 b;52  vll2 c;53 54  vi4 d = { 1, 2, 3, 4 };55 56  vi4 e = { x, 5, 6, x + 1 };57 58  vi4 f = { 5 };59 60  vi4 g = {};61}62 63// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]64// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<2 x !cir.double>, !cir.ptr<!cir.vector<2 x !cir.double>>, ["b"]65// CIR: %[[VEC_C:.*]] = cir.alloca !cir.vector<2 x !s64i>, !cir.ptr<!cir.vector<2 x !s64i>>, ["c"]66// CIR: %[[VEC_D:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["d", init]67// CIR: %[[VEC_E:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["e", init]68// CIR: %[[VEC_F:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["f", init]69// CIR: %[[VEC_G:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["g", init]70// CIR: %[[VEC_D_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,71// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>72// CIR: cir.store{{.*}} %[[VEC_D_VAL]], %[[VEC_D]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>73// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>74// CIR: %[[X_VAL:.*]] = cir.load{{.*}} %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i75// CIR: %[[CONST_5:.*]] = cir.const #cir.int<5> : !s32i76// CIR: %[[CONST_6:.*]] = cir.const #cir.int<6> : !s32i77// CIR: %[[GLOBAL_X:.*]] = cir.get_global @x : !cir.ptr<!s32i>78// CIR: %[[X:.*]] = cir.load{{.*}} %[[GLOBAL_X]] : !cir.ptr<!s32i>, !s32i79// CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i80// CIR: %[[X_PLUS_1:.*]] = cir.binop(add, %[[X]], %[[CONST_1]]) nsw : !s32i81// CIR: %[[VEC_E_VAL:.*]] = cir.vec.create(%[[X_VAL]], %[[CONST_5]], %[[CONST_6]], %[[X_PLUS_1]] :82// CIR-SAME: !s32i, !s32i, !s32i, !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: %[[VEC_F_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<0> : !s32i,85// CIR-SAME: #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i>86// CIR: cir.store{{.*}} %[[VEC_F_VAL]], %[[VEC_F]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>87// CIR: %[[VEC_G_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i,88// CIR-SAME; #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i>89// CIR: cir.store{{.*}} %[[VEC_G_VAL]], %[[VEC_G]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>90 91// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 1692// LLVM: %[[VEC_B:.*]] = alloca <2 x double>, i64 1, align 1693// LLVM: %[[VEC_C:.*]] = alloca <2 x i64>, i64 1, align 1694// LLVM: %[[VEC_D:.*]] = alloca <4 x i32>, i64 1, align 1695// LLVM: %[[VEC_E:.*]] = alloca <4 x i32>, i64 1, align 1696// LLVM: %[[VEC_F:.*]] = alloca <4 x i32>, i64 1, align 1697// LLVM: %[[VEC_G:.*]] = alloca <4 x i32>, i64 1, align 1698// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_D]], align 1699// LLVM: store <4 x i32> {{.*}}, ptr %[[VEC_E]], align 16100// LLVM: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_F]], align 16101// LLVM: store <4 x i32> zeroinitializer, ptr %[[VEC_G]], align 16102 103// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16104// OGCG: %[[VEC_B:.*]] = alloca <2 x double>, align 16105// OGCG: %[[VEC_C:.*]] = alloca <2 x i64>, align 16106// OGCG: %[[VEC_D:.*]] = alloca <4 x i32>, align 16107// OGCG: %[[VEC_E:.*]] = alloca <4 x i32>, align 16108// OGCG: %[[VEC_F:.*]] = alloca <4 x i32>, align 16109// OGCG: %[[VEC_G:.*]] = alloca <4 x i32>, align 16110// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_D]], align 16111// OGCG: store <4 x i32> {{.*}}, ptr %[[VEC_E]], align 16112// OGCG: store <4 x i32> <i32 5, i32 0, i32 0, i32 0>, ptr %[[VEC_F]], align 16113// OGCG: store <4 x i32> zeroinitializer, ptr %[[VEC_G]], align 16114 115void foo2(vi4 p) {}116 117// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["p", init]118// CIR: cir.store{{.*}} %{{.*}}, %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>119 120// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16121// LLVM: store <4 x i32> %{{.*}}, ptr %[[VEC_A]], align 16122 123// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16124// OGCG: store <4 x i32> %{{.*}}, ptr %[[VEC_A]], align 16125 126void foo3() {127  vi4 a = { 1, 2, 3, 4 };128  int e = a[1];129}130 131// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]132// CIR: %[[INIT:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["e", init]133// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,134// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>135// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>136// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>137// CIR: %[[IDX:.*]] = cir.const #cir.int<1> : !s32i138// CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP]][%[[IDX]] : !s32i] : !cir.vector<4 x !s32i>139// CIR: cir.store{{.*}} %[[ELE]], %[[INIT]] : !s32i, !cir.ptr<!s32i>140 141// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16142// LLVM: %[[INIT:.*]] = alloca i32, i64 1, align 4143// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16144// LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16145// LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 1146// LLVM: store i32 %[[ELE]], ptr %[[INIT]], align 4147 148// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16149// OGCG: %[[INIT:.*]] = alloca i32, align 4150// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16151// OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16152// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 1153// OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4154 155void foo4() {156  vi4 a = { 1, 2, 3, 4 };157 158  int idx = 2;159  int e = a[idx];160}161 162// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]163// CIR: %[[IDX:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["idx", init]164// CIR: %[[INIT:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["e", init]165// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,166// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>167// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>168// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i169// CIR: cir.store{{.*}} %[[CONST_IDX]], %[[IDX]] : !s32i, !cir.ptr<!s32i>170// CIR: %[[TMP1:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>171// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[IDX]] : !cir.ptr<!s32i>, !s32i172// CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP1]][%[[TMP2]] : !s32i] : !cir.vector<4 x !s32i>173// CIR: cir.store{{.*}} %[[ELE]], %[[INIT]] : !s32i, !cir.ptr<!s32i>174 175// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16176// LLVM: %[[IDX:.*]] = alloca i32, i64 1, align 4177// LLVM: %[[INIT:.*]] = alloca i32, i64 1, align 4178// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16179// LLVM: store i32 2, ptr %[[IDX]], align 4180// LLVM: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16181// LLVM: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4182// LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]183// LLVM: store i32 %[[ELE]], ptr %[[INIT]], align 4184 185// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16186// OGCG: %[[IDX:.*]] = alloca i32, align 4187// OGCG: %[[INIT:.*]] = alloca i32, align 4188// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16189// OGCG: store i32 2, ptr %[[IDX]], align 4190// OGCG: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16191// OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4192// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP1]], i32 %[[TMP2]]193// OGCG: store i32 %[[ELE]], ptr %[[INIT]], align 4194 195void foo5() {196  vi4 a = { 1, 2, 3, 4 };197 198  a[2] = 5;199}200 201// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]202// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,203// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>204// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>205// CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i206// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i207// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>208// CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[CONST_VAL]], %[[TMP]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>209// CIR: cir.store{{.*}} %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>210 211// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16212// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16213// LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16214// LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP]], i32 5, i32 2215// LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16216 217// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16218// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16219// OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16220// OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP]], i32 5, i32 2221// OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16222 223void foo6() {224  vi4 a = { 1, 2, 3, 4 };225  int idx = 2;226  int value = 5;227  a[idx] = value;228}229 230// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]231// CIR: %[[IDX:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["idx", init]232// CIR: %[[VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["value", init]233// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,234// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>235// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>236// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i237// CIR: cir.store{{.*}} %[[CONST_IDX]], %[[IDX]] : !s32i, !cir.ptr<!s32i>238// CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i239// CIR: cir.store{{.*}} %[[CONST_VAL]], %[[VAL]] : !s32i, !cir.ptr<!s32i>240// CIR: %[[TMP1:.*]] = cir.load{{.*}} %[[VAL]] : !cir.ptr<!s32i>, !s32i241// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[IDX]] : !cir.ptr<!s32i>, !s32i242// CIR: %[[TMP3:.*]] = cir.load{{.*}} %0 : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>243// CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[TMP1]], %[[TMP3]][%[[TMP2]] : !s32i] : !cir.vector<4 x !s32i>244// CIR: cir.store{{.*}} %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>245 246// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16247// LLVM: %[[IDX:.*]] = alloca i32, i64 1, align 4248// LLVM: %[[VAL:.*]] = alloca i32, i64 1, align 4249// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %1, align 16250// LLVM: store i32 2, ptr %[[IDX]], align 4251// LLVM: store i32 5, ptr %[[VAL]], align 4252// LLVM: %[[TMP1:.*]] = load i32, ptr %[[VAL]], align 4253// LLVM: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4254// LLVM: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16255// LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP3]], i32 %[[TMP1]], i32 %[[TMP2]]256// LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16257 258// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16259// OGCG: %[[IDX:.*]] = alloca i32, align 4260// OGCG: %[[VAL:.*]] = alloca i32, align 4261// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16262// OGCG: store i32 2, ptr %[[IDX]], align 4263// OGCG: store i32 5, ptr %[[VAL]], align 4264// OGCG: %[[TMP1:.*]] = load i32, ptr %[[VAL]], align 4265// OGCG: %[[TMP2:.*]] = load i32, ptr %[[IDX]], align 4266// OGCG: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16267// OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP3]], i32 %[[TMP1]], i32 %[[TMP2]]268// OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16269 270void foo7() {271  vi4 a = {1, 2, 3, 4};272  a[2] += 5;273}274 275// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]276// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,277// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>278// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>279// CIR: %[[CONST_VAL:.*]] = cir.const #cir.int<5> : !s32i280// CIR: %[[CONST_IDX:.*]] = cir.const #cir.int<2> : !s32i281// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>282// CIR: %[[ELE:.*]] = cir.vec.extract %[[TMP]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>283// CIR: %[[RES:.*]] = cir.binop(add, %[[ELE]], %[[CONST_VAL]]) nsw : !s32i284// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>285// CIR: %[[NEW_VEC:.*]] = cir.vec.insert %[[RES]], %[[TMP2]][%[[CONST_IDX]] : !s32i] : !cir.vector<4 x !s32i>286// CIR: cir.store{{.*}} %[[NEW_VEC]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>287 288// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16289// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16290// LLVM: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16291// LLVM: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 2292// LLVM: %[[RES:.*]] = add nsw i32 %[[ELE]], 5293// LLVM: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16294// LLVM: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP2]], i32 %[[RES]], i32 2295// LLVM: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16296 297// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16298// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16299// OGCG: %[[TMP:.*]] = load <4 x i32>, ptr %[[VEC]], align 16300// OGCG: %[[ELE:.*]] = extractelement <4 x i32> %[[TMP]], i32 2301// OGCG: %[[RES:.*]] = add nsw i32 %[[ELE]], 5302// OGCG: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16303// OGCG: %[[NEW_VEC:.*]] = insertelement <4 x i32> %[[TMP2]], i32 %[[RES]], i32 2304// OGCG: store <4 x i32> %[[NEW_VEC]], ptr %[[VEC]], align 16305 306 307void foo8() {308  vi4 a = { 1, 2, 3, 4 };309  vi4 plus_res = +a;310  vi4 minus_res = -a;311  vi4 not_res = ~a;312}313 314// CIR: %[[VEC:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]315// CIR: %[[PLUS_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["plus_res", init]316// CIR: %[[MINUS_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["minus_res", init]317// CIR: %[[NOT_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["not_res", init]318// CIR: %[[VEC_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,319// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>320// CIR: cir.store{{.*}} %[[VEC_VAL]], %[[VEC]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>321// CIR: %[[TMP1:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>322// CIR: %[[PLUS:.*]] = cir.unary(plus, %[[TMP1]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>323// CIR: cir.store{{.*}} %[[PLUS]], %[[PLUS_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>324// CIR: %[[TMP2:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>325// CIR: %[[MINUS:.*]] = cir.unary(minus, %[[TMP2]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>326// CIR: cir.store{{.*}} %[[MINUS]], %[[MINUS_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>327// CIR: %[[TMP3:.*]] = cir.load{{.*}} %[[VEC]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>328// CIR: %[[NOT:.*]] = cir.unary(not, %[[TMP3]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>329// CIR: cir.store{{.*}} %[[NOT]], %[[NOT_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>330 331// LLVM: %[[VEC:.*]] = alloca <4 x i32>, i64 1, align 16332// LLVM: %[[PLUS_RES:.*]] = alloca <4 x i32>, i64 1, align 16333// LLVM: %[[MINUS_RES:.*]] = alloca <4 x i32>, i64 1, align 16334// LLVM: %[[NOT_RES:.*]] = alloca <4 x i32>, i64 1, align 16335// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16336// LLVM: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16337// LLVM: store <4 x i32> %[[TMP1]], ptr %[[PLUS_RES]], align 16338// LLVM: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16339// LLVM: %[[SUB:.*]] = sub <4 x i32> zeroinitializer, %[[TMP2]]340// LLVM: store <4 x i32> %[[SUB]], ptr %[[MINUS_RES]], align 16341// LLVM: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16342// LLVM: %[[NOT:.*]] = xor <4 x i32> %[[TMP3]], splat (i32 -1)343// LLVM: store <4 x i32> %[[NOT]], ptr %[[NOT_RES]], align 16344 345// OGCG: %[[VEC:.*]] = alloca <4 x i32>, align 16346// OGCG: %[[PLUS_RES:.*]] = alloca <4 x i32>, align 16347// OGCG: %[[MINUS_RES:.*]] = alloca <4 x i32>, align 16348// OGCG: %[[NOT_RES:.*]] = alloca <4 x i32>, align 16349// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC]], align 16350// OGCG: %[[TMP1:.*]] = load <4 x i32>, ptr %[[VEC]], align 16351// OGCG: store <4 x i32> %[[TMP1]], ptr %[[PLUS_RES]], align 16352// OGCG: %[[TMP2:.*]] = load <4 x i32>, ptr %[[VEC]], align 16353// OGCG: %[[SUB:.*]] = sub <4 x i32> zeroinitializer, %[[TMP2]]354// OGCG: store <4 x i32> %[[SUB]], ptr %[[MINUS_RES]], align 16355// OGCG: %[[TMP3:.*]] = load <4 x i32>, ptr %[[VEC]], align 16356// OGCG: %[[NOT:.*]] = xor <4 x i32> %[[TMP3]], splat (i32 -1)357// OGCG: store <4 x i32> %[[NOT]], ptr %[[NOT_RES]], align 16358 359void foo9() {360  vi4 a = {1, 2, 3, 4};361  vi4 b = {5, 6, 7, 8};362 363  vi4 shl = a << b;364  vi4 shr = a >> b;365}366 367// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]368// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]369// CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]370// CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shr", init]371// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,372// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>373// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>374// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<6> : !s32i,375// CIR-SAME: #cir.int<7> : !s32i, #cir.int<8> : !s32i]> : !cir.vector<4 x !s32i>376// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>377// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>378// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>379// CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>380// CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>381// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>382// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>383// CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>384// CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>385 386// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16387// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16388// LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 16389// LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 16390// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16391// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16392// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16393// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16394// LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]395// LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16396// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16397// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16398// LLVM: %[[SHR:.*]] = ashr <4 x i32> %[[TMP_A]], %[[TMP_B]]399// LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16400 401// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16402// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16403// OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 16404// OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 16405// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16406// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16407// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16408// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16409// OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]410// OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16411// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16412// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16413// OGCG: %[[SHR:.*]] = ashr <4 x i32> %[[TMP_A]], %[[TMP_B]]414// OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16415 416void foo10() {417  vi4 a = {1, 2, 3, 4};418  uvi4 b = {5u, 6u, 7u, 8u};419 420  vi4 shl = a << b;421  uvi4 shr = b >> a;422}423 424// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]425// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]426// CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]427// CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["shr", init]428// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,429// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>430// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>431// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !u32i, #cir.int<6> : !u32i,432// CIR-SAME: #cir.int<7> : !u32i, #cir.int<8> : !u32i]> : !cir.vector<4 x !u32i>433// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>434// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>435// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>436// CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !u32i>) -> !cir.vector<4 x !s32i>437// CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>438// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>439// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>440// CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_B]] : !cir.vector<4 x !u32i>, %[[TMP_A]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !u32i>441// CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>442 443// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16444// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16445// LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 16446// LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 16447// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16448// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16449// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16450// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16451// LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]452// LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16453// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16454// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16455// LLVM: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], %[[TMP_A]]456// LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16457 458// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16459// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16460// OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 16461// OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 16462// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16463// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16464// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16465// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16466// OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[TMP_B]]467// OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16468// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16469// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16470// OGCG: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], %[[TMP_A]]471// OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16472 473void foo11() {474  vi4 a = {1, 2, 3, 4};475  vi4 b = {5, 6, 7, 8};476 477  vi4 c = a + b;478  vi4 d = a - b;479  vi4 e = a * b;480  vi4 f = a / b;481  vi4 g = a % b;482  vi4 h = a & b;483  vi4 i = a | b;484  vi4 j = a ^ b;485}486 487// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]488// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]489// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,490// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>491// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>492// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<6> : !s32i,493// CIR-SAME: #cir.int<7> : !s32i, #cir.int<8> : !s32i]> : !cir.vector<4 x !s32i>494// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>495// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>496// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>497// CIR: %[[ADD:.*]] = cir.binop(add, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>498// CIR: cir.store{{.*}} %[[ADD]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>499// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>500// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>501// CIR: %[[SUB:.*]] = cir.binop(sub, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>502// CIR: cir.store{{.*}} %[[SUB]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>503// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>504// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>505// CIR: %[[MUL:.*]] = cir.binop(mul, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>506// CIR: cir.store{{.*}} %[[MUL]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>507// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>508// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>509// CIR: %[[DIV:.*]] = cir.binop(div, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>510// CIR: cir.store{{.*}} %[[DIV]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>511// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>512// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>513// CIR: %[[REM:.*]] = cir.binop(rem, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>514// CIR: cir.store{{.*}} %[[REM]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>515// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>516// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>517// CIR: %[[AND:.*]] = cir.binop(and, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>518// CIR: cir.store{{.*}} %[[AND]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>519// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>520// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>521// CIR: %[[OR:.*]] = cir.binop(or, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>522// CIR: cir.store{{.*}} %[[OR]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>523// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>524// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>525// CIR: %[[XOR:.*]] = cir.binop(xor, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>526// CIR: cir.store{{.*}} %[[XOR]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>527 528// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16529// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16530// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16531// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16532// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16533// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16534// LLVM: %[[ADD:.*]] = add <4 x i32> %[[TMP_A]], %[[TMP_B]]535// LLVM: store <4 x i32> %[[ADD]], ptr {{.*}}, align 16536// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16537// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16538// LLVM: %[[SUB:.*]] = sub <4 x i32> %[[TMP_A]], %[[TMP_B]]539// LLVM: store <4 x i32> %[[SUB]], ptr {{.*}}, align 16540// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16541// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16542// LLVM: %[[MUL:.*]] = mul <4 x i32> %[[TMP_A]], %[[TMP_B]]543// LLVM: store <4 x i32> %[[MUL]], ptr {{.*}}, align 16544// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16545// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16546// LLVM: %[[DIV:.*]] = sdiv <4 x i32> %[[TMP_A]], %[[TMP_B]]547// LLVM: store <4 x i32> %[[DIV]], ptr {{.*}}, align 16548// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16549// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16550// LLVM: %[[REM:.*]] = srem <4 x i32> %[[TMP_A]], %[[TMP_B]]551// LLVM: store <4 x i32> %[[REM]], ptr {{.*}}, align 16552// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16553// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16554// LLVM: %[[AND:.*]] = and <4 x i32> %[[TMP_A]], %[[TMP_B]]555// LLVM: store <4 x i32> %[[AND]], ptr {{.*}}, align 16556// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16557// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16558// LLVM: %[[OR:.*]] = or <4 x i32> %[[TMP_A]], %[[TMP_B]]559// LLVM: store <4 x i32> %[[OR]], ptr {{.*}}, align 16560// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16561// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16562// LLVM: %[[XOR:.*]] = xor <4 x i32> %[[TMP_A]], %[[TMP_B]]563// LLVM: store <4 x i32> %[[XOR]], ptr {{.*}}, align 16564 565// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16566// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16567// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16568// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16569// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16570// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16571// OGCG: %[[ADD:.*]] = add <4 x i32> %[[TMP_A]], %[[TMP_B]]572// OGCG: store <4 x i32> %[[ADD]], ptr {{.*}}, align 16573// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16574// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16575// OGCG: %[[SUB:.*]] = sub <4 x i32> %[[TMP_A]], %[[TMP_B]]576// OGCG: store <4 x i32> %[[SUB]], ptr {{.*}}, align 16577// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16578// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16579// OGCG: %[[MUL:.*]] = mul <4 x i32> %[[TMP_A]], %[[TMP_B]]580// OGCG: store <4 x i32> %[[MUL]], ptr {{.*}}, align 16581// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16582// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16583// OGCG: %[[DIV:.*]] = sdiv <4 x i32> %[[TMP_A]], %[[TMP_B]]584// OGCG: store <4 x i32> %[[DIV]], ptr {{.*}}, align 16585// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16586// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16587// OGCG: %[[REM:.*]] = srem <4 x i32> %[[TMP_A]], %[[TMP_B]]588// OGCG: store <4 x i32> %[[REM]], ptr {{.*}}, align 16589// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16590// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16591// OGCG: %[[AND:.*]] = and <4 x i32> %[[TMP_A]], %[[TMP_B]]592// OGCG: store <4 x i32> %[[AND]], ptr {{.*}}, align 16593// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16594// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16595// OGCG: %[[OR:.*]] = or <4 x i32> %[[TMP_A]], %[[TMP_B]]596// OGCG: store <4 x i32> %[[OR]], ptr {{.*}}, align 16597// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16598// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16599// OGCG: %[[XOR:.*]] = xor <4 x i32> %[[TMP_A]], %[[TMP_B]]600// OGCG: store <4 x i32> %[[XOR]], ptr {{.*}}, align 16601 602void foo12() {603  vi4 a = {1, 2, 3, 4};604  vi4 b = {5, 6, 7, 8};605 606  vi4 c = a == b;607  vi4 d = a != b;608  vi4 e = a < b;609  vi4 f = a > b;610  vi4 g = a <= b;611  vi4 h = a >= b;612}613 614// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]615// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]616// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i,617// CIR-SAME: #cir.int<3> : !s32i, #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>618// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>619// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !s32i, #cir.int<6> : !s32i,620// CIR-SAME: #cir.int<7> : !s32i, #cir.int<8> : !s32i]> : !cir.vector<4 x !s32i>621// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>622// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>623// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>624// CIR: %[[EQ:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>625// CIR: cir.store{{.*}} %[[EQ]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>626// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>627// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>628// CIR: %[[NE:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>629// CIR: cir.store{{.*}} %[[NE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>630// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>631// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>632// CIR: %[[LT:.*]] = cir.vec.cmp(lt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>633// CIR: cir.store{{.*}} %[[LT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>634// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>635// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>636// CIR: %[[GT:.*]] = cir.vec.cmp(gt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>637// CIR: cir.store{{.*}} %[[GT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>638// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>639// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>640// CIR: %[[LE:.*]] = cir.vec.cmp(le, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>641// CIR: cir.store{{.*}} %[[LE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>642// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>643// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>644// CIR: %[[GE:.*]] = cir.vec.cmp(ge, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>645// CIR: cir.store{{.*}} %[[GE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>646 647// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16648// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16649// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16650// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16651// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16652// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16653// LLVM: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]654// LLVM: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>655// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16656// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16657// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16658// LLVM: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]659// LLVM: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>660// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16661// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16662// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16663// LLVM: %[[LT:.*]] = icmp slt <4 x i32> %17, %18664// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>665// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16666// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16667// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16668// LLVM: %[[GT:.*]] = icmp sgt <4 x i32> %[[TMP_A]], %[[TMP_B]]669// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>670// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16671// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16672// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16673// LLVM: %[[LE:.*]] = icmp sle <4 x i32> %[[TMP_A]], %[[TMP_B]]674// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>675// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16676// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16677// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16678// LLVM: %[[GE:.*]] = icmp sge <4 x i32> %[[TMP_A]], %[[TMP_B]]679// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>680// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16681 682// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16683// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16684// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16685// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16686// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16687// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16688// OGCG: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]689// OGCG: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>690// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16691// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16692// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16693// OGCG: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]694// OGCG: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>695// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16696// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16697// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16698// OGCG: %[[LT:.*]] = icmp slt <4 x i32> %[[TMP_A]], %[[TMP_B]]699// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>700// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16701// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16702// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16703// OGCG: %[[GT:.*]] = icmp sgt <4 x i32> %[[TMP_A]], %[[TMP_B]]704// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>705// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16706// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16707// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16708// OGCG: %[[LE:.*]] = icmp sle <4 x i32> %[[TMP_A]], %[[TMP_B]]709// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>710// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16711// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16712// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16713// OGCG: %[[GE:.*]] = icmp sge <4 x i32> %[[TMP_A]], %[[TMP_B]]714// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>715// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16716 717void foo13() {718  uvi4 a = {1u, 2u, 3u, 4u};719  uvi4 b = {5u, 6u, 7u, 8u};720 721  vi4 c = a == b;722  vi4 d = a != b;723  vi4 e = a < b;724  vi4 f = a > b;725  vi4 g = a <= b;726  vi4 h = a >= b;727}728 729// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["a", init]730// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]731// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !u32i, #cir.int<2> : !u32i,732// CIR-SAME: #cir.int<3> : !u32i, #cir.int<4> : !u32i]> : !cir.vector<4 x !u32i>733// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>734// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<5> : !u32i, #cir.int<6> : !u32i,735// CIR-SAME: #cir.int<7> : !u32i, #cir.int<8> : !u32i]> : !cir.vector<4 x !u32i>736// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>737// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>738// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>739// CIR: %[[EQ:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>740// CIR: cir.store{{.*}} %[[EQ]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>741// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>742// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>743// CIR: %[[NE:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>744// CIR: cir.store{{.*}} %[[NE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>745// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>746// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>747// CIR: %[[LT:.*]] = cir.vec.cmp(lt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>748// CIR: cir.store{{.*}} %[[LT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>749// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>750// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>751// CIR: %[[GT:.*]] = cir.vec.cmp(gt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>752// CIR: cir.store{{.*}} %[[GT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>753// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>754// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>755// CIR: %[[LE:.*]] = cir.vec.cmp(le, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>756// CIR: cir.store{{.*}} %[[LE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>757// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>758// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>759// CIR: %[[GE:.*]] = cir.vec.cmp(ge, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !u32i>, !cir.vector<4 x !s32i>760// CIR: cir.store{{.*}} %[[GE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>761 762// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16763// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16764// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16765// LLVM: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16766// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16767// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16768// LLVM: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]769// LLVM: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>770// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16771// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16772// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16773// LLVM: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]774// LLVM: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>775// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16776// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16777// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16778// LLVM: %[[LT:.*]] = icmp ult <4 x i32> %17, %18779// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>780// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16781// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16782// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16783// LLVM: %[[GT:.*]] = icmp ugt <4 x i32> %[[TMP_A]], %[[TMP_B]]784// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>785// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16786// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16787// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16788// LLVM: %[[LE:.*]] = icmp ule <4 x i32> %[[TMP_A]], %[[TMP_B]]789// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>790// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16791// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16792// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16793// LLVM: %[[GE:.*]] = icmp uge <4 x i32> %[[TMP_A]], %[[TMP_B]]794// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>795// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16796 797// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16798// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16799// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16800// OGCG: store <4 x i32> <i32 5, i32 6, i32 7, i32 8>, ptr %[[VEC_B]], align 16801// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16802// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16803// OGCG: %[[EQ:.*]] = icmp eq <4 x i32> %[[TMP_A]], %[[TMP_B]]804// OGCG: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>805// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16806// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16807// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16808// OGCG: %[[NE:.*]] = icmp ne <4 x i32> %[[TMP_A]], %[[TMP_B]]809// OGCG: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>810// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16811// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16812// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16813// OGCG: %[[LT:.*]] = icmp ult <4 x i32> %[[TMP_A]], %[[TMP_B]]814// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>815// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16816// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16817// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16818// OGCG: %[[GT:.*]] = icmp ugt <4 x i32> %[[TMP_A]], %[[TMP_B]]819// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>820// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16821// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16822// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16823// OGCG: %[[LE:.*]] = icmp ule <4 x i32> %[[TMP_A]], %[[TMP_B]]824// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>825// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16826// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16827// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16828// OGCG: %[[GE:.*]] = icmp uge <4 x i32> %[[TMP_A]], %[[TMP_B]]829// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>830// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16831 832void foo14() {833  vf4 a = {1.0f, 2.0f, 3.0f, 4.0f};834  vf4 b = {5.0f, 6.0f, 7.0f, 8.0f};835 836  vi4 c = a == b;837  vi4 d = a != b;838  vi4 e = a < b;839  vi4 f = a > b;840  vi4 g = a <= b;841  vi4 h = a >= b;842}843 844// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>, ["a", init]845// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>, ["b", init]846// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.fp<1.000000e+00> : !cir.float, #cir.fp<2.000000e+00> : !cir.float,847// CIR-SAME: #cir.fp<3.000000e+00> : !cir.float, #cir.fp<4.000000e+00> : !cir.float]> : !cir.vector<4 x !cir.float>848// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>849// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.fp<5.000000e+00> : !cir.float, #cir.fp<6.000000e+00> : !cir.float,850// CIR-SAME: #cir.fp<7.000000e+00> : !cir.float, #cir.fp<8.000000e+00> : !cir.float]> : !cir.vector<4 x !cir.float>851// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>852// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>853// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>854// CIR: %[[EQ:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>855// CIR: cir.store{{.*}} %[[EQ]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>856// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>857// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>858// CIR: %[[NE:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>859// CIR: cir.store{{.*}} %[[NE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>860// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>861// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>862// CIR: %[[LT:.*]] = cir.vec.cmp(lt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>863// CIR: cir.store{{.*}} %[[LT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>864// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>865// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>866// CIR: %[[GT:.*]] = cir.vec.cmp(gt, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>867// CIR: cir.store{{.*}} %[[GT]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>868// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>869// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>870// CIR: %[[LE:.*]] = cir.vec.cmp(le, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>871// CIR: cir.store{{.*}} %[[LE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>872// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>873// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>874// CIR: %[[GE:.*]] = cir.vec.cmp(ge, %[[TMP_A]], %[[TMP_B]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>875// CIR: cir.store{{.*}} %[[GE]], {{.*}} : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>876 877// LLVM: %[[VEC_A:.*]] = alloca <4 x float>, i64 1, align 16878// LLVM: %[[VEC_B:.*]] = alloca <4 x float>, i64 1, align 16879// LLVM: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_A]], align 16880// LLVM: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_B]], align 16881// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16882// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16883// LLVM: %[[EQ:.*]] = fcmp oeq <4 x float> %[[TMP_A]], %[[TMP_B]]884// LLVM: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>885// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16886// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16887// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16888// LLVM: %[[NE:.*]] = fcmp une <4 x float> %[[TMP_A]], %[[TMP_B]]889// LLVM: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>890// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16891// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16892// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16893// LLVM: %[[LT:.*]] = fcmp olt <4 x float> %[[TMP_A]], %[[TMP_B]]894// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>895// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16896// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16897// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16898// LLVM: %[[GT:.*]] = fcmp ogt <4 x float> %[[TMP_A]], %[[TMP_B]]899// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>900// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16901// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16902// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16903// LLVM: %[[LE:.*]] = fcmp ole <4 x float> %[[TMP_A]], %[[TMP_B]]904// LLVM: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>905// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16906// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16907// LLVM: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16908// LLVM: %[[GE:.*]] = fcmp oge <4 x float> %[[TMP_A]], %[[TMP_B]]909// LLVM: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>910// LLVM: store <4 x i32> %[[RES]], ptr {{.*}}, align 16911 912// OGCG: %[[VEC_A:.*]] = alloca <4 x float>, align 16913// OGCG: %[[VEC_B:.*]] = alloca <4 x float>, align 16914// OGCG: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_A]], align 16915// OGCG: store <4 x float> <float {{.*}}, float {{.*}}, float {{.*}}, float {{.*}}>, ptr %[[VEC_B]], align 16916// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16917// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16918// OGCG: %[[EQ:.*]] = fcmp oeq <4 x float> %[[TMP_A]], %[[TMP_B]]919// OGCG: %[[RES:.*]] = sext <4 x i1> %[[EQ]] to <4 x i32>920// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16921// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16922// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16923// OGCG: %[[NE:.*]] = fcmp une <4 x float> %[[TMP_A]], %[[TMP_B]]924// OGCG: %[[RES:.*]] = sext <4 x i1> %[[NE]] to <4 x i32>925// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16926// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16927// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16928// OGCG: %[[LT:.*]] = fcmp olt <4 x float> %[[TMP_A]], %[[TMP_B]]929// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LT]] to <4 x i32>930// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16931// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16932// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16933// OGCG: %[[GT:.*]] = fcmp ogt <4 x float> %[[TMP_A]], %[[TMP_B]]934// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GT]] to <4 x i32>935// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16936// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16937// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16938// OGCG: %[[LE:.*]] = fcmp ole <4 x float> %[[TMP_A]], %[[TMP_B]]939// OGCG: %[[RES:.*]] = sext <4 x i1> %[[LE]] to <4 x i32>940// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16941// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[VEC_A]], align 16942// OGCG: %[[TMP_B:.*]] = load <4 x float>, ptr %[[VEC_B]], align 16943// OGCG: %[[GE:.*]] = fcmp oge <4 x float> %[[TMP_A]], %[[TMP_B]]944// OGCG: %[[RES:.*]] = sext <4 x i1> %[[GE]] to <4 x i32>945// OGCG: store <4 x i32> %[[RES]], ptr {{.*}}, align 16946 947void foo15() {948  vi4 a;949  vi4 b;950  vi4 r = __builtin_shufflevector(a, b);951}952 953// CIR: %[[TMP_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>954// CIR: %[[TMP_B:.*]] = cir.load{{>*}} {{.*}} : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>955// CIR: %[[NEW_VEC:.*]] = cir.vec.shuffle.dynamic %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[TMP_B]] : !cir.vector<4 x !s32i>956 957// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr {{.*}}, align 16958// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr {{.*}}, align 16959// LLVM: %[[MASK:.*]] = and <4 x i32> %[[TMP_B]], splat (i32 3)960// LLVM: %[[SHUF_IDX_0:.*]] = extractelement <4 x i32> %[[MASK]], i64 0961// LLVM: %[[SHUF_ELE_0:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]962// LLVM: %[[SHUF_INS_0:.*]] = insertelement <4 x i32> undef, i32 %[[SHUF_ELE_0]], i64 0963// LLVM: %[[SHUF_IDX_1:.*]] = extractelement <4 x i32> %[[MASK]], i64 1964// LLVM: %[[SHUF_ELE_1:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]965// LLVM: %[[SHUF_INS_1:.*]] = insertelement <4 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 1966// LLVM: %[[SHUF_IDX_2:.*]] = extractelement <4 x i32> %[[MASK]], i64 2967// LLVM: %[[SHUF_ELE_2:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]968// LLVM: %[[SHUF_INS_2:.*]] = insertelement <4 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 2969// LLVM: %[[SHUF_IDX_3:.*]] = extractelement <4 x i32> %[[MASK]], i64 3970// LLVM: %[[SHUF_ELE_3:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]971// LLVM: %[[SHUF_INS_3:.*]] = insertelement <4 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 3972 973// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr {{.*}}, align 16974// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr {{.*}}, align 16975// OGCG: %[[MASK:.*]] = and <4 x i32> %[[TMP_B]], splat (i32 3)976// OGCG: %[[SHUF_IDX_0:.*]] = extractelement <4 x i32> %[[MASK]], i64 0977// OGCG: %[[SHUF_ELE_0:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]978// OGCG: %[[SHUF_INS_0:.*]] = insertelement <4 x i32> poison, i32 %[[SHUF_ELE_0]], i64 0979// OGCG: %[[SHUF_IDX_1:.*]] = extractelement <4 x i32> %[[MASK]], i64 1980// OGCG: %[[SHUF_ELE_1:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]981// OGCG: %[[SHUF_INS_1:.*]] = insertelement <4 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 1982// OGCG: %[[SHUF_IDX_2:.*]] = extractelement <4 x i32> %[[MASK]], i64 2983// OGCG: %[[SHUF_ELE_2:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]984// OGCG: %[[SHUF_INS_2:.*]] = insertelement <4 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 2985// OGCG: %[[SHUF_IDX_3:.*]] = extractelement <4 x i32> %[[MASK]], i64 3986// OGCG: %[[SHUF_ELE_3:.*]] = extractelement <4 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]987// OGCG: %[[SHUF_INS_3:.*]] = insertelement <4 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 3988 989void foo16() {990  vi6 a;991  vi6 b;992  vi6 r = __builtin_shufflevector(a, b);993}994 995// CIR: %[[TMP_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.vector<6 x !s32i>>, !cir.vector<6 x !s32i>996// CIR: %[[TMP_B:.*]] = cir.load{{>*}} {{.*}} : !cir.ptr<!cir.vector<6 x !s32i>>, !cir.vector<6 x !s32i>997// CIR: %[[NEW_VEC:.*]] = cir.vec.shuffle.dynamic %[[TMP_A]] : !cir.vector<6 x !s32i>, %[[TMP_B]] : !cir.vector<6 x !s32i>998 999// LLVM: %[[TMP_A:.*]] = load <6 x i32>, ptr {{.*}}, align 321000// LLVM: %[[TMP_B:.*]] = load <6 x i32>, ptr {{.*}}, align 321001// LLVM: %[[MASK:.*]] = and <6 x i32> %[[TMP_B]], splat (i32 7)1002// LLVM: %[[SHUF_IDX_0:.*]] = extractelement <6 x i32> %[[MASK]], i64 01003// LLVM: %[[SHUF_ELE_0:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]1004// LLVM: %[[SHUF_INS_0:.*]] = insertelement <6 x i32> undef, i32 %[[SHUF_ELE_0]], i64 01005// LLVM: %[[SHUF_IDX_1:.*]] = extractelement <6 x i32> %[[MASK]], i64 11006// LLVM: %[[SHUF_ELE_1:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]1007// LLVM: %[[SHUF_INS_1:.*]] = insertelement <6 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 11008// LLVM: %[[SHUF_IDX_2:.*]] = extractelement <6 x i32> %[[MASK]], i64 21009// LLVM: %[[SHUF_ELE_2:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]1010// LLVM: %[[SHUF_INS_2:.*]] = insertelement <6 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 21011// LLVM: %[[SHUF_IDX_3:.*]] = extractelement <6 x i32> %[[MASK]], i64 31012// LLVM: %[[SHUF_ELE_3:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]1013// LLVM: %[[SHUF_INS_3:.*]] = insertelement <6 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 31014 1015// OGCG: %[[TMP_A:.*]] = load <6 x i32>, ptr {{.*}}, align 321016// OGCG: %[[TMP_B:.*]] = load <6 x i32>, ptr {{.*}}, align 321017// OGCG: %[[MASK:.*]] = and <6 x i32> %[[TMP_B]], splat (i32 7)1018// OGCG: %[[SHUF_IDX_0:.*]] = extractelement <6 x i32> %[[MASK]], i64 01019// OGCG: %[[SHUF_ELE_0:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_0]]1020// OGCG: %[[SHUF_INS_0:.*]] = insertelement <6 x i32> poison, i32 %[[SHUF_ELE_0]], i64 01021// OGCG: %[[SHUF_IDX_1:.*]] = extractelement <6 x i32> %[[MASK]], i64 11022// OGCG: %[[SHUF_ELE_1:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_1]]1023// OGCG: %[[SHUF_INS_1:.*]] = insertelement <6 x i32> %[[SHUF_INS_0]], i32 %[[SHUF_ELE_1]], i64 11024// OGCG: %[[SHUF_IDX_2:.*]] = extractelement <6 x i32> %[[MASK]], i64 21025// OGCG: %[[SHUF_ELE_2:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_2]]1026// OGCG: %[[SHUF_INS_2:.*]] = insertelement <6 x i32> %[[SHUF_INS_1]], i32 %[[SHUF_ELE_2]], i64 21027// OGCG: %[[SHUF_IDX_3:.*]] = extractelement <6 x i32> %[[MASK]], i64 31028// OGCG: %[[SHUF_ELE_3:.*]] = extractelement <6 x i32> %[[TMP_A]], i32 %[[SHUF_IDX_3]]1029// OGCG: %[[SHUF_INS_3:.*]] = insertelement <6 x i32> %[[SHUF_INS_2]], i32 %[[SHUF_ELE_3]], i64 31030 1031void foo17() {1032  vd2 a;1033  vus2 W = __builtin_convertvector(a, vus2);1034}1035 1036// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<2 x !cir.double>, !cir.ptr<!cir.vector<2 x !cir.double>>, ["a"]1037// CIR: %[[TMP:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<2 x !cir.double>>, !cir.vector<2 x !cir.double>1038// CIR: %[[RES:.*]] = cir.cast float_to_int %[[TMP]] : !cir.vector<2 x !cir.double> -> !cir.vector<2 x !u16i>1039 1040// LLVM: %[[VEC_A:.*]] = alloca <2 x double>, i64 1, align 161041// LLVM: %[[TMP:.*]] = load <2 x double>, ptr %[[VEC_A]], align 161042// LLVM: %[[RES:.*]]= fptoui <2 x double> %[[TMP]] to <2 x i16>1043 1044// OGCG: %[[VEC_A:.*]] = alloca <2 x double>, align 161045// OGCG: %[[TMP:.*]] = load <2 x double>, ptr %[[VEC_A]], align 161046// OGCG: %[[RES:.*]]= fptoui <2 x double> %[[TMP]] to <2 x i16>1047 1048void foo18() {1049  vi4 a = {1, 2, 3, 4};1050  vi4 shl = a << 3;1051 1052  uvi4 b = {1u, 2u, 3u, 4u};1053  uvi4 shr = b >> 3u;1054}1055 1056// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]1057// CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]1058// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]1059// CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["shr", init]1060// CIR: %[[VEC_A_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i,1061// CIR-SAME: #cir.int<4> : !s32i]> : !cir.vector<4 x !s32i>1062// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1063// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1064// CIR: %[[SH_AMOUNT:.*]] = cir.const #cir.int<3> : !s32i1065// CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT]] : !s32i, !cir.vector<4 x !s32i>1066// CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>1067// CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1068// CIR: %[[VEC_B_VAL:.*]] = cir.const #cir.const_vector<[#cir.int<1> : !u32i, #cir.int<2> : !u32i,1069// CIR-SAME: #cir.int<3> : !u32i, #cir.int<4> : !u32i]> : !cir.vector<4 x !u32i>1070// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>1071// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>1072// CIR: %[[SH_AMOUNT:.*]] = cir.const #cir.int<3> : !u32i1073// CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT]] : !u32i, !cir.vector<4 x !u32i>1074// CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_B]] : !cir.vector<4 x !u32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !u32i>) -> !cir.vector<4 x !u32i>1075// CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>1076 1077// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 161078// LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 161079// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 161080// LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 161081// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 161082// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161083// LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)1084// LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 161085// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 161086// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161087// LLVM: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)1088// LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 161089 1090// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 161091// OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 161092// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 161093// OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 161094// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 161095// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161096// OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)1097// OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 161098// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 161099// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161100// OGCG: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)1101// OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 161102 1103void foo19() {1104  vi4 a;1105  vi4 b;1106  vi4 u = __builtin_shufflevector(a, b, 7, 5, 3, 1);1107}1108 1109// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1110// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1111// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1112// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1113// CIR: %[[SHUF:.*]] = cir.vec.shuffle(%[[TMP_A]], %[[TMP_B]] : !cir.vector<4 x !s32i>) [#cir.int<7> :1114// CIR-SAME: !s64i, #cir.int<5> : !s64i, #cir.int<3> : !s64i, #cir.int<1> : !s64i] : !cir.vector<4 x !s32i>1115 1116// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 161117// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 161118// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161119// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161120// LLVM: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 7, i32 5, i32 3, i32 1>1121 1122// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 161123// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 161124// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161125// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161126// OGCG: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 7, i32 5, i32 3, i32 1>1127 1128void foo20() {1129  vi4 a;1130  vi4 b;1131  vi4 c;1132  vi4 r = c ? a : b;1133}1134 1135// CIR: %[[RES:.*]] = cir.vec.ternary({{.*}}, {{.*}}, {{.*}}) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1136 1137// LLVM: %[[VEC_COND:.*]] = icmp ne <4 x i32> {{.*}}, zeroinitializer1138// LLVM: %[[RES:.*]] = select <4 x i1> %[[VEC_COND]], <4 x i32> {{.*}}, <4 x i32> {{.*}}1139 1140// OGCG: %[[VEC_COND:.*]] = icmp ne <4 x i32> {{.*}}, zeroinitializer1141// OGCG: %[[RES:.*]] = select <4 x i1> %[[VEC_COND]], <4 x i32> {{.*}}, <4 x i32> {{.*}}1142 1143void foo21() {1144  vi4 a;1145  vi4 b;1146  vi4 r = (a > b) ? (a - b) : (b - a);1147}1148 1149// CIR: %[[VEC_COND:.*]] = cir.vec.cmp(gt, {{.*}}, {{.*}}) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1150// CIR: %[[LHS:.*]] = cir.binop(sub, {{.*}}, {{.*}}) : !cir.vector<4 x !s32i>1151// CIR: %[[RHS:.*]] = cir.binop(sub, {{.*}}, {{.*}}) : !cir.vector<4 x !s32i>1152// CIR: %[[RES:.*]] = cir.vec.ternary(%[[VEC_COND]], %[[LHS]], %[[RHS]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1153 1154// LLVM: %[[CMP:.*]] = icmp sgt <4 x i32> {{.*}}, {{.*}}1155// LLVM: %[[SEXT:.*]] = sext <4 x i1> %[[CMP]] to <4 x i32>1156// LLVM: %[[LHS:.*]] = sub <4 x i32> {{.*}}, {{.*}}1157// LLVM: %[[RHS:.*]] = sub <4 x i32> {{.*}}, {{.*}}1158// LLVM: %[[VEC_COND:.*]] = icmp ne <4 x i32> %[[SEXT]], zeroinitializer1159// LLVM: %[[RES:.*]] = select <4 x i1> %[[VEC_COND]], <4 x i32> %[[LHS]], <4 x i32> %[[RHS]]1160 1161// OGCG: %[[CMP:.*]] = icmp sgt <4 x i32> {{.*}}, {{.*}}1162// OGCG: %[[SEXT:.*]] = sext <4 x i1> %[[CMP]] to <4 x i32>1163// OGCG: %[[LHS:.*]] = sub <4 x i32> {{.*}}, {{.*}}1164// OGCG: %[[RHS:.*]] = sub <4 x i32> {{.*}}, {{.*}}1165// OGCG: %[[VEC_COND:.*]] = icmp ne <4 x i32> %[[SEXT]], zeroinitializer1166// OGCG: %[[RES:.*]] = select <4 x i1> %[[VEC_COND]], <4 x i32> %[[LHS]], <4 x i32> %[[RHS]]1167 1168void foo22() {1169  vf4 a;1170  vf4 b;1171  vi4 c;1172  vf4 r = c ? a : b;1173}1174 1175// CIR: %[[RES:.*]] = cir.vec.ternary({{.*}}, {{.*}}, {{.*}}) : !cir.vector<4 x !s32i>, !cir.vector<4 x !cir.float>1176 1177// LLVM: %[[VEC_COND:.*]] = icmp ne <4 x i32> {{.*}}, zeroinitializer1178// LLVM: %[[RES:.*]] = select <4 x i1> %[[VEC_COND]], <4 x float> {{.*}}, <4 x float> {{.*}}1179 1180// OGCG: %[[VEC_COND:.*]] = icmp ne <4 x i32> {{.*}}, zeroinitializer1181// OGCG: %[[RES:.*]] = select <4 x i1> %[[VEC_COND]], <4 x float> {{.*}}, <4 x float> {{.*}}1182 1183void foo23() {1184  vi4 a;1185  vi4 b;1186  vi4 u = __builtin_shufflevector(a, b, -1, 1, -1, 1);1187}1188 1189// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1190// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1191// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1192// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1193// CIR: %[[SHUF:.*]] = cir.vec.shuffle(%[[TMP_A]], %[[TMP_B]] : !cir.vector<4 x !s32i>) [#cir.int<-1> :1194// CIR-SAME: !s64i, #cir.int<1> : !s64i, #cir.int<-1> : !s64i, #cir.int<1> : !s64i] : !cir.vector<4 x !s32i>1195 1196// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 161197// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 161198// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161199// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161200// LLVM: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 poison, i32 1, i32 poison, i32 1>1201 1202// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 161203// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 161204// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 161205// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 161206// OGCG: %[[SHUF:.*]] = shufflevector <4 x i32> %[[TMP_A]], <4 x i32> %[[TMP_B]], <4 x i32> <i32 poison, i32 1, i32 poison, i32 1>1207 1208void foo24() {1209  vi4 a;1210  unsigned long size = __builtin_vectorelements(a);1211}1212 1213// CIR: %[[INIT:.*]] = cir.alloca !u64i, !cir.ptr<!u64i>, ["size", init]1214// CIR: %[[SIZE:.*]] = cir.const #cir.int<4> : !u64i1215// CIR: cir.store align(8) %[[SIZE]], %[[INIT]] : !u64i, !cir.ptr<!u64i>1216 1217// LLVM: %[[SIZE:.*]] = alloca i64, i64 1, align 81218// LLVM: store i64 4, ptr %[[SIZE]], align 81219 1220// OGCG: %[[SIZE:.*]] = alloca i64, align 81221// OGCG: store i64 4, ptr %[[SIZE]], align 81222 1223void foo25() {1224  vi4 a;1225  vi4 b;1226  vi4 c = a || b;1227}1228 1229// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1230// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1231// CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init]1232// 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>1233// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1234// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1235// CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1236// CIR: %[[NE_B_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_B]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1237// CIR: %[[RESULT:.*]] = cir.binop(or, %[[NE_A_ZERO]], %[[NE_B_ZERO]]) : !cir.vector<4 x !s32i>1238// CIR: cir.store{{.*}} %[[RESULT]], %[[C_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1239 1240// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161241// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161242// LLVM: %[[C_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161243// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161244// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161245// LLVM: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1246// LLVM: %[[NE_A_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_A_ZERO]] to <4 x i32>1247// LLVM: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1248// LLVM: %[[NE_B_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_B_ZERO]] to <4 x i32>1249// LLVM: %[[RESULT:.*]] = or <4 x i32> %[[NE_A_ZERO_SEXT]], %[[NE_B_ZERO_SEXT]]1250// LLVM: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161251 1252// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161253// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161254// OGCG: %[[C_ADDR:.*]] = alloca <4 x i32>, align 161255// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161256// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161257// OGCG: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1258// OGCG: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1259// OGCG: %[[VEC_OR:.*]] = or <4 x i1> %[[NE_A_ZERO]], %[[NE_B_ZERO]]1260// OGCG: %[[RESULT:.*]] = sext <4 x i1> %[[VEC_OR]] to <4 x i32>1261// OGCG: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161262 1263void foo27() {1264  vh4 a;1265  vh4 b;1266  vh4 c = a + b;1267}1268 1269// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>, ["a"]1270// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>, ["b"]1271// CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>, ["c", init]1272// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !cir.f16>>, !cir.vector<4 x !cir.f16>1273// CIR: %[[TMP_A_F16:.*]] = cir.cast floating %[[TMP_A]] : !cir.vector<4 x !cir.f16> -> !cir.vector<4 x !cir.float>1274// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !cir.f16>>, !cir.vector<4 x !cir.f16>1275// CIR: %[[TMP_B_F16:.*]] = cir.cast floating %[[TMP_B]] : !cir.vector<4 x !cir.f16> -> !cir.vector<4 x !cir.float>1276// CIR: %[[RESULT:.*]] = cir.binop(add, %[[TMP_A_F16]], %[[TMP_B_F16]]) : !cir.vector<4 x !cir.float>1277// CIR: %[[RESULT_VF16:.*]] = cir.cast floating %[[RESULT]] : !cir.vector<4 x !cir.float> -> !cir.vector<4 x !cir.f16>1278// CIR: cir.store{{.*}} %[[RESULT_VF16]], %[[C_ADDR]] : !cir.vector<4 x !cir.f16>, !cir.ptr<!cir.vector<4 x !cir.f16>>1279 1280// LLVM: %[[A_ADDR:.*]] = alloca <4 x half>, i64 1, align 81281// LLVM: %[[B_ADDR:.*]] = alloca <4 x half>, i64 1, align 81282// LLVM: %[[C_ADDR:.*]] = alloca <4 x half>, i64 1, align 81283// LLVM: %[[TMP_A:.*]] = load <4 x half>, ptr %[[A_ADDR]], align 81284// LLVM: %[[TMP_A_F16:.*]] = fpext <4 x half> %[[TMP_A]] to <4 x float>1285// LLVM: %[[TMP_B:.*]] = load <4 x half>, ptr %[[B_ADDR]], align 81286// LLVM: %[[TMP_B_F16:.*]] = fpext <4 x half> %[[TMP_B]] to <4 x float>1287// LLVM: %[[RESULT:.*]] = fadd <4 x float> %[[TMP_A_F16]], %[[TMP_B_F16]]1288// LLVM: %[[RESULT_VF16:.*]] = fptrunc <4 x float> %[[RESULT]] to <4 x half>1289// LLVM: store <4 x half> %[[RESULT_VF16]], ptr %[[C_ADDR]], align 81290 1291// OGCG: %[[A_ADDR:.*]] = alloca <4 x half>, align 81292// OGCG: %[[B_ADDR:.*]] = alloca <4 x half>, align 81293// OGCG: %[[C_ADDR:.*]] = alloca <4 x half>, align 81294// OGCG: %[[TMP_A:.*]] = load <4 x half>, ptr %[[A_ADDR]], align 81295// OGCG: %[[TMP_A_F16:.*]] = fpext <4 x half> %[[TMP_A]] to <4 x float>1296// OGCG: %[[TMP_B:.*]] = load <4 x half>, ptr %[[B_ADDR]], align 81297// OGCG: %[[TMP_B_F16:.*]] = fpext <4 x half> %[[TMP_B]] to <4 x float>1298// OGCG: %[[RESULT:.*]] = fadd <4 x float> %[[TMP_A_F16]], %[[TMP_B_F16]]1299// OGCG: %[[RESULT_VF16:.*]] = fptrunc <4 x float> %[[RESULT]] to <4 x half>1300// OGCG: store <4 x half> %[[RESULT_VF16]], ptr %[[C_ADDR]], align 81301 1302void foo26() {1303  vi4 a;1304  vi4 b;1305  vi4 c = a && b;1306}1307 1308// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1309// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"]1310// CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init]1311// 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>1312// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1313// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1314// CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1315// CIR: %[[NE_B_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_B]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1316// CIR: %[[RESULT:.*]] = cir.binop(and, %[[NE_A_ZERO]], %[[NE_B_ZERO]]) : !cir.vector<4 x !s32i>1317// CIR: cir.store{{.*}} %[[RESULT]], %[[C_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1318 1319// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161320// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161321// LLVM: %[[C_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161322// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161323// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161324// LLVM: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1325// LLVM: %[[NE_A_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_A_ZERO]] to <4 x i32>1326// LLVM: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1327// LLVM: %[[NE_B_ZERO_SEXT:.*]] = sext <4 x i1> %[[NE_B_ZERO]] to <4 x i32>1328// LLVM: %[[RESULT:.*]] = and <4 x i32> %[[NE_A_ZERO_SEXT]], %[[NE_B_ZERO_SEXT]]1329// LLVM: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161330 1331// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161332// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161333// OGCG: %[[C_ADDR:.*]] = alloca <4 x i32>, align 161334// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161335// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[B_ADDR]], align 161336// OGCG: %[[NE_A_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_A]], zeroinitializer1337// OGCG: %[[NE_B_ZERO:.*]] = icmp ne <4 x i32> %[[TMP_B]], zeroinitializer1338// OGCG: %[[VEC_OR:.*]] = and <4 x i1> %[[NE_A_ZERO]], %[[NE_B_ZERO]]1339// OGCG: %[[RESULT:.*]] = sext <4 x i1> %[[VEC_OR]] to <4 x i32>1340// OGCG: store <4 x i32> %[[RESULT]], ptr %[[C_ADDR]], align 161341 1342void logical_not() {1343   vi4 a;1344   vi4 b = !a;1345}1346 1347// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1348// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]1349// CIR: %[[TMP_A:.*]] = cir.load{{.*}}) %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1350// CIR: %[[CONST_V0:.*]] = cir.const #cir.zero : !cir.vector<4 x !s32i>1351// CIR: %[[RESULT:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[CONST_V0]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i>1352// CIR: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1353 1354// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161355// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161356// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161357// LLVM: %[[RESULT:.*]] = icmp eq <4 x i32> %[[TMP_A]], zeroinitializer1358// LLVM: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>1359// LLVM: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 161360 1361// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161362// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161363// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161364// OGCG: %[[RESULT:.*]] = icmp eq <4 x i32> %[[TMP_A]], zeroinitializer1365// OGCG: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>1366// OGCG: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 161367 1368void logical_not_float() {1369  vf4 a;1370  vi4 b = !a;1371}1372 1373// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !cir.float>, !cir.ptr<!cir.vector<4 x !cir.float>>, ["a"]1374// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]1375// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !cir.float>>, !cir.vector<4 x !cir.float>1376// CIR: %[[CONST_V0:.*]] = cir.const #cir.zero : !cir.vector<4 x !cir.float>1377// CIR: %[[RESULT:.*]] = cir.vec.cmp(eq, %[[TMP_A]], %[[CONST_V0]]) : !cir.vector<4 x !cir.float>, !cir.vector<4 x !s32i>1378// CIR: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1379 1380// LLVM: %[[A_ADDR:.*]] = alloca <4 x float>, i64 1, align 161381// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161382// LLVM: %[[TMP_A:.*]] = load <4 x float>, ptr %[[A_ADDR]], align 161383// LLVM: %[[RESULT:.*]] = fcmp oeq <4 x float> %[[TMP_A]], zeroinitializer1384// LLVM: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>1385// LLVM: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 161386 1387// OGCG: %[[A_ADDR:.*]] = alloca <4 x float>, align 161388// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161389// OGCG: %[[TMP_A:.*]] = load <4 x float>, ptr %[[A_ADDR]], align 161390// OGCG: %[[RESULT:.*]] = fcmp oeq <4 x float> %[[TMP_A]], zeroinitializer1391// OGCG: %[[RESULT_VI4:.*]] = sext <4 x i1> %[[RESULT]] to <4 x i32>1392// OGCG: store <4 x i32> %[[RESULT_VI4]], ptr %[[B_ADDR]], align 161393 1394void unary_extension() {1395  vi4 a;1396  vi4 b = __extension__ a;1397}1398 1399// CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"]1400// CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b", init]1401// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>1402// CIR: cir.store{{.*}} %[[TMP_A]], %[[B_ADDR]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>1403 1404// LLVM: %[[A_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161405// LLVM: %[[B_ADDR:.*]] = alloca <4 x i32>, i64 1, align 161406// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161407// LLVM: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 161408 1409// OGCG: %[[A_ADDR:.*]] = alloca <4 x i32>, align 161410// OGCG: %[[B_ADDR:.*]] = alloca <4 x i32>, align 161411// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[A_ADDR]], align 161412// OGCG: store <4 x i32> %[[TMP_A]], ptr %[[B_ADDR]], align 161413