aeubanks updated this revision to Diff 462247. aeubanks added a comment. add flag to disable (to be removed in the future) "fix" lldb test skip on msan instrumented functions
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133036/new/ https://reviews.llvm.org/D133036 Files: clang/test/CodeGenOpenCL/overload.cl lldb/test/API/functionalities/optimized_code/main.cpp llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp llvm/test/Transforms/InstCombine/call-undef.ll llvm/test/Transforms/InstCombine/out-of-bounds-indexes.ll
Index: llvm/test/Transforms/InstCombine/out-of-bounds-indexes.ll =================================================================== --- llvm/test/Transforms/InstCombine/out-of-bounds-indexes.ll +++ llvm/test/Transforms/InstCombine/out-of-bounds-indexes.ll @@ -6,7 +6,7 @@ ; CHECK-LABEL: @test_out_of_bounds( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[AND1:%.*]] = and i32 [[A:%.*]], 3 -; CHECK-NEXT: tail call void @llvm.assume(i1 poison) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret i32 [[AND1]] ; entry: @@ -20,7 +20,7 @@ define i128 @test_non64bit(i128 %a) { ; CHECK-LABEL: @test_non64bit( ; CHECK-NEXT: [[AND1:%.*]] = and i128 [[A:%.*]], 3 -; CHECK-NEXT: tail call void @llvm.assume(i1 poison) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret i128 [[AND1]] ; %and1 = and i128 %a, 3 Index: llvm/test/Transforms/InstCombine/call-undef.ll =================================================================== --- llvm/test/Transforms/InstCombine/call-undef.ll +++ llvm/test/Transforms/InstCombine/call-undef.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=instcombine -S | FileCheck %s +; RUN: opt < %s -passes=instcombine -S -instcombine-disable-optimize-passing-undef-ub | FileCheck %s --check-prefix=DISABLE declare void @c(i32 noundef) declare void @d(ptr dereferenceable(1)) @@ -8,8 +9,12 @@ define void @test1() { ; CHECK-LABEL: @test1( -; CHECK-NEXT: call void @c(i32 undef) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test1( +; DISABLE-NEXT: call void @c(i32 undef) +; DISABLE-NEXT: ret void ; call void @c(i32 undef) ret void @@ -17,8 +22,12 @@ define void @test2() { ; CHECK-LABEL: @test2( -; CHECK-NEXT: call void @c(i32 poison) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test2( +; DISABLE-NEXT: call void @c(i32 poison) +; DISABLE-NEXT: ret void ; call void @c(i32 poison) ret void @@ -26,8 +35,12 @@ define void @test3() { ; CHECK-LABEL: @test3( -; CHECK-NEXT: call void @e(i32 noundef undef) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test3( +; DISABLE-NEXT: call void @e(i32 noundef undef) +; DISABLE-NEXT: ret void ; call void @e(i32 noundef undef) ret void @@ -35,8 +48,12 @@ define void @test4() { ; CHECK-LABEL: @test4( -; CHECK-NEXT: call void @e(i32 noundef poison) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test4( +; DISABLE-NEXT: call void @e(i32 noundef poison) +; DISABLE-NEXT: ret void ; call void @e(i32 noundef poison) ret void @@ -44,8 +61,12 @@ define void @test5() { ; CHECK-LABEL: @test5( -; CHECK-NEXT: call void @d(ptr undef) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test5( +; DISABLE-NEXT: call void @d(ptr undef) +; DISABLE-NEXT: ret void ; call void @d(ptr undef) ret void @@ -53,8 +74,12 @@ define void @test6() { ; CHECK-LABEL: @test6( -; CHECK-NEXT: call void @d(ptr poison) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test6( +; DISABLE-NEXT: call void @d(ptr poison) +; DISABLE-NEXT: ret void ; call void @d(ptr poison) ret void @@ -62,8 +87,12 @@ define void @test7() { ; CHECK-LABEL: @test7( -; CHECK-NEXT: call void @f(ptr dereferenceable(1) undef) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test7( +; DISABLE-NEXT: call void @f(ptr dereferenceable(1) undef) +; DISABLE-NEXT: ret void ; call void @f(ptr dereferenceable(1) undef) ret void @@ -71,17 +100,38 @@ define void @test8() { ; CHECK-LABEL: @test8( -; CHECK-NEXT: call void @f(ptr dereferenceable(1) poison) +; CHECK-NEXT: store i1 true, ptr poison, align 1 ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test8( +; DISABLE-NEXT: call void @f(ptr dereferenceable(1) poison) +; DISABLE-NEXT: ret void ; call void @f(ptr dereferenceable(1) poison) ret void } +define void @test9() sanitize_memory { +; CHECK-LABEL: @test9( +; CHECK-NEXT: call void @c(i32 undef) +; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test9( +; DISABLE-NEXT: call void @c(i32 undef) +; DISABLE-NEXT: ret void +; + call void @c(i32 undef) + ret void +} + define void @test_mismatched_call() { ; CHECK-LABEL: @test_mismatched_call( ; CHECK-NEXT: call void @e(i8 poison) ; CHECK-NEXT: ret void +; +; DISABLE-LABEL: @test_mismatched_call( +; DISABLE-NEXT: call void @e(i8 poison) +; DISABLE-NEXT: ret void ; call void @e(i8 poison) ret void Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp =================================================================== --- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -88,6 +88,12 @@ cl::desc("How wide an instruction window to bypass looking for " "another guard")); +// TODO: remove this flag after LLVM ToT users have resolved issues around this. +static cl::opt<bool> DisableOptimizePassingUndefUB( + "instcombine-disable-optimize-passing-undef-ub", cl::init(false), + cl::desc("Disable optimizing away undefined behavior around passing undef " + "to noundef params")); + namespace llvm { /// enable preservation of attributes in assume like: /// call void @llvm.assume(i1 true) [ "nonnull"(i32* %PTR) ] @@ -2957,6 +2963,20 @@ return nullptr; } +static bool callPassesUndefToPassingUndefUBParam(CallBase &Call) { + if (DisableOptimizePassingUndefUB) + return false; + // Optimizing this hurts msan's usefulness. + if (Call.getParent()->getParent()->hasFnAttribute(Attribute::SanitizeMemory)) + return false; + for (unsigned I = 0; I < Call.arg_size(); ++I) { + if (isa<UndefValue>(Call.getArgOperand(I)) && Call.isPassingUndefUB(I)) { + return true; + } + } + return false; +} + bool InstCombinerImpl::annotateAnyAllocSite(CallBase &Call, const TargetLibraryInfo *TLI) { // Note: We only handle cases which can't be driven from generic attributes @@ -3083,9 +3103,11 @@ // Calling a null function pointer is undefined if a null address isn't // dereferenceable. + // Passing undef/poison to any parameter where doing so is UB is undefined (of + // course). if ((isa<ConstantPointerNull>(Callee) && !NullPointerIsDefined(Call.getFunction())) || - isa<UndefValue>(Callee)) { + isa<UndefValue>(Callee) || callPassesUndefToPassingUndefUBParam(Call)) { // If Call does not return void then replaceInstUsesWith poison. // This allows ValueHandlers and custom metadata to adjust itself. if (!Call.getType()->isVoidTy()) Index: lldb/test/API/functionalities/optimized_code/main.cpp =================================================================== --- lldb/test/API/functionalities/optimized_code/main.cpp +++ lldb/test/API/functionalities/optimized_code/main.cpp @@ -12,7 +12,7 @@ struct S2 { char a, b; - int pad; + volatile int pad; S2(int x) { a = x & 0xff; b = x & 0xff00; Index: clang/test/CodeGenOpenCL/overload.cl =================================================================== --- clang/test/CodeGenOpenCL/overload.cl +++ clang/test/CodeGenOpenCL/overload.cl @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -no-opaque-pointers -cl-std=CL2.0 -emit-llvm -o - -triple spir-unknown-unknown %s | FileCheck %s -// RUN: %clang_cc1 -no-opaque-pointers -cl-std=CL3.0 -cl-ext=+__opencl_c_generic_address_space -emit-llvm -o - -triple spir-unknown-unknown %s | FileCheck %s +// RUN: %clang_cc1 -disable-llvm-passes -no-opaque-pointers -cl-std=CL2.0 -emit-llvm -o - -triple spir-unknown-unknown %s | FileCheck %s +// RUN: %clang_cc1 -disable-llvm-passes -no-opaque-pointers -cl-std=CL3.0 -cl-ext=+__opencl_c_generic_address_space -emit-llvm -o - -triple spir-unknown-unknown %s | FileCheck %s typedef short short4 __attribute__((ext_vector_type(4))); @@ -21,18 +21,18 @@ generic int *generic *gengen; generic int *local *genloc; generic int *global *genglob; - // CHECK-DAG: call spir_func void @_Z3fooPU3AS1iS0_(i32 addrspace(1)* noundef undef, i32 addrspace(1)* noundef undef) + // CHECK-DAG: call spir_func void @_Z3fooPU3AS1iS0_(i32 addrspace(1)* noundef {{.*}}, i32 addrspace(1)* noundef {{.*}}) foo(a, b); - // CHECK-DAG: call spir_func void @_Z3fooPU3AS4iS0_(i32 addrspace(4)* noundef undef, i32 addrspace(4)* noundef undef) + // CHECK-DAG: call spir_func void @_Z3fooPU3AS4iS0_(i32 addrspace(4)* noundef {{.*}}, i32 addrspace(4)* noundef {{.*}}) foo(b, c); - // CHECK-DAG: call spir_func void @_Z3fooPU3AS4iS0_(i32 addrspace(4)* noundef undef, i32 addrspace(4)* noundef undef) + // CHECK-DAG: call spir_func void @_Z3fooPU3AS4iS0_(i32 addrspace(4)* noundef {{.*}}, i32 addrspace(4)* noundef {{.*}}) foo(a, d); - // CHECK-DAG: call spir_func void @_Z3barPU3AS4PU3AS4iS2_(i32 addrspace(4)* addrspace(4)* noundef undef, i32 addrspace(4)* addrspace(4)* noundef undef) + // CHECK-DAG: call spir_func void @_Z3barPU3AS4PU3AS4iS2_(i32 addrspace(4)* addrspace(4)* noundef {{.*}}, i32 addrspace(4)* addrspace(4)* noundef {{.*}}) bar(gengen, genloc); - // CHECK-DAG: call spir_func void @_Z3barPU3AS4PU3AS4iS2_(i32 addrspace(4)* addrspace(4)* noundef undef, i32 addrspace(4)* addrspace(4)* noundef undef) + // CHECK-DAG: call spir_func void @_Z3barPU3AS4PU3AS4iS2_(i32 addrspace(4)* addrspace(4)* noundef {{.*}}, i32 addrspace(4)* addrspace(4)* noundef {{.*}}) bar(gengen, genglob); - // CHECK-DAG: call spir_func void @_Z3barPU3AS1PU3AS4iS2_(i32 addrspace(4)* addrspace(1)* noundef undef, i32 addrspace(4)* addrspace(1)* noundef undef) + // CHECK-DAG: call spir_func void @_Z3barPU3AS1PU3AS4iS2_(i32 addrspace(4)* addrspace(1)* noundef {{.*}}, i32 addrspace(4)* addrspace(1)* noundef {{.*}}) bar(genglob, genglob); } @@ -40,8 +40,8 @@ void kernel test2() { short4 e0=0; - // CHECK-DAG: call spir_func <4 x i16> @_Z5clampDv4_sss(<4 x i16> noundef zeroinitializer, i16 noundef signext 0, i16 noundef signext 255) + // CHECK-DAG: call spir_func <4 x i16> @_Z5clampDv4_sss(<4 x i16> noundef {{.*}}, i16 noundef signext 0, i16 noundef signext 255) clamp(e0, 0, 255); - // CHECK-DAG: call spir_func <4 x i16> @_Z5clampDv4_sS_S_(<4 x i16> noundef zeroinitializer, <4 x i16> noundef zeroinitializer, <4 x i16> noundef zeroinitializer) + // CHECK-DAG: call spir_func <4 x i16> @_Z5clampDv4_sS_S_(<4 x i16> noundef {{.*}}, <4 x i16> noundef {{.*}}, <4 x i16> noundef {{.*}}) clamp(e0, e0, e0); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits