@@ -1095,65 +1095,83 @@ void foo17() {
1095
1095
1096
1096
void foo18 () {
1097
1097
vi4 a = {1 , 2 , 3 , 4 };
1098
- vi4 shl = a << 3 ;
1098
+ int sv = 3 ;
1099
+ vi4 shl = a << sv;
1099
1100
1100
1101
uvi4 b = {1u , 2u , 3u , 4u };
1101
- uvi4 shr = b >> 3u ;
1102
+ unsigned int usv = 3u ;
1103
+ uvi4 shr = b >> usv;
1102
1104
}
1103
1105
1104
1106
// CIR: %[[VEC_A:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a", init]
1107
+ // CIR: %[[SV:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["sv", init]
1105
1108
// CIR: %[[SHL_RES:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["shl", init]
1106
1109
// CIR: %[[VEC_B:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["b", init]
1110
+ // CIR: %[[USV:.*]] = cir.alloca !u32i, !cir.ptr<!u32i>, ["usv", init]
1107
1111
// CIR: %[[SHR_RES:.*]] = cir.alloca !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>, ["shr", init]
1108
- // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
1109
- // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !s32i
1110
- // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !s32i
1111
- // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !s32i
1112
- // CIR: %[[VEC_A_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
1113
- // CIR-SAME: !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
1112
+ // CIR: %[[VEC_A_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !s32i, !s32i, !s32i, !s32i) : !cir.vector<4 x !s32i>
1114
1113
// CIR: cir.store{{.*}} %[[VEC_A_VAL]], %[[VEC_A]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
1114
+ // CIR: %[[SV_VAL:.*]] = cir.const #cir.int<3> : !s32i
1115
+ // CIR: cir.store{{.*}} %[[SV_VAL]], %[[SV]] : !s32i, !cir.ptr<!s32i>
1115
1116
// CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[VEC_A]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i>
1116
- // CIR: %[[SH_AMOUNT :.*]] = cir.const # cir.int<3> : !s32i
1117
- // CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT ]] : !s32i, !cir.vector<4 x !s32i>
1117
+ // CIR: %[[TMP_SV :.*]] = cir.load{{.*}} %[[SV]] : ! cir.ptr<!s32i>, !s32i
1118
+ // CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[TMP_SV ]] : !s32i, !cir.vector<4 x !s32i>
1118
1119
// CIR: %[[SHL:.*]] = cir.shift(left, %[[TMP_A]] : !cir.vector<4 x !s32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !s32i>) -> !cir.vector<4 x !s32i>
1119
1120
// CIR: cir.store{{.*}} %[[SHL]], %[[SHL_RES]] : !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>
1120
- // CIR: %[[CONST_1:.*]] = cir.const #cir.int<1> : !u32i
1121
- // CIR: %[[CONST_2:.*]] = cir.const #cir.int<2> : !u32i
1122
- // CIR: %[[CONST_3:.*]] = cir.const #cir.int<3> : !u32i
1123
- // CIR: %[[CONST_4:.*]] = cir.const #cir.int<4> : !u32i
1124
- // CIR: %[[VEC_B_VAL:.*]] = cir.vec.create(%[[CONST_1]], %[[CONST_2]], %[[CONST_3]], %[[CONST_4]] :
1125
- // CIR-SAME: !u32i, !u32i, !u32i, !u32i) : !cir.vector<4 x !u32i>
1121
+ // CIR: %[[VEC_B_VAL:.*]] = cir.vec.create({{.*}}, {{.*}}, {{.*}}, {{.*}} : !u32i, !u32i, !u32i, !u32i) : !cir.vector<4 x !u32i>
1126
1122
// CIR: cir.store{{.*}} %[[VEC_B_VAL]], %[[VEC_B]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>
1123
+ // CIR: %[[USV_VAL:.*]] = cir.const #cir.int<3> : !u32i
1124
+ // CIR: cir.store{{.*}} %[[USV_VAL]], %[[USV]] : !u32i, !cir.ptr<!u32i>
1127
1125
// CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[VEC_B]] : !cir.ptr<!cir.vector<4 x !u32i>>, !cir.vector<4 x !u32i>
1128
- // CIR: %[[SH_AMOUNT :.*]] = cir.const # cir.int<3> : !u32i
1129
- // CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[SH_AMOUNT ]] : !u32i, !cir.vector<4 x !u32i>
1126
+ // CIR: %[[TMP_USV :.*]] = cir.load{{.*}} %[[USV]] : ! cir.ptr<!u32i>, !u32i
1127
+ // CIR: %[[SPLAT_VEC:.*]] = cir.vec.splat %[[TMP_USV ]] : !u32i, !cir.vector<4 x !u32i>
1130
1128
// CIR: %[[SHR:.*]] = cir.shift(right, %[[TMP_B]] : !cir.vector<4 x !u32i>, %[[SPLAT_VEC]] : !cir.vector<4 x !u32i>) -> !cir.vector<4 x !u32i>
1131
1129
// CIR: cir.store{{.*}} %[[SHR]], %[[SHR_RES]] : !cir.vector<4 x !u32i>, !cir.ptr<!cir.vector<4 x !u32i>>
1132
1130
1133
1131
// LLVM: %[[VEC_A:.*]] = alloca <4 x i32>, i64 1, align 16
1132
+ // LLVM: %[[SV:.*]] = alloca i32, i64 1, align 4
1134
1133
// LLVM: %[[SHL_RES:.*]] = alloca <4 x i32>, i64 1, align 16
1135
1134
// LLVM: %[[VEC_B:.*]] = alloca <4 x i32>, i64 1, align 16
1135
+ // LLVM: %[[USV:.*]] = alloca i32, i64 1, align 4
1136
1136
// LLVM: %[[SHR_RES:.*]] = alloca <4 x i32>, i64 1, align 16
1137
1137
// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16
1138
+ // LLVM: store i32 3, ptr %[[SV]], align 4
1138
1139
// LLVM: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
1139
- // LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)
1140
+ // LLVM: %[[TMP_SV:.*]] = load i32, ptr %[[SV]], align 4
1141
+ // LLVM: %[[SI:.*]] = insertelement <4 x i32> poison, i32 %[[TMP_SV]], i64 0
1142
+ // LLVM: %[[S_VEC:.*]] = shufflevector <4 x i32> %[[SI]], <4 x i32> poison, <4 x i32> zeroinitializer
1143
+ // LLVM: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[S_VEC]]
1140
1144
// LLVM: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16
1141
1145
// LLVM: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 16
1146
+ // LLVM: store i32 3, ptr %[[USV]], align 4
1142
1147
// LLVM: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
1143
- // LLVM: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)
1148
+ // LLVM: %[[TMP_USV:.*]] = load i32, ptr %[[USV]], align 4
1149
+ // LLVM: %[[USI:.*]] = insertelement <4 x i32> poison, i32 %[[TMP_USV]], i64 0
1150
+ // LLVM: %[[US_VEC:.*]] = shufflevector <4 x i32> %[[USI]], <4 x i32> poison, <4 x i32> zeroinitializer
1151
+ // LLVM: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], %[[US_VEC]]
1144
1152
// LLVM: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16
1145
1153
1146
1154
// OGCG: %[[VEC_A:.*]] = alloca <4 x i32>, align 16
1155
+ // OGCG: %[[SV:.*]] = alloca i32, align 4
1147
1156
// OGCG: %[[SHL_RES:.*]] = alloca <4 x i32>, align 16
1148
1157
// OGCG: %[[VEC_B:.*]] = alloca <4 x i32>, align 16
1158
+ // OGCG: %[[USV:.*]] = alloca i32, align 4
1149
1159
// OGCG: %[[SHR_RES:.*]] = alloca <4 x i32>, align 16
1150
1160
// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_A]], align 16
1161
+ // OGCG: store i32 3, ptr %[[SV]], align 4
1151
1162
// OGCG: %[[TMP_A:.*]] = load <4 x i32>, ptr %[[VEC_A]], align 16
1152
- // OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], splat (i32 3)
1163
+ // OGCG: %[[TMP_SV:.*]] = load i32, ptr %[[SV]], align 4
1164
+ // OGCG: %[[SI:.*]] = insertelement <4 x i32> poison, i32 %[[TMP_SV]], i64 0
1165
+ // OGCG: %[[S_VEC:.*]] = shufflevector <4 x i32> %[[SI]], <4 x i32> poison, <4 x i32> zeroinitializer
1166
+ // OGCG: %[[SHL:.*]] = shl <4 x i32> %[[TMP_A]], %[[S_VEC]]
1153
1167
// OGCG: store <4 x i32> %[[SHL]], ptr %[[SHL_RES]], align 16
1154
1168
// OGCG: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr %[[VEC_B]], align 16
1169
+ // OGCG: store i32 3, ptr %[[USV]], align 4
1155
1170
// OGCG: %[[TMP_B:.*]] = load <4 x i32>, ptr %[[VEC_B]], align 16
1156
- // OGCG: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], splat (i32 3)
1171
+ // OGCG: %[[TMP_USV:.*]] = load i32, ptr %[[USV]], align 4
1172
+ // OGCG: %[[USI:.*]] = insertelement <4 x i32> poison, i32 %[[TMP_USV]], i64 0
1173
+ // OGCG: %[[US_VEC:.*]] = shufflevector <4 x i32> %[[USI]], <4 x i32> poison, <4 x i32> zeroinitializer
1174
+ // OGCG: %[[SHR:.*]] = lshr <4 x i32> %[[TMP_B]], %[[US_VEC]]
1157
1175
// OGCG: store <4 x i32> %[[SHR]], ptr %[[SHR_RES]], align 16
1158
1176
1159
1177
void foo19 () {
0 commit comments