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);
}
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits