================
@@ -219,3 +219,65 @@ void OneScalarOp() {
 
   four_ll ? four_ll : some_ll;
 }
+
+constexpr TwoBools constexpr_two_bools{false, true};
+// CHECK-LABEL: define internal noundef double 
@_ZL16constexpr_vectorDv2_bDv2_iS0_(
+// CHECK-SAME: i8 noundef [[C_COERCE:%.*]], double noundef [[A_COERCE:%.*]], 
double noundef [[B_COERCE:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT:  [[ENTRY:.*:]]
+// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    [[C:%.*]] = alloca i8, align 1
+// CHECK-NEXT:    [[A:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    [[B:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca i8, align 1
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    store i8 [[C_COERCE]], ptr [[C]], align 1
+// CHECK-NEXT:    [[LOAD_BITS:%.*]] = load i8, ptr [[C]], align 1
+// CHECK-NEXT:    [[TMP0:%.*]] = bitcast i8 [[LOAD_BITS]] to <8 x i1>
+// CHECK-NEXT:    [[C1:%.*]] = shufflevector <8 x i1> [[TMP0]], <8 x i1> 
poison, <2 x i32> <i32 0, i32 1>
+// CHECK-NEXT:    store double [[A_COERCE]], ptr [[A]], align 8
+// CHECK-NEXT:    [[A2:%.*]] = load <2 x i32>, ptr [[A]], align 8
+// CHECK-NEXT:    store double [[B_COERCE]], ptr [[B]], align 8
+// CHECK-NEXT:    [[B3:%.*]] = load <2 x i32>, ptr [[B]], align 8
+// CHECK-NEXT:    [[INSERTVEC:%.*]] = shufflevector <2 x i1> [[C1]], <2 x i1> 
poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 
poison, i32 poison, i32 poison>
+// CHECK-NEXT:    [[TMP1:%.*]] = bitcast <8 x i1> [[INSERTVEC]] to i8
+// CHECK-NEXT:    store i8 [[TMP1]], ptr [[C_ADDR]], align 1
+// CHECK-NEXT:    store <2 x i32> [[A2]], ptr [[A_ADDR]], align 8
+// CHECK-NEXT:    store <2 x i32> [[B3]], ptr [[B_ADDR]], align 8
+// CHECK-NEXT:    [[LOAD_BITS4:%.*]] = load i8, ptr [[C_ADDR]], align 1
+// CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8 [[LOAD_BITS4]] to <8 x i1>
+// CHECK-NEXT:    [[EXTRACTVEC:%.*]] = shufflevector <8 x i1> [[TMP2]], <8 x 
i1> poison, <2 x i32> <i32 0, i32 1>
+// CHECK-NEXT:    [[TMP3:%.*]] = load <2 x i32>, ptr [[A_ADDR]], align 8
+// CHECK-NEXT:    [[TMP4:%.*]] = load <2 x i32>, ptr [[B_ADDR]], align 8
+// CHECK-NEXT:    [[VECTOR_SELECT:%.*]] = select <2 x i1> [[EXTRACTVEC]], <2 x 
i32> [[TMP3]], <2 x i32> [[TMP4]]
+// CHECK-NEXT:    store <2 x i32> [[VECTOR_SELECT]], ptr [[RETVAL]], align 8
+// CHECK-NEXT:    [[TMP5:%.*]] = load double, ptr [[RETVAL]], align 8
+// CHECK-NEXT:    ret double [[TMP5]]
+//
+constexpr static TwoInts constexpr_vector(TwoBools c, TwoInts a, TwoInts b) {
+  return c ? a : b;
+}
+
+// CHECK-LABEL: define dso_local void @_Z14UseConstexprOpv(
+// CHECK-SAME: ) #[[ATTR0]] {
+// CHECK-NEXT:  [[ENTRY:.*:]]
+// CHECK-NEXT:    [[COERCE:%.*]] = alloca i8, align 1
+// CHECK-NEXT:    [[COERCE1:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    [[COERCE2:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    [[COERCE3:%.*]] = alloca <2 x i32>, align 8
+// CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i32>, ptr @two_ints, align 8
+// CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i32>, ptr @two_ints, align 8
+// CHECK-NEXT:    store i8 bitcast (<8 x i1> <i1 false, i1 true, i1 undef, i1 
undef, i1 undef, i1 undef, i1 undef, i1 undef> to i8), ptr [[COERCE]], align 1
+// CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[COERCE]], align 1
+// CHECK-NEXT:    store <2 x i32> [[TMP0]], ptr [[COERCE1]], align 8
+// CHECK-NEXT:    [[TMP3:%.*]] = load double, ptr [[COERCE1]], align 8
+// CHECK-NEXT:    store <2 x i32> [[TMP1]], ptr [[COERCE2]], align 8
+// CHECK-NEXT:    [[TMP4:%.*]] = load double, ptr [[COERCE2]], align 8
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef double 
@_ZL16constexpr_vectorDv2_bDv2_iS0_(i8 noundef [[TMP2]], double noundef 
[[TMP3]], double noundef [[TMP4]])
+// CHECK-NEXT:    store double [[CALL]], ptr [[COERCE3]], align 8
+// CHECK-NEXT:    [[TMP5:%.*]] = load <2 x i32>, ptr [[COERCE3]], align 8
+// CHECK-NEXT:    ret void
+//
+void UseConstexprOp() {
+  constexpr_vector(constexpr_two_bools, two_ints, two_ints);
----------------
erichkeane wrote:

you'd want to assign this return to a constexpr variable to force this to do 
constexpr eval.

https://github.com/llvm/llvm-project/pull/154145
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to