jmciver created this revision. jmciver added reviewers: nikic, efriedma, aqjune, rjmccall, jdoerfert, vitalybuka. Herald added a project: All. jmciver retitled this revision from "[clang][CodeGen] Add noundef metadata to scalar load insturctions (preliminary 2 of 2)" to "[clang][CodeGen] Add noundef metadata to load insturctions (preliminary 2 of 2)". jmciver published this revision for review. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Add support for scalar elements of ext_vector_type Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D137005 Files: clang/lib/CodeGen/CGExpr.cpp clang/test/CodeGenCXX/vector-noundef.cpp
Index: clang/test/CodeGenCXX/vector-noundef.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/vector-noundef.cpp @@ -0,0 +1,84 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py +// RUN: %clang_cc1 -std=c++17 -triple x86_64-gnu-linux -O0 -enable-noundef-load-analysis -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -std=c++17 -triple x86_64-gnu-linux -O0 -no-enable-noundef-load-analysis -emit-llvm -o - %s | FileCheck %s --check-prefix=DISABLE + +using VecOfFourBools __attribute__((ext_vector_type(4))) = bool; +using VecOfThreeChars __attribute__((ext_vector_type(3))) = char; +using VecOfThreeUChars __attribute__((ext_vector_type(3))) = unsigned char; + +// CHECK-LABEL: @_Z15getElement4BoolRDv4_b( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +// CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8 +// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8 +// CHECK-NEXT: [[LOAD_BITS:%.*]] = load i8, ptr [[TMP0]], align 1, !noundef [[NOUNDEF2:![0-9]+]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast i8 [[LOAD_BITS]] to <8 x i1> +// CHECK-NEXT: [[EXTRACTVEC:%.*]] = shufflevector <8 x i1> [[TMP1]], <8 x i1> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3> +// CHECK-NEXT: [[VECEXT:%.*]] = extractelement <4 x i1> [[EXTRACTVEC]], i32 0 +// CHECK-NEXT: ret i1 [[VECEXT]] +// +// DISABLE-LABEL: @_Z15getElement4BoolRDv4_b( +// DISABLE-NEXT: entry: +// DISABLE-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +// DISABLE-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8 +// DISABLE-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8 +// DISABLE-NEXT: [[LOAD_BITS:%.*]] = load i8, ptr [[TMP0]], align 1 +// DISABLE-NEXT: [[TMP1:%.*]] = bitcast i8 [[LOAD_BITS]] to <8 x i1> +// DISABLE-NEXT: [[EXTRACTVEC:%.*]] = shufflevector <8 x i1> [[TMP1]], <8 x i1> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3> +// DISABLE-NEXT: [[VECEXT:%.*]] = extractelement <4 x i1> [[EXTRACTVEC]], i32 0 +// DISABLE-NEXT: ret i1 [[VECEXT]] +// +bool getElement4Bool(VecOfFourBools& a) +{ + return a[0]; +} + +// CHECK-LABEL: @_Z15getElement3CharRDv3_c( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +// CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8 +// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8 +// CHECK-NEXT: [[LOADVEC4:%.*]] = load <4 x i8>, ptr [[TMP0]], align 4, !noundef [[NOUNDEF2]] +// CHECK-NEXT: [[EXTRACTVEC:%.*]] = shufflevector <4 x i8> [[LOADVEC4]], <4 x i8> poison, <3 x i32> <i32 0, i32 1, i32 2> +// CHECK-NEXT: [[VECEXT:%.*]] = extractelement <3 x i8> [[EXTRACTVEC]], i32 0 +// CHECK-NEXT: ret i8 [[VECEXT]] +// +// DISABLE-LABEL: @_Z15getElement3CharRDv3_c( +// DISABLE-NEXT: entry: +// DISABLE-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +// DISABLE-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8 +// DISABLE-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8 +// DISABLE-NEXT: [[LOADVEC4:%.*]] = load <4 x i8>, ptr [[TMP0]], align 4 +// DISABLE-NEXT: [[EXTRACTVEC:%.*]] = shufflevector <4 x i8> [[LOADVEC4]], <4 x i8> poison, <3 x i32> <i32 0, i32 1, i32 2> +// DISABLE-NEXT: [[VECEXT:%.*]] = extractelement <3 x i8> [[EXTRACTVEC]], i32 0 +// DISABLE-NEXT: ret i8 [[VECEXT]] +// +char getElement3Char(VecOfThreeChars& a) +{ + return a[0]; +} + +// CHECK-LABEL: @_Z16getElement3UCharRDv3_h( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +// CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8 +// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8 +// CHECK-NEXT: [[LOADVEC4:%.*]] = load <4 x i8>, ptr [[TMP0]], align 4 +// CHECK-NEXT: [[EXTRACTVEC:%.*]] = shufflevector <4 x i8> [[LOADVEC4]], <4 x i8> poison, <3 x i32> <i32 0, i32 1, i32 2> +// CHECK-NEXT: [[VECEXT:%.*]] = extractelement <3 x i8> [[EXTRACTVEC]], i32 0 +// CHECK-NEXT: ret i8 [[VECEXT]] +// +// DISABLE-LABEL: @_Z16getElement3UCharRDv3_h( +// DISABLE-NEXT: entry: +// DISABLE-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +// DISABLE-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8 +// DISABLE-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8 +// DISABLE-NEXT: [[LOADVEC4:%.*]] = load <4 x i8>, ptr [[TMP0]], align 4 +// DISABLE-NEXT: [[EXTRACTVEC:%.*]] = shufflevector <4 x i8> [[LOADVEC4]], <4 x i8> poison, <3 x i32> <i32 0, i32 1, i32 2> +// DISABLE-NEXT: [[VECEXT:%.*]] = extractelement <3 x i8> [[EXTRACTVEC]], i32 0 +// DISABLE-NEXT: ret i8 [[VECEXT]] +// +char getElement3UChar(VecOfThreeUChars& a) +{ + return a[0]; +} Index: clang/lib/CodeGen/CGExpr.cpp =================================================================== --- clang/lib/CodeGen/CGExpr.cpp +++ clang/lib/CodeGen/CGExpr.cpp @@ -1714,6 +1714,8 @@ cast<llvm::FixedVectorType>(ValTy)->getNumElements(); // Load the `iP` storage object (P is the padded vector size). auto *RawIntV = Builder.CreateLoad(Addr, Volatile, "load_bits"); + applyNoundefToLoadInst(CGM.getCodeGenOpts().EnableNoundefLoadAttr, + ClangVecTy->getElementType(), RawIntV); const auto *RawIntTy = RawIntV->getType(); assert(RawIntTy->isIntegerTy() && "compressed iN storage for bitvectors"); // Bitcast iP --> <P x i1>. @@ -1738,6 +1740,9 @@ Address Cast = Builder.CreateElementBitCast(Addr, vec4Ty, "castToVec4"); // Now load value. llvm::Value *V = Builder.CreateLoad(Cast, Volatile, "loadVec4"); + applyNoundefToLoadInst(CGM.getCodeGenOpts().EnableNoundefLoadAttr, + ClangVecTy->getElementType(), + dyn_cast<llvm::LoadInst>(V)); // Shuffle vector to get vec3. V = Builder.CreateShuffleVector(V, ArrayRef<int>{0, 1, 2}, "extractVec"); return EmitFromMemory(V, Ty);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits