From 108575f02ea9927009ed81231474d3a6f053602f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 22 May 2024 07:40:08 +0200 Subject: [PATCH] [IR] Avoid creating icmp/fcmp constant expressions (#92885) Do not create icmp/fcmp constant expressions in IRBuilder etc anymore, i.e. treat them as "undesirable". This is in preparation for removing them entirely. Part of: https://discourse.llvm.org/t/rfc-remove-most-constant-expressions/63179 --- clang/test/Analysis/builtin_signbit.cpp | 36 +++--- .../catch-nullptr-and-nonzero-offset.c | 62 +++++++---- clang/test/CodeGen/constantexpr-fneg.c | 3 +- clang/test/CodeGenCXX/cxx11-thread-local.cpp | 20 ++-- .../test/CodeGenCXX/ubsan-nullability-arg.cpp | 3 +- clang/test/CodeGenCXX/weak-external.cpp | 15 ++- clang/test/Driver/linker-wrapper-image.c | 98 +++++++++-------- clang/test/OpenMP/threadprivate_codegen.cpp | 104 ++++++++++-------- llvm/include/llvm/Analysis/TargetFolder.h | 2 +- llvm/include/llvm/IR/ConstantFolder.h | 2 +- llvm/lib/Analysis/ConstantFolding.cpp | 2 +- llvm/lib/IR/ConstantFold.cpp | 13 ++- llvm/test/Assembler/ConstantExprFold.ll | 4 +- llvm/test/Assembler/ConstantExprNoFold.ll | 4 +- llvm/test/Assembler/vector-cmp.ll | 2 +- .../AMDGPU/lower-ctor-dtor-constexpr-alias.ll | 3 +- llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll | 3 +- .../AMDGPU/lower-multiple-ctor-dtor.ll | 3 +- .../MemorySanitizer/check-constant-shadow.ll | 3 +- .../SanitizerBinaryMetadata/atomics.ll | 12 +- .../Transforms/Attributor/value-simplify.ll | 7 +- .../binop-select-cast-of-select-cond.ll | 2 +- .../constant-fold-address-space-pointer.ll | 6 +- .../Transforms/InstCombine/getelementptr.ll | 3 +- ...hoist-xor-by-constant-from-xor-by-value.ll | 3 +- llvm/test/Transforms/InstCombine/pr33453.ll | 2 +- llvm/test/Transforms/InstCombine/pr83947.ll | 4 +- llvm/test/Transforms/InstCombine/rem.ll | 4 +- .../Transforms/InstCombine/select-and-or.ll | 4 +- .../InstCombine/select-safe-transforms.ll | 4 +- .../InstSimplify/ConstProp/bitcast.ll | 9 +- .../InstSimplify/ConstProp/icmp-global.ll | 54 ++++++--- .../InstSimplify/bitcast-vector-fold.ll | 3 +- llvm/test/Transforms/InstSimplify/compare.ll | 6 +- .../Transforms/InstSimplify/past-the-end.ll | 6 +- .../JumpThreading/constant-fold-status.ll | 3 +- .../LowerTypeTests/cfi-direct-call1.ll | 10 +- .../LowerTypeTests/function-weak.ll | 74 +++++++------ .../test/Transforms/SCCP/conditions-ranges.ll | 9 +- .../phi-to-select-constexpr-icmp.ll | 2 +- 40 files changed, 353 insertions(+), 256 deletions(-) diff --git a/clang/test/Analysis/builtin_signbit.cpp b/clang/test/Analysis/builtin_signbit.cpp index 57e6816ce280218..be10f0950f69b7c 100644 --- a/clang/test/Analysis/builtin_signbit.cpp +++ b/clang/test/Analysis/builtin_signbit.cpp @@ -84,28 +84,30 @@ long double ld = -1.0L; // CHECK-LE-LABEL: define dso_local void @_Z12test_signbitv( // CHECK-LE-SAME: ) #[[ATTR0:[0-9]+]] { // CHECK-LE-NEXT: entry: -// CHECK-LE-NEXT: [[FROMBOOL:%.*]] = zext i1 icmp slt (i64 trunc (i128 bitcast (ppc_fp128 0xM3FF00000000000000000000000000000 to i128) to i64), i64 0) to i8 +// CHECK-LE-NEXT: [[TMP0:%.*]] = icmp slt i64 trunc (i128 bitcast (ppc_fp128 0xM3FF00000000000000000000000000000 to i128) to i64), 0 +// CHECK-LE-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TMP0]] to i8 // CHECK-LE-NEXT: store i8 [[FROMBOOL]], ptr @b, align 1 -// CHECK-LE-NEXT: [[TMP0:%.*]] = load ppc_fp128, ptr @ld, align 16 -// CHECK-LE-NEXT: [[TMP1:%.*]] = bitcast ppc_fp128 [[TMP0]] to i128 -// CHECK-LE-NEXT: [[TMP2:%.*]] = trunc i128 [[TMP1]] to i64 -// CHECK-LE-NEXT: [[TMP3:%.*]] = icmp slt i64 [[TMP2]], 0 -// CHECK-LE-NEXT: [[FROMBOOL1:%.*]] = zext i1 [[TMP3]] to i8 +// CHECK-LE-NEXT: [[TMP1:%.*]] = load ppc_fp128, ptr @ld, align 16 +// CHECK-LE-NEXT: [[TMP2:%.*]] = bitcast ppc_fp128 [[TMP1]] to i128 +// CHECK-LE-NEXT: [[TMP3:%.*]] = trunc i128 [[TMP2]] to i64 +// CHECK-LE-NEXT: [[TMP4:%.*]] = icmp slt i64 [[TMP3]], 0 +// CHECK-LE-NEXT: [[FROMBOOL1:%.*]] = zext i1 [[TMP4]] to i8 // CHECK-LE-NEXT: store i8 [[FROMBOOL1]], ptr @b, align 1 // CHECK-LE-NEXT: store i8 0, ptr @b, align 1 -// CHECK-LE-NEXT: [[TMP4:%.*]] = load double, ptr @d, align 8 -// CHECK-LE-NEXT: [[CONV:%.*]] = fptrunc double [[TMP4]] to float -// CHECK-LE-NEXT: [[TMP5:%.*]] = bitcast float [[CONV]] to i32 -// CHECK-LE-NEXT: [[TMP6:%.*]] = icmp slt i32 [[TMP5]], 0 -// CHECK-LE-NEXT: [[FROMBOOL2:%.*]] = zext i1 [[TMP6]] to i8 +// CHECK-LE-NEXT: [[TMP5:%.*]] = load double, ptr @d, align 8 +// CHECK-LE-NEXT: [[CONV:%.*]] = fptrunc double [[TMP5]] to float +// CHECK-LE-NEXT: [[TMP6:%.*]] = bitcast float [[CONV]] to i32 +// CHECK-LE-NEXT: [[TMP7:%.*]] = icmp slt i32 [[TMP6]], 0 +// CHECK-LE-NEXT: [[FROMBOOL2:%.*]] = zext i1 [[TMP7]] to i8 // CHECK-LE-NEXT: store i8 [[FROMBOOL2]], ptr @b, align 1 -// CHECK-LE-NEXT: [[FROMBOOL3:%.*]] = zext i1 icmp slt (i64 trunc (i128 bitcast (ppc_fp128 0xM3FF00000000000000000000000000000 to i128) to i64), i64 0) to i8 +// CHECK-LE-NEXT: [[TMP8:%.*]] = icmp slt i64 trunc (i128 bitcast (ppc_fp128 0xM3FF00000000000000000000000000000 to i128) to i64), 0 +// CHECK-LE-NEXT: [[FROMBOOL3:%.*]] = zext i1 [[TMP8]] to i8 // CHECK-LE-NEXT: store i8 [[FROMBOOL3]], ptr @b, align 1 -// CHECK-LE-NEXT: [[TMP7:%.*]] = load ppc_fp128, ptr @ld, align 16 -// CHECK-LE-NEXT: [[TMP8:%.*]] = bitcast ppc_fp128 [[TMP7]] to i128 -// CHECK-LE-NEXT: [[TMP9:%.*]] = trunc i128 [[TMP8]] to i64 -// CHECK-LE-NEXT: [[TMP10:%.*]] = icmp slt i64 [[TMP9]], 0 -// CHECK-LE-NEXT: [[FROMBOOL4:%.*]] = zext i1 [[TMP10]] to i8 +// CHECK-LE-NEXT: [[TMP9:%.*]] = load ppc_fp128, ptr @ld, align 16 +// CHECK-LE-NEXT: [[TMP10:%.*]] = bitcast ppc_fp128 [[TMP9]] to i128 +// CHECK-LE-NEXT: [[TMP11:%.*]] = trunc i128 [[TMP10]] to i64 +// CHECK-LE-NEXT: [[TMP12:%.*]] = icmp slt i64 [[TMP11]], 0 +// CHECK-LE-NEXT: [[FROMBOOL4:%.*]] = zext i1 [[TMP12]] to i8 // CHECK-LE-NEXT: store i8 [[FROMBOOL4]], ptr @b, align 1 // CHECK-LE-NEXT: ret void // diff --git a/clang/test/CodeGen/catch-nullptr-and-nonzero-offset.c b/clang/test/CodeGen/catch-nullptr-and-nonzero-offset.c index 015102940890a52..e93dbcb9f647bf7 100644 --- a/clang/test/CodeGen/catch-nullptr-and-nonzero-offset.c +++ b/clang/test/CodeGen/catch-nullptr-and-nonzero-offset.c @@ -217,8 +217,10 @@ char *nullptr_zero(void) { char *nullptr_one_BAD(void) { // CHECK: define{{.*}} ptr @nullptr_one_BAD() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: br i1 false, label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize - // CHECK-SANITIZE-CPP-NEXT: br i1 icmp eq (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 1) to i64), i64 0), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP:.*]] = icmp ne i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 1) to i64), 0, !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[COND:.*]] = and i1 false, %[[CMP]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[COND:.*]] = icmp eq i1 false, %[[CMP]], !nosanitize + // CHECK-SANITIZE-NEXT: br i1 %[[COND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_700]], i64 0, i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 1) to i64)) // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_700]], i64 0, i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 1) to i64)) @@ -235,8 +237,10 @@ char *nullptr_one_BAD(void) { char *nullptr_allones_BAD(void) { // CHECK: define{{.*}} ptr @nullptr_allones_BAD() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: br i1 false, label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize - // CHECK-SANITIZE-CPP-NEXT: br i1 icmp eq (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 -1) to i64), i64 0), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP:.*]] = icmp ne i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 -1) to i64), 0, !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[COND:.*]] = and i1 false, %[[CMP]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[COND:.*]] = icmp eq i1 false, %[[CMP]], !nosanitize + // CHECK-SANITIZE-NEXT: br i1 %[[COND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_800]], i64 0, i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 -1) to i64)) // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_800]], i64 0, i64 ptrtoint (ptr getelementptr inbounds (i8, ptr null, i64 -1) to i64)) @@ -264,9 +268,10 @@ char *one_var(unsigned long offset) { // CHECK-SANITIZE-NEXT: %[[OR_OV:.+]] = or i1 %[[COMPUTED_OFFSET_OVERFLOWED]], false, !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_OFFSET:.*]] = extractvalue { i64, i1 } %[[COMPUTED_OFFSET_AGGREGATE]], 0, !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP:.*]] = add i64 1, %[[COMPUTED_OFFSET]], !nosanitize + // CHECK-SANITIZE-NEXT: %[[OTHER_IS_NOT_NULL:.*]] = icmp ne ptr inttoptr (i64 1 to ptr), null // CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_NOT_NULL:.*]] = icmp ne i64 %[[COMPUTED_GEP]], 0, !nosanitize - // CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize - // CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[OTHER_IS_NOT_NULL]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[OTHER_IS_NOT_NULL]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_OFFSET_DID_NOT_OVERFLOW:.*]] = xor i1 %[[OR_OV]], true, !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_UGE_BASE:.*]] = icmp uge i64 %[[COMPUTED_GEP]], 1, !nosanitize // CHECK-SANITIZE-NEXT: %[[GEP_DID_NOT_OVERFLOW:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], %[[COMPUTED_OFFSET_DID_NOT_OVERFLOW]], !nosanitize @@ -287,7 +292,9 @@ char *one_var(unsigned long offset) { char *one_zero(void) { // CHECK: define{{.*}} ptr @one_zero() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: br i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[CMP:.*]] = icmp ne ptr inttoptr (i64 1 to ptr), null + // CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 %[[CMP]], true + // CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE-C: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-C-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1000]], i64 1, i64 1) // CHECK-SANITIZE-RECOVER-C-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_1000]], i64 1, i64 1) @@ -304,9 +311,11 @@ char *one_zero(void) { char *one_one_OK(void) { // CHECK: define{{.*}} ptr @one_one_OK() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1), i64 0), !nosanitize - // CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize - // CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP1:.*]] = icmp ne ptr inttoptr (i64 1 to ptr), null, !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP2:.*]] = icmp ne i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1), 0, !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[COND:.*]] = and i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[COND:.*]] = icmp eq i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-NEXT: br i1 %[[COND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1100]], i64 1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1)) // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_1100]], i64 1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 1) to i64), i64 1), i64 1)) @@ -323,9 +332,11 @@ char *one_one_OK(void) { char *one_allones_BAD(void) { // CHECK: define{{.*}} ptr @one_allones_BAD() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1), i64 0), !nosanitize - // CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize - // CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP1:.*]] = icmp ne ptr inttoptr (i64 1 to ptr), null, !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP2:.*]] = icmp ne i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1), 0, !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[COND:.*]] = and i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[COND:.*]] = icmp eq i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-NEXT: br i1 %[[COND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1200]], i64 1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1)) // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_1200]], i64 1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 1 to ptr), i64 -1) to i64), i64 1), i64 1)) @@ -353,9 +364,10 @@ char *allones_var(unsigned long offset) { // CHECK-SANITIZE-NEXT: %[[OR_OV:.+]] = or i1 %[[COMPUTED_OFFSET_OVERFLOWED]], false, !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_OFFSET:.*]] = extractvalue { i64, i1 } %[[COMPUTED_OFFSET_AGGREGATE]], 0, !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP:.*]] = add i64 -1, %[[COMPUTED_OFFSET]], !nosanitize + // CHECK-SANITIZE-NEXT: %[[OTHER_IS_NOT_NULL:.*]] = icmp ne ptr inttoptr (i64 -1 to ptr), null, !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_NOT_NULL:.*]] = icmp ne i64 %[[COMPUTED_GEP]], 0, !nosanitize - // CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize - // CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = and i1 %[[OTHER_IS_NOT_NULL]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[BOTH_POINTERS_ARE_NULL_OR_BOTH_ARE_NONNULL:.*]] = icmp eq i1 %[[OTHER_IS_NOT_NULL]], %[[COMPUTED_GEP_IS_NOT_NULL]], !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_OFFSET_DID_NOT_OVERFLOW:.*]] = xor i1 %[[OR_OV]], true, !nosanitize // CHECK-SANITIZE-NEXT: %[[COMPUTED_GEP_IS_UGE_BASE:.*]] = icmp uge i64 %[[COMPUTED_GEP]], -1, !nosanitize // CHECK-SANITIZE-NEXT: %[[GEP_DID_NOT_OVERFLOW:.*]] = and i1 %[[COMPUTED_GEP_IS_UGE_BASE]], %[[COMPUTED_OFFSET_DID_NOT_OVERFLOW]], !nosanitize @@ -376,7 +388,9 @@ char *allones_var(unsigned long offset) { char *allones_zero_OK(void) { // CHECK: define{{.*}} ptr @allones_zero_OK() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: br i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[CMP:.*]] = icmp ne ptr inttoptr (i64 -1 to ptr), null, !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 %[[CMP]], true, !nosanitize + // CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE-C: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-C-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1400]], i64 -1, i64 -1) // CHECK-SANITIZE-RECOVER-C-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_1400]], i64 -1, i64 -1) @@ -393,9 +407,11 @@ char *allones_zero_OK(void) { char *allones_one_BAD(void) { // CHECK: define{{.*}} ptr @allones_one_BAD() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1), i64 0), !nosanitize - // CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize - // CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 -1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP1:.*]] = icmp ne ptr inttoptr (i64 -1 to ptr), null, !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP2:.*]] = icmp ne i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1), 0, !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[COND:.*]] = and i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[COND:.*]] = icmp eq i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-NEXT: br i1 %[[COND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1500]], i64 -1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1)) // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_1500]], i64 -1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 1) to i64), i64 -1), i64 -1)) @@ -412,9 +428,11 @@ char *allones_one_BAD(void) { char *allones_allones_OK(void) { // CHECK: define{{.*}} ptr @allones_allones_OK() // CHECK-NEXT: [[ENTRY:.*]]: - // CHECK-SANITIZE-C-NEXT: %[[AND:.*]] = and i1 icmp ne (ptr inttoptr (i64 -1 to ptr), ptr null), icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1), i64 0), !nosanitize - // CHECK-SANITIZE-C-NEXT: br i1 %[[AND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize - // CHECK-SANITIZE-CPP-NEXT: br i1 xor (i1 icmp eq (ptr inttoptr (i64 -1 to ptr), ptr null), i1 icmp ne (i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1), i64 0)), label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP1:.*]] = icmp ne ptr inttoptr (i64 -1 to ptr), null, !nosanitize + // CHECK-SANITIZE-NEXT: %[[CMP2:.*]] = icmp ne i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1), 0, !nosanitize + // CHECK-SANITIZE-C-NEXT: %[[COND:.*]] = and i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-CPP-NEXT: %[[COND:.*]] = icmp eq i1 %[[CMP1]], %[[CMP2]], !nosanitize + // CHECK-SANITIZE-NEXT: br i1 %[[COND]], label %[[CONT:.*]], label %[[HANDLER_POINTER_OVERFLOW:[^,]+]],{{.*}} !nosanitize // CHECK-SANITIZE: [[HANDLER_POINTER_OVERFLOW]]: // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_pointer_overflow_abort(ptr @[[LINE_1600]], i64 -1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1)) // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_pointer_overflow(ptr @[[LINE_1600]], i64 -1, i64 add (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr inttoptr (i64 -1 to ptr), i64 -1) to i64), i64 -1), i64 -1)) diff --git a/clang/test/CodeGen/constantexpr-fneg.c b/clang/test/CodeGen/constantexpr-fneg.c index 3cd4db34f61acb7..fb7a3d1a695393a 100644 --- a/clang/test/CodeGen/constantexpr-fneg.c +++ b/clang/test/CodeGen/constantexpr-fneg.c @@ -8,7 +8,8 @@ // CHECK: entry: // CHECK-NEXT: %retval = alloca i32 // CHECK-NEXT: store i32 0, ptr %retval -// CHECK-NEXT: [[ZEXT:%.*]] = zext i1 true to i32 +// CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @b, @a +// CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32 // CHECK-NEXT: [[SITOFP:%.*]] = sitofp i32 [[ZEXT]] to float // CHECK-NEXT: [[LV:%.*]] = load ptr, ptr @c // CHECK-NEXT: store float [[SITOFP]], ptr [[LV]], align 4 diff --git a/clang/test/CodeGenCXX/cxx11-thread-local.cpp b/clang/test/CodeGenCXX/cxx11-thread-local.cpp index 1a6e289c9c2bd49..bcc490bc32e6e5b 100644 --- a/clang/test/CodeGenCXX/cxx11-thread-local.cpp +++ b/clang/test/CodeGenCXX/cxx11-thread-local.cpp @@ -136,8 +136,9 @@ int f() { // CHECK-NEXT: store i32 %{{.*}}, ptr @c, align 4 // LINUX_AIX-LABEL: define linkonce_odr hidden noundef ptr @_ZTW1b() -// LINUX: br i1 icmp ne (ptr @_ZTH1b, ptr null), -// AIX-NOT: br i1 icmp ne (ptr @_ZTH1b, ptr null), +// LINUX: [[CMP:%.*]] = icmp ne ptr @_ZTH1b, null +// LINUX: br i1 [[CMP]] +// AIX-NOT: [[CMP:%.*]] = icmp ne ptr @_ZTH1b, null // not null: // LINUX_AIX: call void @_ZTH1b() // LINUX: br label @@ -219,24 +220,27 @@ int f() { // DARWIN: declare cxx_fast_tlscc noundef ptr @_ZTWN1VIcE1mE() // LINUX_AIX: define linkonce_odr hidden noundef ptr @_ZTWN1VIcE1mE() {{#[0-9]+}}{{( comdat)?}} { -// LINUX: br i1 icmp ne (ptr @_ZTHN1VIcE1mE, -// AIX-NOT: br i1 icmp ne (ptr @_ZTHN1VIcE1mE +// LINUX: [[CMP:%.*]] = icmp ne ptr @_ZTHN1VIcE1mE, +// LINUX: br i1 [[CMP]] +// AIX-NOT: [[CMP:%.*]] = icmp ne ptr @_ZTHN1VIcE1mE, // LINUX_AIX: call void @_ZTHN1VIcE1mE() // LINUX_AIX: [[VEM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1VIcE1mE) // LINUX_AIX: ret ptr [[VEM_ADDR]] // DARWIN: declare cxx_fast_tlscc noundef ptr @_ZTWN1WIcE1mE() // LINUX_AIX: define linkonce_odr hidden noundef ptr @_ZTWN1WIcE1mE() {{#[0-9]+}}{{( comdat)?}} { -// LINUX: br i1 icmp ne (ptr @_ZTHN1WIcE1mE, -// AIX-NOT: br i1 icmp ne (ptr @_ZTHN1WIcE1mE, +// LINUX: [[CMP:%.*]] = icmp ne ptr @_ZTHN1WIcE1mE, +// LINUX: br i1 [[CMP]] +// AIX-NOT: [[CMP:%.*]] = icmp ne ptr @_ZTHN1WIcE1mE, // LINUX_AIX: call void @_ZTHN1WIcE1mE() // LINUX_AIX: [[WEM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1WIcE1mE) // LINUX_AIX: ret ptr [[WEM_ADDR]] // DARWIN: declare cxx_fast_tlscc {{.*}}ptr @_ZTWN1XIcE1mE() // LINUX_AIX: define linkonce_odr hidden {{.*}}ptr @_ZTWN1XIcE1mE() {{#[0-9]+}}{{( comdat)?}} { -// LINUX: br i1 icmp ne (ptr @_ZTHN1XIcE1mE, -// AIX-NOT: br i1 icmp ne (ptr @_ZTHN1XIcE1mE, +// LINUX: [[CMP:%.*]] = icmp ne ptr @_ZTHN1XIcE1mE, +// LINUX: br i1 [[CMP]] +// AIX-NOT: [[CMP:%.*]] = icmp ne ptr @_ZTHN1XIcE1mE, // LINUX_AIX: call void @_ZTHN1XIcE1mE() // LINUX_AIX: [[XEM_ADDR:%.+]] = call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @_ZN1XIcE1mE) // LINUX_AIX: ret ptr [[XEM_ADDR]] diff --git a/clang/test/CodeGenCXX/ubsan-nullability-arg.cpp b/clang/test/CodeGenCXX/ubsan-nullability-arg.cpp index 4cff87ca32ebd05..53e324ca9effea1 100644 --- a/clang/test/CodeGenCXX/ubsan-nullability-arg.cpp +++ b/clang/test/CodeGenCXX/ubsan-nullability-arg.cpp @@ -10,7 +10,8 @@ struct S0 { void foo1(void (S0::*_Nonnull f)()); // ITANIUM-LABEL: @_ZN10method_ptr5test1Ev(){{.*}} { -// ITANIUM: br i1 icmp ne (i64 ptrtoint (ptr @_ZN10method_ptr2S04foo1Ev to i64), i64 0), label %[[CONT:.*]], label %[[FAIL:[^,]*]] +// ITANIUM: [[CMP:%.*]] = icmp ne i64 ptrtoint (ptr @_ZN10method_ptr2S04foo1Ev to i64), 0 +// ITANIUM: br i1 [[CMP]], label %[[CONT:.*]], label %[[FAIL:[^,]*]] // ITANIUM-EMPTY: // ITANIUM-NEXT: [[FAIL]]: // ITANIUM-NEXT: call void @__ubsan_handle_nullability_arg diff --git a/clang/test/CodeGenCXX/weak-external.cpp b/clang/test/CodeGenCXX/weak-external.cpp index 5eb262cdbead080..587fba36a0ada58 100644 --- a/clang/test/CodeGenCXX/weak-external.cpp +++ b/clang/test/CodeGenCXX/weak-external.cpp @@ -80,11 +80,13 @@ namespace not_weak_on_first { namespace constant_eval { [[gnu::weak]] extern int a; // CHECK-LABEL: define {{.*}} @__cxx_global_var_init - // CHECK: [[ZEXT:%.*]] = zext i1 icmp ne (ptr @_ZN13constant_eval1aE, ptr null) to i8 + // CHECK: [[CMP:%.*]] = icmp ne ptr @_ZN13constant_eval1aE, null + // CHECK: [[ZEXT:%.*]] = zext i1 [[CMP]] to i8 // CHECK: store i8 [[ZEXT]], ptr @_ZN13constant_eval6has_a1E, bool has_a1 = &a; // CHECK-LABEL: define {{.*}} @__cxx_global_var_init - // CHECK: [[ZEXT:%.*]] = zext i1 icmp ne (ptr @_ZN13constant_eval1aE, ptr null) to i8 + // CHECK: [[CMP:%.*]] = icmp ne ptr @_ZN13constant_eval1aE, null + // CHECK: [[ZEXT:%.*]] = zext i1 [[CMP]] to i8 // CHECK: store i8 [[ZEXT]], ptr @_ZN13constant_eval6has_a2E, bool has_a2 = &a != nullptr; @@ -92,11 +94,16 @@ namespace constant_eval { [[gnu::weak]] void f(); }; // CHECK-LABEL: define {{.*}} @__cxx_global_var_init - // CHECK: [[ZEXT:%.*]] = zext i1 icmp ne (i{{32|64}} ptrtoint (ptr @_ZN13constant_eval1X1fEv to i{{32|64}}), i{{32|64}} 0) to i8 + // CHECK: [[CMP:%.*]] = icmp ne i{{32|64}} ptrtoint (ptr @_ZN13constant_eval1X1fEv to i{{32|64}}), 0 + // CHECK: [[ZEXT:%.*]] = zext i1 [[CMP]] to i8 // CHECK: store i8 [[ZEXT]], ptr @_ZN13constant_eval6has_f1E, bool has_f1 = &X::f; // CHECK-LABEL: define {{.*}} @__cxx_global_var_init - // CHECK: [[ZEXT:%.*]] = zext i1 icmp ne (i{{32|64}} ptrtoint (ptr @_ZN13constant_eval1X1fEv to i{{32|64}}), i{{32|64}} 0) to i8 + // CHECK: [[CMP:%.*]] = icmp ne i{{32|64}} ptrtoint (ptr @_ZN13constant_eval1X1fEv to i{{32|64}}), 0 + // CHECK: [[CMP2:%.*]] = icmp ne i{{32|64}} ptrtoint (ptr @_ZN13constant_eval1X1fEv to i{{32|64}}), 0 + // CHECK: [[AND:%.*]] = and i1 [[CMP2]], false + // CHECK: [[OR:%.*]] = or i1 [[CMP]], [[AND]] + // CHECK: [[ZEXT:%.*]] = zext i1 [[OR]] to i8 // CHECK: store i8 [[ZEXT]], ptr @_ZN13constant_eval6has_f2E, bool has_f2 = &X::f != nullptr; } diff --git a/clang/test/Driver/linker-wrapper-image.c b/clang/test/Driver/linker-wrapper-image.c index 5d5d62805e174d5..2bc48e6c4d88cf2 100644 --- a/clang/test/Driver/linker-wrapper-image.c +++ b/clang/test/Driver/linker-wrapper-image.c @@ -83,32 +83,33 @@ // CUDA: define internal void @.cuda.globals_reg(ptr %0) section ".text.startup" { // CUDA-NEXT: entry: -// CUDA-NEXT: br i1 icmp ne (ptr @__start_cuda_offloading_entries, ptr @__stop_cuda_offloading_entries), label %while.entry, label %while.end +// CUDA-NEXT: %1 = icmp ne ptr @__start_cuda_offloading_entries, @__stop_cuda_offloading_entries +// CUDA-NEXT: br i1 %1, label %while.entry, label %while.end // CUDA: while.entry: -// CUDA-NEXT: %entry1 = phi ptr [ @__start_cuda_offloading_entries, %entry ], [ %11, %if.end ] -// CUDA-NEXT: %1 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 0 -// CUDA-NEXT: %addr = load ptr, ptr %1, align 8 -// CUDA-NEXT: %2 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 1 -// CUDA-NEXT: %name = load ptr, ptr %2, align 8 -// CUDA-NEXT: %3 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 2 -// CUDA-NEXT: %size = load i64, ptr %3, align 4 -// CUDA-NEXT: %4 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 3 -// CUDA-NEXT: %flags = load i32, ptr %4, align 4 -// CUDA-NEXT: %5 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 4 -// CUDA-NEXT: %textype = load i32, ptr %5, align 4 +// CUDA-NEXT: %entry1 = phi ptr [ @__start_cuda_offloading_entries, %entry ], [ %12, %if.end ] +// CUDA-NEXT: %2 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 0 +// CUDA-NEXT: %addr = load ptr, ptr %2, align 8 +// CUDA-NEXT: %3 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 1 +// CUDA-NEXT: %name = load ptr, ptr %3, align 8 +// CUDA-NEXT: %4 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 2 +// CUDA-NEXT: %size = load i64, ptr %4, align 4 +// CUDA-NEXT: %5 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 3 +// CUDA-NEXT: %flags = load i32, ptr %5, align 4 +// CUDA-NEXT: %6 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 4 +// CUDA-NEXT: %textype = load i32, ptr %6, align 4 // CUDA-NEXT: %type = and i32 %flags, 7 -// CUDA-NEXT: %6 = and i32 %flags, 8 -// CUDA-NEXT: %extern = lshr i32 %6, 3 -// CUDA-NEXT: %7 = and i32 %flags, 16 -// CUDA-NEXT: %constant = lshr i32 %7, 4 -// CUDA-NEXT: %8 = and i32 %flags, 32 -// CUDA-NEXT: %normalized = lshr i32 %8, 5 -// CUDA-NEXT: %9 = icmp eq i64 %size, 0 -// CUDA-NEXT: br i1 %9, label %if.then, label %if.else +// CUDA-NEXT: %7 = and i32 %flags, 8 +// CUDA-NEXT: %extern = lshr i32 %7, 3 +// CUDA-NEXT: %8 = and i32 %flags, 16 +// CUDA-NEXT: %constant = lshr i32 %8, 4 +// CUDA-NEXT: %9 = and i32 %flags, 32 +// CUDA-NEXT: %normalized = lshr i32 %9, 5 +// CUDA-NEXT: %10 = icmp eq i64 %size, 0 +// CUDA-NEXT: br i1 %10, label %if.then, label %if.else // CUDA: if.then: -// CUDA-NEXT: %10 = call i32 @__cudaRegisterFunction(ptr %0, ptr %addr, ptr %name, ptr %name, i32 -1, ptr null, ptr null, ptr null, ptr null, ptr null) +// CUDA-NEXT: %11 = call i32 @__cudaRegisterFunction(ptr %0, ptr %addr, ptr %name, ptr %name, i32 -1, ptr null, ptr null, ptr null, ptr null, ptr null) // CUDA-NEXT: br label %if.end // CUDA: if.else: @@ -133,9 +134,9 @@ // CUDA-NEXT: br label %if.end // CUDA: if.end: -// CUDA-NEXT: %11 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 1 -// CUDA-NEXT: %12 = icmp eq ptr %11, @__stop_cuda_offloading_entries -// CUDA-NEXT: br i1 %12, label %while.end, label %while.entry +// CUDA-NEXT: %12 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 1 +// CUDA-NEXT: %13 = icmp eq ptr %12, @__stop_cuda_offloading_entries +// CUDA-NEXT: br i1 %13, label %while.end, label %while.entry // CUDA: while.end: // CUDA-NEXT: ret void @@ -182,32 +183,33 @@ // HIP: define internal void @.hip.globals_reg(ptr %0) section ".text.startup" { // HIP-NEXT: entry: -// HIP-NEXT: br i1 icmp ne (ptr @__start_hip_offloading_entries, ptr @__stop_hip_offloading_entries), label %while.entry, label %while.end +// HIP-NEXT: %1 = icmp ne ptr @__start_hip_offloading_entries, @__stop_hip_offloading_entries +// HIP-NEXT: br i1 %1, label %while.entry, label %while.end // HIP: while.entry: -// HIP-NEXT: %entry1 = phi ptr [ @__start_hip_offloading_entries, %entry ], [ %11, %if.end ] -// HIP-NEXT: %1 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 0 -// HIP-NEXT: %addr = load ptr, ptr %1, align 8 -// HIP-NEXT: %2 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 1 -// HIP-NEXT: %name = load ptr, ptr %2, align 8 -// HIP-NEXT: %3 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 2 -// HIP-NEXT: %size = load i64, ptr %3, align 4 -// HIP-NEXT: %4 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 3 -// HIP-NEXT: %flags = load i32, ptr %4, align 4 -// HIP-NEXT: %5 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 4 -// HIP-NEXT: %textype = load i32, ptr %5, align 4 +// HIP-NEXT: %entry1 = phi ptr [ @__start_hip_offloading_entries, %entry ], [ %12, %if.end ] +// HIP-NEXT: %2 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 0 +// HIP-NEXT: %addr = load ptr, ptr %2, align 8 +// HIP-NEXT: %3 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 1 +// HIP-NEXT: %name = load ptr, ptr %3, align 8 +// HIP-NEXT: %4 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 2 +// HIP-NEXT: %size = load i64, ptr %4, align 4 +// HIP-NEXT: %5 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 3 +// HIP-NEXT: %flags = load i32, ptr %5, align 4 +// HIP-NEXT: %6 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 0, i32 4 +// HIP-NEXT: %textype = load i32, ptr %6, align 4 // HIP-NEXT: %type = and i32 %flags, 7 -// HIP-NEXT: %6 = and i32 %flags, 8 -// HIP-NEXT: %extern = lshr i32 %6, 3 -// HIP-NEXT: %7 = and i32 %flags, 16 -// HIP-NEXT: %constant = lshr i32 %7, 4 -// HIP-NEXT: %8 = and i32 %flags, 32 -// HIP-NEXT: %normalized = lshr i32 %8, 5 -// HIP-NEXT: %9 = icmp eq i64 %size, 0 -// HIP-NEXT: br i1 %9, label %if.then, label %if.else +// HIP-NEXT: %7 = and i32 %flags, 8 +// HIP-NEXT: %extern = lshr i32 %7, 3 +// HIP-NEXT: %8 = and i32 %flags, 16 +// HIP-NEXT: %constant = lshr i32 %8, 4 +// HIP-NEXT: %9 = and i32 %flags, 32 +// HIP-NEXT: %normalized = lshr i32 %9, 5 +// HIP-NEXT: %10 = icmp eq i64 %size, 0 +// HIP-NEXT: br i1 %10, label %if.then, label %if.else // HIP: if.then: -// HIP-NEXT: %10 = call i32 @__hipRegisterFunction(ptr %0, ptr %addr, ptr %name, ptr %name, i32 -1, ptr null, ptr null, ptr null, ptr null, ptr null) +// HIP-NEXT: %11 = call i32 @__hipRegisterFunction(ptr %0, ptr %addr, ptr %name, ptr %name, i32 -1, ptr null, ptr null, ptr null, ptr null, ptr null) // HIP-NEXT: br label %if.end // HIP: if.else: @@ -234,9 +236,9 @@ // HIP-NEXT: br label %if.end // HIP: if.end: -// HIP-NEXT: %11 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 1 -// HIP-NEXT: %12 = icmp eq ptr %11, @__stop_hip_offloading_entries -// HIP-NEXT: br i1 %12, label %while.end, label %while.entry +// HIP-NEXT: %12 = getelementptr inbounds %struct.__tgt_offload_entry, ptr %entry1, i64 1 +// HIP-NEXT: %13 = icmp eq ptr %12, @__stop_hip_offloading_entries +// HIP-NEXT: br i1 %13, label %while.end, label %while.entry // HIP: while.end: // HIP-NEXT: ret void diff --git a/clang/test/OpenMP/threadprivate_codegen.cpp b/clang/test/OpenMP/threadprivate_codegen.cpp index b27783be829d662..5087451b944b981 100644 --- a/clang/test/OpenMP/threadprivate_codegen.cpp +++ b/clang/test/OpenMP/threadprivate_codegen.cpp @@ -3648,24 +3648,26 @@ int foobar() { // // CHECK-TLS1-LABEL: define {{[^@]+}}@_ZTWN6Static1sE // CHECK-TLS1-SAME: () #[[ATTR5]] comdat { -// CHECK-TLS1-NEXT: br i1 icmp ne (ptr @_ZTHN6Static1sE, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS1: 1: -// CHECK-TLS1-NEXT: call void @_ZTHN6Static1sE() -// CHECK-TLS1-NEXT: br label [[TMP2]] +// CHECK-TLS1-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTHN6Static1sE, null +// CHECK-TLS1-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS1: 2: -// CHECK-TLS1-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) -// CHECK-TLS1-NEXT: ret ptr [[TMP3]] +// CHECK-TLS1-NEXT: call void @_ZTHN6Static1sE() +// CHECK-TLS1-NEXT: br label [[TMP3]] +// CHECK-TLS1: 3: +// CHECK-TLS1-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) +// CHECK-TLS1-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS1-LABEL: define {{[^@]+}}@_ZTW3gs3 // CHECK-TLS1-SAME: () #[[ATTR5]] comdat { -// CHECK-TLS1-NEXT: br i1 icmp ne (ptr @_ZTH3gs3, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS1: 1: -// CHECK-TLS1-NEXT: call void @_ZTH3gs3() -// CHECK-TLS1-NEXT: br label [[TMP2]] +// CHECK-TLS1-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTH3gs3, null +// CHECK-TLS1-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS1: 2: -// CHECK-TLS1-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) -// CHECK-TLS1-NEXT: ret ptr [[TMP3]] +// CHECK-TLS1-NEXT: call void @_ZTH3gs3() +// CHECK-TLS1-NEXT: br label [[TMP3]] +// CHECK-TLS1: 3: +// CHECK-TLS1-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) +// CHECK-TLS1-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS1-LABEL: define {{[^@]+}}@_ZTW5arr_x @@ -3950,24 +3952,26 @@ int foobar() { // // CHECK-TLS2-LABEL: define {{[^@]+}}@_ZTWN6Static1sE // CHECK-TLS2-SAME: () #[[ATTR1]] comdat { -// CHECK-TLS2-NEXT: br i1 icmp ne (ptr @_ZTHN6Static1sE, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS2: 1: -// CHECK-TLS2-NEXT: call void @_ZTHN6Static1sE() -// CHECK-TLS2-NEXT: br label [[TMP2]] +// CHECK-TLS2-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTHN6Static1sE, null +// CHECK-TLS2-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS2: 2: -// CHECK-TLS2-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) -// CHECK-TLS2-NEXT: ret ptr [[TMP3]] +// CHECK-TLS2-NEXT: call void @_ZTHN6Static1sE() +// CHECK-TLS2-NEXT: br label [[TMP3]] +// CHECK-TLS2: 3: +// CHECK-TLS2-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) +// CHECK-TLS2-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS2-LABEL: define {{[^@]+}}@_ZTW3gs3 // CHECK-TLS2-SAME: () #[[ATTR1]] comdat { -// CHECK-TLS2-NEXT: br i1 icmp ne (ptr @_ZTH3gs3, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS2: 1: -// CHECK-TLS2-NEXT: call void @_ZTH3gs3() -// CHECK-TLS2-NEXT: br label [[TMP2]] +// CHECK-TLS2-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTH3gs3, null +// CHECK-TLS2-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS2: 2: -// CHECK-TLS2-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) -// CHECK-TLS2-NEXT: ret ptr [[TMP3]] +// CHECK-TLS2-NEXT: call void @_ZTH3gs3() +// CHECK-TLS2-NEXT: br label [[TMP3]] +// CHECK-TLS2: 3: +// CHECK-TLS2-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) +// CHECK-TLS2-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS2-LABEL: define {{[^@]+}}@_ZTW5arr_x @@ -4723,24 +4727,26 @@ int foobar() { // // CHECK-TLS3-LABEL: define {{[^@]+}}@_ZTWN6Static1sE // CHECK-TLS3-SAME: () #[[ATTR6]] comdat { -// CHECK-TLS3-NEXT: br i1 icmp ne (ptr @_ZTHN6Static1sE, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS3: 1: -// CHECK-TLS3-NEXT: call void @_ZTHN6Static1sE() -// CHECK-TLS3-NEXT: br label [[TMP2]] +// CHECK-TLS3-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTHN6Static1sE, null +// CHECK-TLS3-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS3: 2: -// CHECK-TLS3-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) -// CHECK-TLS3-NEXT: ret ptr [[TMP3]] +// CHECK-TLS3-NEXT: call void @_ZTHN6Static1sE() +// CHECK-TLS3-NEXT: br label [[TMP3]] +// CHECK-TLS3: 3: +// CHECK-TLS3-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) +// CHECK-TLS3-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS3-LABEL: define {{[^@]+}}@_ZTW3gs3 // CHECK-TLS3-SAME: () #[[ATTR6]] comdat { -// CHECK-TLS3-NEXT: br i1 icmp ne (ptr @_ZTH3gs3, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS3: 1: -// CHECK-TLS3-NEXT: call void @_ZTH3gs3() -// CHECK-TLS3-NEXT: br label [[TMP2]] +// CHECK-TLS3-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTH3gs3, null +// CHECK-TLS3-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS3: 2: -// CHECK-TLS3-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) -// CHECK-TLS3-NEXT: ret ptr [[TMP3]] +// CHECK-TLS3-NEXT: call void @_ZTH3gs3() +// CHECK-TLS3-NEXT: br label [[TMP3]] +// CHECK-TLS3: 3: +// CHECK-TLS3-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) +// CHECK-TLS3-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS3-LABEL: define {{[^@]+}}@_ZTW5arr_x @@ -5039,24 +5045,26 @@ int foobar() { // // CHECK-TLS4-LABEL: define {{[^@]+}}@_ZTWN6Static1sE // CHECK-TLS4-SAME: () #[[ATTR2]] comdat { -// CHECK-TLS4-NEXT: br i1 icmp ne (ptr @_ZTHN6Static1sE, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS4: 1: -// CHECK-TLS4-NEXT: call void @_ZTHN6Static1sE() -// CHECK-TLS4-NEXT: br label [[TMP2]] +// CHECK-TLS4-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTHN6Static1sE, null +// CHECK-TLS4-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS4: 2: -// CHECK-TLS4-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) -// CHECK-TLS4-NEXT: ret ptr [[TMP3]] +// CHECK-TLS4-NEXT: call void @_ZTHN6Static1sE() +// CHECK-TLS4-NEXT: br label [[TMP3]] +// CHECK-TLS4: 3: +// CHECK-TLS4-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN6Static1sE) +// CHECK-TLS4-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS4-LABEL: define {{[^@]+}}@_ZTW3gs3 // CHECK-TLS4-SAME: () #[[ATTR2]] comdat { -// CHECK-TLS4-NEXT: br i1 icmp ne (ptr @_ZTH3gs3, ptr null), label [[TMP1:%.*]], label [[TMP2:%.*]] -// CHECK-TLS4: 1: -// CHECK-TLS4-NEXT: call void @_ZTH3gs3() -// CHECK-TLS4-NEXT: br label [[TMP2]] +// CHECK-TLS4-NEXT: [[TMP1:%.*]] = icmp ne ptr @_ZTH3gs3, null +// CHECK-TLS4-NEXT: br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP3:%.*]] // CHECK-TLS4: 2: -// CHECK-TLS4-NEXT: [[TMP3:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) -// CHECK-TLS4-NEXT: ret ptr [[TMP3]] +// CHECK-TLS4-NEXT: call void @_ZTH3gs3() +// CHECK-TLS4-NEXT: br label [[TMP3]] +// CHECK-TLS4: 3: +// CHECK-TLS4-NEXT: [[TMP4:%.*]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @gs3) +// CHECK-TLS4-NEXT: ret ptr [[TMP4]] // // // CHECK-TLS4-LABEL: define {{[^@]+}}@_ZTW5arr_x diff --git a/llvm/include/llvm/Analysis/TargetFolder.h b/llvm/include/llvm/Analysis/TargetFolder.h index f95d738a40654db..26ec4dcef6df411 100644 --- a/llvm/include/llvm/Analysis/TargetFolder.h +++ b/llvm/include/llvm/Analysis/TargetFolder.h @@ -103,7 +103,7 @@ class TargetFolder final : public IRBuilderFolder { auto *LC = dyn_cast(LHS); auto *RC = dyn_cast(RHS); if (LC && RC) - return Fold(ConstantExpr::getCompare(P, LC, RC)); + return ConstantFoldCompareInstOperands(P, LC, RC, DL); return nullptr; } diff --git a/llvm/include/llvm/IR/ConstantFolder.h b/llvm/include/llvm/IR/ConstantFolder.h index ce4b44ddc855ff3..65467bdbb3038ae 100644 --- a/llvm/include/llvm/IR/ConstantFolder.h +++ b/llvm/include/llvm/IR/ConstantFolder.h @@ -99,7 +99,7 @@ class ConstantFolder final : public IRBuilderFolder { auto *LC = dyn_cast(LHS); auto *RC = dyn_cast(RHS); if (LC && RC) - return ConstantExpr::getCompare(P, LC, RC); + return ConstantFoldCompareInstruction(P, LC, RC); return nullptr; } diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 31667ff3951f122..c73558799556932 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -1268,7 +1268,7 @@ Constant *llvm::ConstantFoldCompareInstOperands( if (!Ops1) return nullptr; - return ConstantExpr::getCompare(Predicate, Ops0, Ops1); + return ConstantFoldCompareInstruction(Predicate, Ops0, Ops1); } Constant *llvm::ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index 4622ad7e9a0e7df..2c99f39a0249962 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -1282,9 +1282,9 @@ Constant *llvm::ConstantFoldCompareInstruction(CmpInst::Predicate Predicate, // Fast path for splatted constants. if (Constant *C1Splat = C1->getSplatValue()) if (Constant *C2Splat = C2->getSplatValue()) - return ConstantVector::getSplat( - C1VTy->getElementCount(), - ConstantExpr::getCompare(Predicate, C1Splat, C2Splat)); + if (Constant *Elt = + ConstantFoldCompareInstruction(Predicate, C1Splat, C2Splat)) + return ConstantVector::getSplat(C1VTy->getElementCount(), Elt); // Do not iterate on scalable vector. The number of elements is unknown at // compile-time. @@ -1302,8 +1302,11 @@ Constant *llvm::ConstantFoldCompareInstruction(CmpInst::Predicate Predicate, ConstantExpr::getExtractElement(C1, ConstantInt::get(Ty, I)); Constant *C2E = ConstantExpr::getExtractElement(C2, ConstantInt::get(Ty, I)); + Constant *Elt = ConstantFoldCompareInstruction(Predicate, C1E, C2E); + if (!Elt) + return nullptr; - ResElts.push_back(ConstantExpr::getCompare(Predicate, C1E, C2E)); + ResElts.push_back(Elt); } return ConstantVector::get(ResElts); @@ -1411,7 +1414,7 @@ Constant *llvm::ConstantFoldCompareInstruction(CmpInst::Predicate Predicate, // other way if possible. // Also, if C1 is null and C2 isn't, flip them around. Predicate = ICmpInst::getSwappedPredicate(Predicate); - return ConstantExpr::getICmp(Predicate, C2, C1); + return ConstantFoldCompareInstruction(Predicate, C2, C1); } } return nullptr; diff --git a/llvm/test/Assembler/ConstantExprFold.ll b/llvm/test/Assembler/ConstantExprFold.ll index ab7e767d767bbba..fb40f82c861bae5 100644 --- a/llvm/test/Assembler/ConstantExprFold.ll +++ b/llvm/test/Assembler/ConstantExprFold.ll @@ -43,9 +43,9 @@ ; CHECK: @mul = global ptr null ; CHECK: @xor = global ptr @A ; CHECK: @B = external global %Ty -; CHECK: @icmp_ult1 = global i1 icmp ugt (ptr getelementptr inbounds (i64, ptr @A, i64 1), ptr @A) +; CHECK: @icmp_ult1 = global i1 icmp ult (ptr @A, ptr getelementptr inbounds (i64, ptr @A, i64 1)) ; CHECK: @icmp_slt = global i1 false -; CHECK: @icmp_ult2 = global i1 icmp ugt (ptr getelementptr inbounds (%Ty, ptr @B, i64 0, i32 1), ptr @B) +; CHECK: @icmp_ult2 = global i1 icmp ult (ptr @B, ptr getelementptr inbounds (%Ty, ptr @B, i64 0, i32 1)) ; CHECK: @cons = weak global i32 0, align 8 ; CHECK: @gep1 = global <2 x ptr> undef ; CHECK: @gep2 = global <2 x ptr> undef diff --git a/llvm/test/Assembler/ConstantExprNoFold.ll b/llvm/test/Assembler/ConstantExprNoFold.ll index 4f08463d88d15cf..a676a0c7eb36a74 100644 --- a/llvm/test/Assembler/ConstantExprNoFold.ll +++ b/llvm/test/Assembler/ConstantExprNoFold.ll @@ -51,9 +51,9 @@ target datalayout = "p:32:32" @addrspace3 = internal addrspace(3) global i32 undef ; CHECK: @no.fold.addrspace.icmp.eq.gv.null = global i1 icmp eq (ptr addrspace(3) @addrspace3, ptr addrspace(3) null) -; CHECK: @no.fold.addrspace.icmp.eq.null.gv = global i1 icmp eq (ptr addrspace(3) @addrspace3, ptr addrspace(3) null) +; CHECK: @no.fold.addrspace.icmp.eq.null.gv = global i1 icmp eq (ptr addrspace(3) null, ptr addrspace(3) @addrspace3) ; CHECK: @no.fold.addrspace.icmp.ne.gv.null = global i1 icmp ne (ptr addrspace(3) @addrspace3, ptr addrspace(3) null) -; CHECK: @no.fold.addrspace.icmp.ne.null.gv = global i1 icmp ne (ptr addrspace(3) @addrspace3, ptr addrspace(3) null) +; CHECK: @no.fold.addrspace.icmp.ne.null.gv = global i1 icmp ne (ptr addrspace(3) null, ptr addrspace(3) @addrspace3) @no.fold.addrspace.icmp.eq.gv.null = global i1 icmp eq (ptr addrspace(3) @addrspace3, ptr addrspace(3) null) @no.fold.addrspace.icmp.eq.null.gv = global i1 icmp eq (ptr addrspace(3) null, ptr addrspace(3) @addrspace3) @no.fold.addrspace.icmp.ne.gv.null = global i1 icmp ne (ptr addrspace(3) @addrspace3, ptr addrspace(3) null) diff --git a/llvm/test/Assembler/vector-cmp.ll b/llvm/test/Assembler/vector-cmp.ll index 23fe54f8459508c..a90046bc24268db 100644 --- a/llvm/test/Assembler/vector-cmp.ll +++ b/llvm/test/Assembler/vector-cmp.ll @@ -4,7 +4,7 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" target triple = "i686-apple-darwin9.2.2" -; CHECK: @1 = global <4 x i1> +; CHECK: @1 = global <4 x i1> icmp slt (<4 x i32> , <4 x i32> ) define <4 x i1> @foo(<4 x float> %a, <4 x float> %b) nounwind { entry: diff --git a/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor-constexpr-alias.ll b/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor-constexpr-alias.ll index 95fc47469b5183f..2ad40ef5e547675 100644 --- a/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor-constexpr-alias.ll +++ b/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor-constexpr-alias.ll @@ -48,7 +48,8 @@ define void @bar() addrspace(1) { ; CHECK-LABEL: define weak_odr amdgpu_kernel void @amdgcn.device.init( ; CHECK-SAME: ) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 icmp ne (ptr addrspace(1) @__init_array_start, ptr addrspace(1) @__init_array_end), label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp ne ptr addrspace(1) @__init_array_start, @__init_array_end +; CHECK-NEXT: br i1 [[TMP0]], label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]] ; CHECK: while.entry: ; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ @__init_array_start, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ] ; CHECK-NEXT: [[CALLBACK:%.*]] = load ptr, ptr addrspace(1) [[PTR]], align 8 diff --git a/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll b/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll index c4f0821caacdf35..503f3b1d896f91c 100644 --- a/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll +++ b/llvm/test/CodeGen/AMDGPU/lower-ctor-dtor.ll @@ -63,7 +63,8 @@ define internal void @bar() { ; CHECK-LABEL: define weak_odr amdgpu_kernel void @amdgcn.device.init( ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 icmp ne (ptr addrspace(1) @__init_array_start, ptr addrspace(1) @__init_array_end), label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp ne ptr addrspace(1) @__init_array_start, @__init_array_end +; CHECK-NEXT: br i1 [[TMP0]], label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]] ; CHECK: while.entry: ; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ @__init_array_start, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ] ; CHECK-NEXT: [[CALLBACK:%.*]] = load ptr, ptr addrspace(1) [[PTR]], align 8 diff --git a/llvm/test/CodeGen/AMDGPU/lower-multiple-ctor-dtor.ll b/llvm/test/CodeGen/AMDGPU/lower-multiple-ctor-dtor.ll index f2d73b24c35d520..9d00b676d66104b 100644 --- a/llvm/test/CodeGen/AMDGPU/lower-multiple-ctor-dtor.ll +++ b/llvm/test/CodeGen/AMDGPU/lower-multiple-ctor-dtor.ll @@ -55,7 +55,8 @@ define internal void @bar.5() { ; CHECK-LABEL: define weak_odr amdgpu_kernel void @amdgcn.device.init( ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 icmp ne (ptr addrspace(1) @__init_array_start, ptr addrspace(1) @__init_array_end), label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = icmp ne ptr addrspace(1) @__init_array_start, @__init_array_end +; CHECK-NEXT: br i1 [[TMP0]], label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]] ; CHECK: while.entry: ; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ @__init_array_start, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ] ; CHECK-NEXT: [[CALLBACK:%.*]] = load ptr, ptr addrspace(1) [[PTR]], align 8 diff --git a/llvm/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll b/llvm/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll index 2e89bbd2dcff266..df032b385054c17 100644 --- a/llvm/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll +++ b/llvm/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll @@ -73,7 +73,8 @@ entry: } ; CHECK-LABEL: @MaybeUninitializedRetNoUndef -; CONST: br i1 icmp ne (i32 extractelement (<4 x i32> bitcast (<2 x i64> to <4 x i32>), i64 0), i32 0) +; CONST: [[CMP:%.*]] = icmp ne i32 extractelement (<4 x i32> bitcast (<2 x i64> to <4 x i32>), i64 0), 0 +; CONST: br i1 [[CMP]] ; CONST: call void @__msan_warning_with_origin_noreturn ; CHECK: call void @__msan_init() diff --git a/llvm/test/Instrumentation/SanitizerBinaryMetadata/atomics.ll b/llvm/test/Instrumentation/SanitizerBinaryMetadata/atomics.ll index 7d4086c49503a9b..82b65fe33cd600b 100644 --- a/llvm/test/Instrumentation/SanitizerBinaryMetadata/atomics.ll +++ b/llvm/test/Instrumentation/SanitizerBinaryMetadata/atomics.ll @@ -2037,7 +2037,8 @@ entry: ; CHECK-LABEL: __sanitizer_metadata_atomics.module_ctor ; CHECK-DAG: entry: -; CHECK-NEXT: br i1 icmp ne (ptr @__sanitizer_metadata_atomics_add, ptr null), label %callfunc, label %ret +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_atomics_add, null +; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret ; CHECK-DAG: callfunc: ; CHECK-NEXT: call void @__sanitizer_metadata_atomics_add(i32 2, ptr @__start_sanmd_atomics, ptr @__stop_sanmd_atomics) ; CHECK-NEXT: br label %ret @@ -2046,7 +2047,8 @@ entry: ; CHECK-LABEL: __sanitizer_metadata_atomics.module_dtor ; CHECK-DAG: entry: -; CHECK-NEXT: br i1 icmp ne (ptr @__sanitizer_metadata_atomics_del, ptr null), label %callfunc, label %ret +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_atomics_del, null +; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret ; CHECK-DAG: callfunc: ; CHECK-NEXT: call void @__sanitizer_metadata_atomics_del(i32 2, ptr @__start_sanmd_atomics, ptr @__stop_sanmd_atomics) ; CHECK-NEXT: br label %ret @@ -2055,7 +2057,8 @@ entry: ; CHECK-LABEL: __sanitizer_metadata_covered.module_ctor ; CHECK-DAG: entry: -; CHECK-NEXT: br i1 icmp ne (ptr @__sanitizer_metadata_covered_add, ptr null), label %callfunc, label %ret +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_covered_add, null +; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret ; CHECK-DAG: callfunc: ; CHECK-NEXT: call void @__sanitizer_metadata_covered_add(i32 2, ptr @__start_sanmd_covered, ptr @__stop_sanmd_covered) ; CHECK-NEXT: br label %ret @@ -2064,7 +2067,8 @@ entry: ; CHECK-LABEL: __sanitizer_metadata_covered.module_dtor ; CHECK-DAG: entry: -; CHECK-NEXT: br i1 icmp ne (ptr @__sanitizer_metadata_covered_del, ptr null), label %callfunc, label %ret +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_covered_del, null +; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret ; CHECK-DAG: callfunc: ; CHECK-NEXT: call void @__sanitizer_metadata_covered_del(i32 2, ptr @__start_sanmd_covered, ptr @__stop_sanmd_covered) ; CHECK-NEXT: br label %ret diff --git a/llvm/test/Transforms/Attributor/value-simplify.ll b/llvm/test/Transforms/Attributor/value-simplify.ll index 62d4f63677df685..53edd566c5424e5 100644 --- a/llvm/test/Transforms/Attributor/value-simplify.ll +++ b/llvm/test/Transforms/Attributor/value-simplify.ll @@ -1396,11 +1396,6 @@ define internal void @not_called2() { ret void } define internal void @not_called3() { -; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) -; TUNIT-LABEL: define {{[^@]+}}@not_called3 -; TUNIT-SAME: () #[[ATTR2]] { -; TUNIT-NEXT: ret void -; ; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@not_called3 ; CGSCC-SAME: () #[[ATTR1]] { @@ -1422,7 +1417,7 @@ define i1 @user_of_not_called() { ; CHECK-LABEL: define {{[^@]+}}@user_of_not_called() { ; CHECK-NEXT: call void @useFnDecl(ptr addrspace(42) noundef nonnull addrspacecast (ptr @not_called1 to ptr addrspace(42))) ; CHECK-NEXT: call void @useFnDef(ptr addrspace(42) noundef nonnull addrspacecast (ptr @not_called2 to ptr addrspace(42))) -; CHECK-NEXT: ret i1 icmp eq (ptr addrspace(42) addrspacecast (ptr @not_called3 to ptr addrspace(42)), ptr addrspace(42) null) +; CHECK-NEXT: ret i1 false ; call void @useFnDecl(ptr addrspace(42) addrspacecast (ptr @not_called1 to ptr addrspace(42))) call void @useFnDef(ptr addrspace(42) addrspacecast (ptr @not_called2 to ptr addrspace(42))) diff --git a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll index b0da6d80d05adf2..7dc2fe1cb88e1f0 100644 --- a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll +++ b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll @@ -232,7 +232,7 @@ define i64 @pr64669(i64 %a) { ; CHECK-LABEL: define i64 @pr64669 ; CHECK-SAME: (i64 [[A:%.*]]) { ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[A]], 1 -; CHECK-NEXT: [[ADD:%.*]] = select i1 icmp ne (ptr getelementptr inbounds (i8, ptr @b, i64 100), ptr @c), i64 [[TMP1]], i64 0 +; CHECK-NEXT: [[ADD:%.*]] = select i1 icmp ne (ptr getelementptr inbounds ([72 x i32], ptr @b, i64 0, i64 25), ptr @c), i64 [[TMP1]], i64 0 ; CHECK-NEXT: ret i64 [[ADD]] ; %mul = select i1 icmp ne (ptr getelementptr inbounds ([72 x i32], ptr @b, i64 0, i64 25), ptr @c), i64 %a, i64 0 diff --git a/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll b/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll index 857704f580281c2..dafe3900fef3b75 100644 --- a/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll +++ b/llvm/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll @@ -132,7 +132,8 @@ define i1 @constant_fold_inttoptr_null(i16 %i) { define i1 @constant_fold_ptrtoint_null() { ; CHECK-LABEL: @constant_fold_ptrtoint_null( -; CHECK-NEXT: ret i1 icmp eq (ptr addrspace(3) @g, ptr addrspace(3) null) +; CHECK-NEXT: [[X:%.*]] = icmp eq i16 ptrtoint (ptr addrspace(3) @g to i16), 0 +; CHECK-NEXT: ret i1 [[X]] ; %x = icmp eq i16 ptrtoint (ptr addrspace(3) @g to i16), ptrtoint (ptr addrspace(3) null to i16) ret i1 %x @@ -140,7 +141,8 @@ define i1 @constant_fold_ptrtoint_null() { define i1 @constant_fold_ptrtoint_null_2() { ; CHECK-LABEL: @constant_fold_ptrtoint_null_2( -; CHECK-NEXT: ret i1 icmp eq (ptr addrspace(3) @g, ptr addrspace(3) null) +; CHECK-NEXT: [[X:%.*]] = icmp eq i16 0, ptrtoint (ptr addrspace(3) @g to i16) +; CHECK-NEXT: ret i1 [[X]] ; %x = icmp eq i16 ptrtoint (ptr addrspace(3) null to i16), ptrtoint (ptr addrspace(3) @g to i16) ret i1 %x diff --git a/llvm/test/Transforms/InstCombine/getelementptr.ll b/llvm/test/Transforms/InstCombine/getelementptr.ll index e82c168ced016a8..e29f1a7cf006602 100644 --- a/llvm/test/Transforms/InstCombine/getelementptr.ll +++ b/llvm/test/Transforms/InstCombine/getelementptr.ll @@ -537,7 +537,8 @@ define i32 @test21() { define i1 @test22() { ; CHECK-LABEL: @test22( -; CHECK-NEXT: ret i1 icmp ult (ptr getelementptr inbounds (i8, ptr @A, i64 4), ptr getelementptr (i8, ptr @B, i64 8)) +; CHECK-NEXT: [[C:%.*]] = icmp ult ptr getelementptr inbounds (i8, ptr @A, i64 4), getelementptr (i8, ptr @B, i64 8) +; CHECK-NEXT: ret i1 [[C]] ; %C = icmp ult ptr getelementptr (i32, ptr @A, i64 1), getelementptr (i32, ptr @B, i64 2) diff --git a/llvm/test/Transforms/InstCombine/hoist-xor-by-constant-from-xor-by-value.ll b/llvm/test/Transforms/InstCombine/hoist-xor-by-constant-from-xor-by-value.ll index d75dbcf9c9b9c2a..200e7ba8e677300 100644 --- a/llvm/test/Transforms/InstCombine/hoist-xor-by-constant-from-xor-by-value.ll +++ b/llvm/test/Transforms/InstCombine/hoist-xor-by-constant-from-xor-by-value.ll @@ -94,7 +94,8 @@ entry: define i16 @constantexpr2() { ; CHECK-LABEL: @constantexpr2( -; CHECK-NEXT: [[I1:%.*]] = zext i1 icmp ne (ptr getelementptr inbounds (i8, ptr @global_constant3, i64 40), ptr @global_constant4) to i16 +; CHECK-NEXT: [[I0:%.*]] = icmp ne ptr getelementptr inbounds (i8, ptr @global_constant3, i64 40), @global_constant4 +; CHECK-NEXT: [[I1:%.*]] = zext i1 [[I0]] to i16 ; CHECK-NEXT: [[I2:%.*]] = load ptr, ptr @global_constant5, align 1 ; CHECK-NEXT: [[I3:%.*]] = load i16, ptr [[I2]], align 1 ; CHECK-NEXT: [[I4:%.*]] = xor i16 [[I3]], [[I1]] diff --git a/llvm/test/Transforms/InstCombine/pr33453.ll b/llvm/test/Transforms/InstCombine/pr33453.ll index 23a232dd0b9a480..45f87b75300601b 100644 --- a/llvm/test/Transforms/InstCombine/pr33453.ll +++ b/llvm/test/Transforms/InstCombine/pr33453.ll @@ -6,7 +6,7 @@ define float @patatino() { ; CHECK-LABEL: @patatino( -; CHECK-NEXT: [[FMUL:%.*]] = uitofp i1 mul (i1 icmp eq (ptr getelementptr inbounds (i8, ptr @g2, i64 2), ptr @g1), i1 icmp eq (ptr getelementptr inbounds (i8, ptr @g2, i64 2), ptr @g1)) to float +; CHECK-NEXT: [[FMUL:%.*]] = uitofp i1 mul (i1 icmp eq (ptr getelementptr inbounds (i16, ptr @g2, i64 1), ptr @g1), i1 icmp eq (ptr getelementptr inbounds (i16, ptr @g2, i64 1), ptr @g1)) to float ; CHECK-NEXT: ret float [[FMUL]] ; %uitofp1 = uitofp i1 icmp eq (ptr getelementptr inbounds (i16, ptr @g2, i64 1), ptr @g1) to float diff --git a/llvm/test/Transforms/InstCombine/pr83947.ll b/llvm/test/Transforms/InstCombine/pr83947.ll index 63a242abc9252ad..c1d601ff637183a 100644 --- a/llvm/test/Transforms/InstCombine/pr83947.ll +++ b/llvm/test/Transforms/InstCombine/pr83947.ll @@ -6,7 +6,7 @@ define void @masked_scatter1() { ; CHECK-LABEL: define void @masked_scatter1() { -; CHECK-NEXT: call void @llvm.masked.scatter.nxv4i32.nxv4p0( zeroinitializer, shufflevector ( insertelement ( poison, ptr @c, i64 0), poison, zeroinitializer), i32 4, shufflevector ( insertelement ( poison, i1 icmp eq (ptr getelementptr inbounds (i8, ptr @b, i64 4), ptr @c), i64 0), poison, zeroinitializer)) +; CHECK-NEXT: call void @llvm.masked.scatter.nxv4i32.nxv4p0( zeroinitializer, shufflevector ( insertelement ( poison, ptr @c, i64 0), poison, zeroinitializer), i32 4, shufflevector ( insertelement ( poison, i1 icmp eq (ptr getelementptr inbounds (i32, ptr @b, i64 1), ptr @c), i64 0), poison, zeroinitializer)) ; CHECK-NEXT: ret void ; call void @llvm.masked.scatter.nxv4i32.nxv4p0( zeroinitializer, splat (ptr @c), i32 4, splat (i1 icmp eq (ptr getelementptr (i32, ptr @b, i64 1), ptr @c))) @@ -59,7 +59,7 @@ define void @masked_scatter6() { define void @masked_scatter7() { ; CHECK-LABEL: define void @masked_scatter7() { -; CHECK-NEXT: call void @llvm.masked.scatter.v2i32.v2p0(<2 x i32> zeroinitializer, <2 x ptr> , i32 4, <2 x i1> ) +; CHECK-NEXT: call void @llvm.masked.scatter.v2i32.v2p0(<2 x i32> zeroinitializer, <2 x ptr> , i32 4, <2 x i1> ) ; CHECK-NEXT: ret void ; call void @llvm.masked.scatter.v2i32.v2p0(<2 x i32> zeroinitializer, <2 x ptr> splat (ptr @c), i32 4, <2 x i1> splat (i1 icmp eq (ptr getelementptr (i32, ptr @b, i64 1), ptr @c))) diff --git a/llvm/test/Transforms/InstCombine/rem.ll b/llvm/test/Transforms/InstCombine/rem.ll index a8fa72c37d32e26..ae390e72a4b7300 100644 --- a/llvm/test/Transforms/InstCombine/rem.ll +++ b/llvm/test/Transforms/InstCombine/rem.ll @@ -522,7 +522,7 @@ define i32 @pr27968_0(i1 %c0, ptr %p) { ; CHECK-NEXT: [[V:%.*]] = load volatile i32, ptr [[P:%.*]], align 4 ; CHECK-NEXT: br label [[IF_END]] ; CHECK: if.end: -; CHECK-NEXT: br i1 icmp eq (ptr getelementptr inbounds (i8, ptr @a, i64 8), ptr @b), label [[REM_IS_SAFE:%.*]], label [[REM_IS_UNSAFE:%.*]] +; CHECK-NEXT: br i1 icmp eq (ptr getelementptr inbounds ([5 x i16], ptr @a, i64 0, i64 4), ptr @b), label [[REM_IS_SAFE:%.*]], label [[REM_IS_UNSAFE:%.*]] ; CHECK: rem.is.safe: ; CHECK-NEXT: ret i32 0 ; CHECK: rem.is.unsafe: @@ -591,7 +591,7 @@ define i32 @pr27968_2(i1 %c0, ptr %p) { ; CHECK-NEXT: [[V:%.*]] = load volatile i32, ptr [[P:%.*]], align 4 ; CHECK-NEXT: br label [[IF_END]] ; CHECK: if.end: -; CHECK-NEXT: br i1 icmp eq (ptr getelementptr inbounds (i8, ptr @a, i64 8), ptr @b), label [[REM_IS_SAFE:%.*]], label [[REM_IS_UNSAFE:%.*]] +; CHECK-NEXT: br i1 icmp eq (ptr getelementptr inbounds ([5 x i16], ptr @a, i64 0, i64 4), ptr @b), label [[REM_IS_SAFE:%.*]], label [[REM_IS_UNSAFE:%.*]] ; CHECK: rem.is.safe: ; CHECK-NEXT: ret i32 0 ; CHECK: rem.is.unsafe: diff --git a/llvm/test/Transforms/InstCombine/select-and-or.ll b/llvm/test/Transforms/InstCombine/select-and-or.ll index 0965e1c8348e751..0f7acd4d56c0644 100644 --- a/llvm/test/Transforms/InstCombine/select-and-or.ll +++ b/llvm/test/Transforms/InstCombine/select-and-or.ll @@ -431,7 +431,7 @@ define i1 @not_false_not_use3(i1 %x, i1 %y) { define i1 @demorgan_select_infloop1(i1 %L) { ; CHECK-LABEL: @demorgan_select_infloop1( ; CHECK-NEXT: [[NOT_L:%.*]] = xor i1 [[L:%.*]], true -; CHECK-NEXT: [[C15:%.*]] = select i1 [[NOT_L]], i1 xor (i1 icmp eq (ptr getelementptr inbounds (i8, ptr @g2, i64 2), ptr @g1), i1 icmp eq (ptr getelementptr inbounds (i8, ptr @g2, i64 2), ptr @g1)), i1 false +; CHECK-NEXT: [[C15:%.*]] = select i1 [[NOT_L]], i1 xor (i1 icmp eq (ptr getelementptr inbounds (i16, ptr @g2, i64 1), ptr @g1), i1 icmp eq (ptr getelementptr inbounds (i16, ptr @g2, i64 1), ptr @g1)), i1 false ; CHECK-NEXT: ret i1 [[C15]] ; %not.L = xor i1 %L, true @@ -443,7 +443,7 @@ define i1 @demorgan_select_infloop1(i1 %L) { define i1 @demorgan_select_infloop2(i1 %L) { ; CHECK-LABEL: @demorgan_select_infloop2( ; CHECK-NEXT: [[NOT_L:%.*]] = xor i1 [[L:%.*]], true -; CHECK-NEXT: [[C15:%.*]] = select i1 [[NOT_L]], i1 true, i1 xor (i1 icmp eq (ptr getelementptr inbounds (i8, ptr @g2, i64 2), ptr @g1), i1 icmp eq (ptr getelementptr inbounds (i8, ptr @g2, i64 2), ptr @g1)) +; CHECK-NEXT: [[C15:%.*]] = select i1 [[NOT_L]], i1 true, i1 xor (i1 icmp eq (ptr getelementptr inbounds (i16, ptr @g2, i64 1), ptr @g1), i1 icmp eq (ptr getelementptr inbounds (i16, ptr @g2, i64 1), ptr @g1)) ; CHECK-NEXT: ret i1 [[C15]] ; %not.L = xor i1 %L, true diff --git a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll index f0072e24161d463..1a4848934c9f148 100644 --- a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll +++ b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll @@ -85,7 +85,7 @@ define <2 x i1> @xor_and2(<2 x i1> %c, <2 x i32> %X, <2 x i32> %Y) { define <2 x i1> @xor_and3(<2 x i1> %c, <2 x i32> %X, <2 x i32> %Y) { ; CHECK-LABEL: @xor_and3( ; CHECK-NEXT: [[COMP:%.*]] = icmp uge <2 x i32> [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[C:%.*]], <2 x i1> [[COMP]], <2 x i1> +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[C:%.*]], <2 x i1> [[COMP]], <2 x i1> ; CHECK-NEXT: ret <2 x i1> [[SEL]] ; %comp = icmp ult <2 x i32> %X, %Y @@ -122,7 +122,7 @@ define <2 x i1> @xor_or2(<2 x i1> %c, <2 x i32> %X, <2 x i32> %Y) { define <2 x i1> @xor_or3(<2 x i1> %c, <2 x i32> %X, <2 x i32> %Y) { ; CHECK-LABEL: @xor_or3( ; CHECK-NEXT: [[COMP:%.*]] = icmp uge <2 x i32> [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[C:%.*]], <2 x i1> , <2 x i1> [[COMP]] +; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[C:%.*]], <2 x i1> , <2 x i1> [[COMP]] ; CHECK-NEXT: ret <2 x i1> [[SEL]] ; %comp = icmp ult <2 x i32> %X, %Y diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/bitcast.ll b/llvm/test/Transforms/InstSimplify/ConstProp/bitcast.ll index 99b1eb6ef07d3f8..9c75b66db50cc79 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/bitcast.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/bitcast.ll @@ -35,7 +35,8 @@ define i1 @bad_icmp_constexpr_bitcast() { define i1 @bad_fcmp_constexpr_bitcast() { ; CHECK-LABEL: @bad_fcmp_constexpr_bitcast( -; CHECK-NEXT: ret i1 fcmp oeq (float bitcast (i32 ptrtoint (ptr @c to i32) to float), float bitcast (i32 add (i32 ptrtoint (ptr @d to i32), i32 2) to float)) +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float bitcast (i32 ptrtoint (ptr @c to i32) to float), bitcast (i32 add (i32 ptrtoint (ptr @d to i32), i32 2) to float) +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = fcmp oeq float bitcast (i32 ptrtoint (ptr @c to i32) to float), bitcast (i32 add (i32 ptrtoint (ptr @d to i32), i32 2) to float) ret i1 %cmp @@ -45,7 +46,8 @@ define i1 @bad_fcmp_constexpr_bitcast() { define i1 @fcmp_constexpr_oeq(float %conv) { ; CHECK-LABEL: @fcmp_constexpr_oeq( -; CHECK-NEXT: ret i1 fcmp oeq (float bitcast (i32 ptrtoint (ptr @a to i32) to float), float bitcast (i32 ptrtoint (ptr @a to i32) to float)) +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float bitcast (i32 ptrtoint (ptr @a to i32) to float), bitcast (i32 ptrtoint (ptr @a to i32) to float) +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = fcmp oeq float bitcast (i32 ptrtoint (ptr @a to i32) to float), bitcast (i32 ptrtoint (ptr @a to i32) to float) ret i1 %cmp @@ -55,7 +57,8 @@ define i1 @fcmp_constexpr_oeq(float %conv) { define i1 @fcmp_constexpr_une(float %conv) { ; CHECK-LABEL: @fcmp_constexpr_une( -; CHECK-NEXT: ret i1 fcmp une (float bitcast (i32 ptrtoint (ptr @a to i32) to float), float bitcast (i32 ptrtoint (ptr @a to i32) to float)) +; CHECK-NEXT: [[CMP:%.*]] = fcmp une float bitcast (i32 ptrtoint (ptr @a to i32) to float), bitcast (i32 ptrtoint (ptr @a to i32) to float) +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = fcmp une float bitcast (i32 ptrtoint (ptr @a to i32) to float), bitcast (i32 ptrtoint (ptr @a to i32) to float) ret i1 %cmp diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll b/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll index 1d7ed23d3e82d76..3ef9552eb79d641 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll @@ -47,7 +47,8 @@ define i1 @ule_constexpr_null(ptr %x) { define i1 @slt_constexpr_null(ptr %x) { ; CHECK-LABEL: @slt_constexpr_null( -; CHECK-NEXT: ret i1 icmp slt (ptr @ugt_null_constexpr, ptr null) +; CHECK-NEXT: [[CMP:%.*]] = icmp slt ptr @ugt_null_constexpr, null +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp slt ptr @ugt_null_constexpr, null ret i1 %cmp @@ -57,7 +58,8 @@ define i1 @slt_constexpr_null(ptr %x) { define i1 @ult_constexpr_constexpr_one(ptr %x) { ; CHECK-LABEL: @ult_constexpr_constexpr_one( -; CHECK-NEXT: ret i1 icmp ugt (ptr inttoptr (i32 1 to ptr), ptr @ugt_null_constexpr) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr @ugt_null_constexpr, inttoptr (i32 1 to ptr) +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ult ptr @ugt_null_constexpr, inttoptr (i32 1 to ptr) ret i1 %cmp @@ -86,7 +88,8 @@ define i1 @global_ugt_null() { define i1 @global_sgt_null() { ; CHECK-LABEL: @global_sgt_null( -; CHECK-NEXT: ret i1 icmp sgt (ptr @g, ptr null) +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr @g, null +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp sgt ptr @g, null ret i1 %cmp @@ -95,7 +98,8 @@ define i1 @global_sgt_null() { ; Should not fold to true, as the gep computes a null value. define i1 @global_out_of_bounds_gep_ne_null() { ; CHECK-LABEL: @global_out_of_bounds_gep_ne_null( -; CHECK-NEXT: ret i1 icmp ne (ptr getelementptr (i8, ptr @g3, i64 sub (i64 0, i64 ptrtoint (ptr @g3 to i64))), ptr null) +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr getelementptr (i8, ptr @g3, i64 sub (i64 0, i64 ptrtoint (ptr @g3 to i64))), null +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp ne ptr getelementptr (i8, ptr @g3, i64 sub (i64 0, i64 ptrtoint (ptr @g3 to i64))), null ret i1 %cmp @@ -121,7 +125,8 @@ define i1 @global_gep_ugt_null() { define i1 @global_gep_sgt_null() { ; CHECK-LABEL: @global_gep_sgt_null( -; CHECK-NEXT: ret i1 icmp sgt (ptr getelementptr inbounds (i8, ptr @g, i64 8), ptr null) +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr getelementptr inbounds (i8, ptr @g, i64 8), null +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr inbounds [2 x i32], ptr @g, i64 1 %cmp = icmp sgt ptr %gep, null @@ -132,7 +137,8 @@ define i1 @global_gep_sgt_null() { ; are equal. define i1 @null_gep_ne_null() { ; CHECK-LABEL: @null_gep_ne_null( -; CHECK-NEXT: ret i1 icmp ne (ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64)), ptr null) +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64)), null +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64) %cmp = icmp ne ptr %gep, null @@ -141,7 +147,8 @@ define i1 @null_gep_ne_null() { define i1 @null_gep_ugt_null() { ; CHECK-LABEL: @null_gep_ugt_null( -; CHECK-NEXT: ret i1 icmp ugt (ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64)), ptr null) +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64)), null +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64) %cmp = icmp ugt ptr %gep, null @@ -150,7 +157,8 @@ define i1 @null_gep_ugt_null() { define i1 @null_gep_sgt_null() { ; CHECK-LABEL: @null_gep_sgt_null( -; CHECK-NEXT: ret i1 icmp sgt (ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64)), ptr null) +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64)), null +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr i8, ptr null, i64 ptrtoint (ptr @g2_weak to i64) %cmp = icmp sgt ptr %gep, null @@ -177,7 +185,8 @@ define i1 @null_gep_ugt_null_constant_int() { define i1 @null_gep_ne_global() { ; CHECK-LABEL: @null_gep_ne_global( -; CHECK-NEXT: ret i1 icmp ne (ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g3 to i64)), ptr @g3) +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g3 to i64)), @g3 +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr i8, ptr null, i64 ptrtoint (ptr @g3 to i64) %cmp = icmp ne ptr %gep, @g3 @@ -186,7 +195,8 @@ define i1 @null_gep_ne_global() { define i1 @null_gep_ult_global() { ; CHECK-LABEL: @null_gep_ult_global( -; CHECK-NEXT: ret i1 icmp ult (ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g3 to i64)), ptr @g3) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr getelementptr (i8, ptr null, i64 ptrtoint (ptr @g3 to i64)), @g3 +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr i8, ptr null, i64 ptrtoint (ptr @g3 to i64) %cmp = icmp ult ptr %gep, @g3 @@ -195,7 +205,8 @@ define i1 @null_gep_ult_global() { define i1 @null_gep_slt_global() { ; CHECK-LABEL: @null_gep_slt_global( -; CHECK-NEXT: ret i1 icmp slt (ptr getelementptr ([2 x i32], ptr null, i64 ptrtoint (ptr @g2 to i64)), ptr @g) +; CHECK-NEXT: [[CMP:%.*]] = icmp slt ptr getelementptr ([2 x i32], ptr null, i64 ptrtoint (ptr @g2 to i64)), @g +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr [2 x i32], ptr null, i64 ptrtoint (ptr @g2 to i64) %cmp = icmp slt ptr %gep, @g @@ -222,7 +233,8 @@ define i1 @global_gep_ugt_global() { define i1 @global_gep_sgt_global() { ; CHECK-LABEL: @global_gep_sgt_global( -; CHECK-NEXT: ret i1 icmp sgt (ptr getelementptr inbounds (i8, ptr @g, i64 8), ptr @g) +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr getelementptr inbounds (i8, ptr @g, i64 8), @g +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr inbounds [2 x i32], ptr @g, i64 1 %cmp = icmp sgt ptr %gep, @g @@ -232,7 +244,8 @@ define i1 @global_gep_sgt_global() { ; This should not fold to true, as the offset is negative. define i1 @global_gep_ugt_global_neg_offset() { ; CHECK-LABEL: @global_gep_ugt_global_neg_offset( -; CHECK-NEXT: ret i1 icmp ugt (ptr getelementptr (i8, ptr @g, i64 -8), ptr @g) +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt ptr getelementptr (i8, ptr @g, i64 -8), @g +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr [2 x i32], ptr @g, i64 -1 %cmp = icmp ugt ptr %gep, @g @@ -241,7 +254,8 @@ define i1 @global_gep_ugt_global_neg_offset() { define i1 @global_gep_sgt_global_neg_offset() { ; CHECK-LABEL: @global_gep_sgt_global_neg_offset( -; CHECK-NEXT: ret i1 icmp sgt (ptr getelementptr (i8, ptr @g, i64 -8), ptr @g) +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr getelementptr (i8, ptr @g, i64 -8), @g +; CHECK-NEXT: ret i1 [[CMP]] ; %gep = getelementptr [2 x i32], ptr @g, i64 -1 %cmp = icmp sgt ptr %gep, @g @@ -260,7 +274,8 @@ define i1 @global_gep_ugt_global_gep() { ; Should not fold due to signed comparison. define i1 @global_gep_sgt_global_gep() { ; CHECK-LABEL: @global_gep_sgt_global_gep( -; CHECK-NEXT: ret i1 icmp sgt (ptr getelementptr inbounds (i8, ptr @g, i64 4), ptr @g) +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt ptr getelementptr inbounds (i8, ptr @g, i64 4), @g +; CHECK-NEXT: ret i1 [[CMP]] ; %gep2 = getelementptr inbounds [2 x i32], ptr @g, i64 0, i64 1 %cmp = icmp sgt ptr %gep2, @g @@ -280,7 +295,8 @@ declare void @func() define i1 @global_no_cfi() { ; CHECK-LABEL: @global_no_cfi( -; CHECK-NEXT: ret i1 icmp eq (ptr @func, ptr no_cfi @func) +; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr @func, no_cfi @func +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp eq ptr @func, no_cfi @func ret i1 %cmp @@ -290,7 +306,8 @@ define i1 @blockaddr_no_cfi() { ; CHECK-LABEL: @blockaddr_no_cfi( ; CHECK-NEXT: br label [[BB:%.*]] ; CHECK: bb: -; CHECK-NEXT: ret i1 icmp eq (ptr blockaddress(@blockaddr_no_cfi, [[BB]]), ptr no_cfi @func) +; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr blockaddress(@blockaddr_no_cfi, [[BB]]), no_cfi @func +; CHECK-NEXT: ret i1 [[CMP]] ; br label %bb @@ -301,7 +318,8 @@ bb: define i1 @global_no_cfi_dso_local_equivalent() { ; CHECK-LABEL: @global_no_cfi_dso_local_equivalent( -; CHECK-NEXT: ret i1 icmp eq (ptr dso_local_equivalent @func, ptr no_cfi @func) +; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr dso_local_equivalent @func, no_cfi @func +; CHECK-NEXT: ret i1 [[CMP]] ; %cmp = icmp eq ptr dso_local_equivalent @func, no_cfi @func ret i1 %cmp diff --git a/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll b/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll index b9e2753d3feb021..68ff0859beb2a73 100644 --- a/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll +++ b/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll @@ -76,7 +76,8 @@ define <4 x i32> @test9(<1 x i64> %y) { define <1 x i1> @test10() { ; CHECK-LABEL: @test10( -; CHECK-NEXT: ret <1 x i1> to i64), i64 0)> +; CHECK-NEXT: [[RET:%.*]] = icmp eq <1 x i64> to i64)>, zeroinitializer +; CHECK-NEXT: ret <1 x i1> [[RET]] ; %ret = icmp eq <1 x i64> to i64)>, zeroinitializer ret <1 x i1> %ret diff --git a/llvm/test/Transforms/InstSimplify/compare.ll b/llvm/test/Transforms/InstSimplify/compare.ll index 0f72cd813f2f935..1e78bb232f7976f 100644 --- a/llvm/test/Transforms/InstSimplify/compare.ll +++ b/llvm/test/Transforms/InstSimplify/compare.ll @@ -3078,7 +3078,8 @@ define i1 @globals_inequal() { ; TODO: Never equal define i1 @globals_offset_inequal() { ; CHECK-LABEL: @globals_offset_inequal( -; CHECK-NEXT: ret i1 icmp ne (ptr getelementptr inbounds (i8, ptr @A, i32 1), ptr getelementptr inbounds (i8, ptr @B, i32 1)) +; CHECK-NEXT: [[RES:%.*]] = icmp ne ptr getelementptr inbounds (i8, ptr @A, i32 1), getelementptr inbounds (i8, ptr @B, i32 1) +; CHECK-NEXT: ret i1 [[RES]] ; %a.off = getelementptr i8, ptr @A, i32 1 %b.off = getelementptr i8, ptr @B, i32 1 @@ -3100,7 +3101,8 @@ define i1 @test_byval_global_inequal(ptr byval(i32) %a) { define i1 @neg_global_alias() { ; CHECK-LABEL: @neg_global_alias( -; CHECK-NEXT: ret i1 icmp ne (ptr @A, ptr @A.alias) +; CHECK-NEXT: [[RES:%.*]] = icmp ne ptr @A, @A.alias +; CHECK-NEXT: ret i1 [[RES]] ; %res = icmp ne ptr @A, @A.alias ret i1 %res diff --git a/llvm/test/Transforms/InstSimplify/past-the-end.ll b/llvm/test/Transforms/InstSimplify/past-the-end.ll index 1e146d18327a141..cc2fe6f36fcd83f 100644 --- a/llvm/test/Transforms/InstSimplify/past-the-end.ll +++ b/llvm/test/Transforms/InstSimplify/past-the-end.ll @@ -21,7 +21,8 @@ define zeroext i1 @no_offsets() { define zeroext i1 @both_past_the_end() { ; CHECK-LABEL: @both_past_the_end( -; CHECK-NEXT: ret i1 icmp eq (ptr getelementptr inbounds (i8, ptr @opte_a, i32 4), ptr getelementptr inbounds (i8, ptr @opte_b, i32 4)) +; CHECK-NEXT: [[T:%.*]] = icmp eq ptr getelementptr inbounds (i8, ptr @opte_a, i32 4), getelementptr inbounds (i8, ptr @opte_b, i32 4) +; CHECK-NEXT: ret i1 [[T]] ; %x = getelementptr i32, ptr @opte_a, i32 1 %y = getelementptr i32, ptr @opte_b, i32 1 @@ -35,7 +36,8 @@ define zeroext i1 @both_past_the_end() { define zeroext i1 @just_one_past_the_end() { ; CHECK-LABEL: @just_one_past_the_end( -; CHECK-NEXT: ret i1 icmp eq (ptr getelementptr inbounds (i8, ptr @opte_a, i32 4), ptr @opte_b) +; CHECK-NEXT: [[T:%.*]] = icmp eq ptr getelementptr inbounds (i8, ptr @opte_a, i32 4), @opte_b +; CHECK-NEXT: ret i1 [[T]] ; %x = getelementptr i32, ptr @opte_a, i32 1 %t = icmp eq ptr %x, @opte_b diff --git a/llvm/test/Transforms/JumpThreading/constant-fold-status.ll b/llvm/test/Transforms/JumpThreading/constant-fold-status.ll index ae984df1caa3bd6..3d98b0d6eecc32c 100644 --- a/llvm/test/Transforms/JumpThreading/constant-fold-status.ll +++ b/llvm/test/Transforms/JumpThreading/constant-fold-status.ll @@ -8,7 +8,8 @@ ; status check that is hidden under EXPENSIVE_CHECKS. ; CHECK-LABEL: entry: -; CHECK-NEXT: br i1 icmp eq (i32 ptrtoint (ptr @a to i32), i32 0), label %overflow, label %cont +; CHECK-NEXT: %.not = icmp eq i32 ptrtoint (ptr @a to i32), 0 +; CHECK-NEXT: br i1 %.not, label %overflow, label %cont @a = internal global i16 0 diff --git a/llvm/test/Transforms/LowerTypeTests/cfi-direct-call1.ll b/llvm/test/Transforms/LowerTypeTests/cfi-direct-call1.ll index 1b7039f905cc681..3afb4875ca28803 100644 --- a/llvm/test/Transforms/LowerTypeTests/cfi-direct-call1.ll +++ b/llvm/test/Transforms/LowerTypeTests/cfi-direct-call1.ll @@ -56,8 +56,9 @@ entry: ; FULL: %fptr1 = select i1 %cmp.i, ptr @local_func1, ptr @local_func2 ; Indirect references to extern_weak and extern_decl must go through jump table -; FULL: %0 = select i1 icmp ne (ptr @extern_weak, ptr null), ptr getelementptr inbounds ([4 x [8 x i8]], ptr @.cfi.jumptable, i64 0, i64 2), ptr null -; FULL: %fptr2 = select i1 %cmp.i, ptr %0, ptr getelementptr inbounds ([4 x [8 x i8]], ptr @.cfi.jumptable, i64 0, i64 3) +; FULL: [[CMP:%.*]] = icmp ne ptr @extern_weak, null +; FULL: [[SEL:%.*]] = select i1 [[CMP]], ptr getelementptr inbounds ([4 x [8 x i8]], ptr @.cfi.jumptable, i64 0, i64 2), ptr null +; FULL: %fptr2 = select i1 %cmp.i, ptr [[SEL]], ptr getelementptr inbounds ([4 x [8 x i8]], ptr @.cfi.jumptable, i64 0, i64 3) ; Direct calls to extern_weak and extern_decl should go to original names ; FULL: %call5 = tail call i32 @extern_decl() @@ -83,8 +84,9 @@ entry: ; THIN: %fptr1 = select i1 %cmp.i, ptr @local_func1, ptr @local_func2 ; Indirect references to extern_weak and extern_decl must go through jump table -; THIN: %0 = select i1 icmp ne (ptr @extern_weak, ptr null), ptr @extern_weak.cfi_jt, ptr null -; THIN: %fptr2 = select i1 %cmp.i, ptr %0, ptr @extern_decl.cfi_jt +; THIN: [[CMP:%.*]] = icmp ne ptr @extern_weak, null +; THIN: [[SEL:%.*]] = select i1 [[CMP]], ptr @extern_weak.cfi_jt, ptr null +; THIN: %fptr2 = select i1 %cmp.i, ptr [[SEL]], ptr @extern_decl.cfi_jt ; Direct calls to extern_weak and extern_decl should go to original names ; THIN: %call5 = tail call i32 @extern_decl() diff --git a/llvm/test/Transforms/LowerTypeTests/function-weak.ll b/llvm/test/Transforms/LowerTypeTests/function-weak.ll index 5f9041cd21b3c80..33876bda356c072 100644 --- a/llvm/test/Transforms/LowerTypeTests/function-weak.ll +++ b/llvm/test/Transforms/LowerTypeTests/function-weak.ll @@ -34,9 +34,10 @@ declare !type !0 extern_weak void @f() ; CHECK: define zeroext i1 @check_f() define zeroext i1 @check_f() { entry: -; CHECK: %0 = select i1 icmp ne (ptr @f, ptr null), ptr @[[JT:.*]], ptr null -; CHECK: %1 = icmp ne ptr %0, null -; ret i1 %1 +; CHECK: [[CMP:%.*]] = icmp ne ptr @f, null +; CHECK: [[SEL:%.*]] = select i1 [[CMP]], ptr @[[JT:.*]], ptr null +; CHECK: [[CMP2:%.*]] = icmp ne ptr [[SEL]], null +; CHECK: ret i1 [[CMP2]] ret i1 icmp ne (ptr @f, ptr null) } @@ -50,11 +51,12 @@ entry: define void @struct() { ; CHECK-LABEL: define void @struct() { -; CHECK: %0 = select i1 icmp ne (ptr @f, ptr null), ptr @.cfi.jumptable, ptr null -; CHECK-NEXT: %1 = icmp ne ptr %0, null -; CHECK-NEXT: %2 = insertvalue { i1, i8 } poison, i1 %1, 0 -; CHECK-NEXT: %3 = insertvalue { i1, i8 } %2, i8 0, 1 -; CHECK-NEXT: %x = extractvalue { i1, i8 } %3, 0 +; CHECK: [[CMP:%.*]] = icmp ne ptr @f, null +; CHECK: [[SEL:%.*]] = select i1 [[CMP]], ptr @.cfi.jumptable, ptr null +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne ptr [[SEL]], null +; CHECK-NEXT: [[IV:%.*]] = insertvalue { i1, i8 } poison, i1 [[CMP2]], 0 +; CHECK-NEXT: [[IV2:%.*]] = insertvalue { i1, i8 } [[IV]], i8 0, 1 +; CHECK-NEXT: %x = extractvalue { i1, i8 } [[IV2]], 0 entry: %x = extractvalue { i1, i8 } { i1 icmp ne (ptr @f, ptr null), i8 0 }, 0 @@ -64,14 +66,16 @@ entry: define void @phi(i1 %c) { ; CHECK-LABEL: define void @phi(i1 %c) { ; CHECK: entry: -; CHECK: %0 = select i1 icmp ne (ptr @f, ptr null), ptr @.cfi.jumptable, ptr null +; CHECK: [[CMP:%.*]] = icmp ne ptr @f, null +; CHECK: [[SEL:%.*]] = select i1 [[CMP]], ptr @.cfi.jumptable, ptr null ; CHECK: br i1 %c, label %if, label %join ; CHECK: if: -; CHECK: %1 = select i1 icmp ne (ptr @f, ptr null), ptr @.cfi.jumptable, ptr null +; CHECK: [[CMP2:%.*]] = icmp ne ptr @f, null +; CHECK: [[SEL2:%.*]] = select i1 [[CMP2]], ptr @.cfi.jumptable, ptr null ; CHECK: br label %join ; CHECK: join: -; CHECK: %phi = phi ptr [ %1, %if ], [ null, %entry ] -; CHECK: %phi2 = phi ptr [ null, %if ], [ %0, %entry ] +; CHECK: %phi = phi ptr [ [[SEL2]], %if ], [ null, %entry ] +; CHECK: %phi2 = phi ptr [ null, %if ], [ [[SEL]], %entry ] entry: br i1 %c, label %if, label %join @@ -90,17 +94,19 @@ define void @phi2(i1 %c, i32 %x) { ; CHECK: entry: ; CHECK: br i1 %c, label %if, label %else ; CHECK: if: ; preds = %entry -; CHECK: %0 = select i1 icmp ne (ptr @f, ptr null), ptr @.cfi.jumptable, ptr null +; CHECK: [[CMP:%.*]] = icmp ne ptr @f, null +; CHECK: [[SEL:%.*]] = select i1 [[CMP]], ptr @.cfi.jumptable, ptr null ; CHECK: switch i32 %x, label %join [ ; CHECK: i32 0, label %join ; CHECK: ] ; CHECK: else: ; preds = %entry -; CHECK: %1 = select i1 icmp ne (ptr @f, ptr null), ptr @.cfi.jumptable, ptr null +; CHECK: [[CMP2:%.*]] = icmp ne ptr @f, null +; CHECK: [[SEL2:%.*]] = select i1 [[CMP2]], ptr @.cfi.jumptable, ptr null ; CHECK: switch i32 %x, label %join [ ; CHECK: i32 0, label %join ; CHECK: ] ; CHECK: join: ; preds = %else, %else, %if, %if -; CHECK: %phi2 = phi ptr [ %0, %if ], [ %0, %if ], [ %1, %else ], [ %1, %else ] +; CHECK: %phi2 = phi ptr [ [[SEL]], %if ], [ [[SEL]], %if ], [ [[SEL2]], %else ], [ [[SEL2]], %else ] entry: br i1 %c, label %if, label %else @@ -132,23 +138,29 @@ define i1 @foo(ptr %p) { ; RISCV: define private void @[[JT]]() #{{.*}} align 8 { ; LOONGARCH64: define private void @[[JT]]() #{{.*}} align 8 { -; CHECK: define internal void @__cfi_global_var_init() section ".text.startup" { +; CHECK-LABEL: define internal void @__cfi_global_var_init() section ".text.startup" { ; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = select i1 icmp ne (ptr @f, ptr null), ptr @[[JT]], ptr null -; CHECK-NEXT: store ptr %0, ptr @x, align 8 -; CHECK-NEXT: %1 = select i1 icmp ne (ptr @f, ptr null), ptr @[[JT]], ptr null -; CHECK-NEXT: store ptr %1, ptr @x2, align 8 -; CHECK-NEXT: %2 = select i1 icmp ne (ptr @f, ptr null), ptr @[[JT]], ptr null -; CHECK-NEXT: store ptr %2, ptr @x3, align 8 -; CHECK-NEXT: %3 = select i1 icmp ne (ptr @f, ptr null), ptr @[[JT]], ptr null -; CHECK-NEXT: %4 = getelementptr i8, ptr %3, i64 42 -; CHECK-NEXT: store ptr %4, ptr @x4, align 8 -; CHECK-NEXT: %5 = select i1 icmp ne (ptr @f, ptr null), ptr @[[JT]], ptr null -; CHECK-NEXT: %6 = insertvalue { ptr, ptr, i32 } poison, ptr %5, 0 -; CHECK-NEXT: %7 = select i1 icmp ne (ptr @f, ptr null), ptr @[[JT]], ptr null -; CHECK-NEXT: %8 = insertvalue { ptr, ptr, i32 } %6, ptr %7, 1 -; CHECK-NEXT: %9 = insertvalue { ptr, ptr, i32 } %8, i32 42, 2 -; CHECK-NEXT: store { ptr, ptr, i32 } %9, ptr @s, align 8 +; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @f, null +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], ptr @[[JT]], ptr null +; CHECK-NEXT: store ptr [[SEL]], ptr @x, align 8 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne ptr @f, null +; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], ptr @[[JT]], ptr null +; CHECK-NEXT: store ptr [[SEL2]], ptr @x2, align 8 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ne ptr @f, null +; CHECK-NEXT: [[SEL3:%.*]] = select i1 [[CMP3]], ptr @[[JT]], ptr null +; CHECK-NEXT: store ptr [[SEL3]], ptr @x3, align 8 +; CHECK-NEXT: [[CMP4:%.*]] = icmp ne ptr @f, null +; CHECK-NEXT: [[SEL4:%.*]] = select i1 [[CMP4]], ptr @[[JT]], ptr null +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[SEL4]], i64 42 +; CHECK-NEXT: store ptr [[GEP]], ptr @x4, align 8 +; CHECK-NEXT: [[CMP5:%.*]] = icmp ne ptr @f, null +; CHECK-NEXT: [[SEL5:%.*]] = select i1 [[CMP5]], ptr @[[JT]], ptr null +; CHECK-NEXT: [[IV:%.*]] = insertvalue { ptr, ptr, i32 } poison, ptr [[SEL5]], 0 +; CHECK-NEXT: [[CMP6:%.*]] = icmp ne ptr @f, null +; CHECK-NEXT: [[SEL6:%.*]] = select i1 [[CMP6]], ptr @[[JT]], ptr null +; CHECK-NEXT: [[IV2:%.*]] = insertvalue { ptr, ptr, i32 } [[IV]], ptr [[SEL6]], 1 +; CHECK-NEXT: [[IV3:%.*]] = insertvalue { ptr, ptr, i32 } [[IV2]], i32 42, 2 +; CHECK-NEXT: store { ptr, ptr, i32 } [[IV3]], ptr @s, align 8 ; CHECK-NEXT: ret void ; CHECK-NEXT: } diff --git a/llvm/test/Transforms/SCCP/conditions-ranges.ll b/llvm/test/Transforms/SCCP/conditions-ranges.ll index 25719d2bee521c5..bb3764160f72469 100644 --- a/llvm/test/Transforms/SCCP/conditions-ranges.ll +++ b/llvm/test/Transforms/SCCP/conditions-ranges.ll @@ -631,10 +631,13 @@ false: define void @f14_constexpr2() { ; CHECK-LABEL: @f14_constexpr2( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 icmp eq (i32 ptrtoint (ptr @A to i32), i32 ptrtoint (ptr @B to i32)), label [[TRUE:%.*]], label [[FALSE:%.*]] +; CHECK-NEXT: [[BC_1:%.*]] = icmp eq i32 ptrtoint (ptr @A to i32), ptrtoint (ptr @B to i32) +; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: -; CHECK-NEXT: call void @use(i1 icmp ne (i32 ptrtoint (ptr @B to i32), i32 ptrtoint (ptr @A to i32))) -; CHECK-NEXT: call void @use(i1 icmp eq (i32 ptrtoint (ptr @B to i32), i32 ptrtoint (ptr @A to i32))) +; CHECK-NEXT: [[F_1:%.*]] = icmp ne i32 ptrtoint (ptr @B to i32), ptrtoint (ptr @A to i32) +; CHECK-NEXT: call void @use(i1 [[F_1]]) +; CHECK-NEXT: [[F_2:%.*]] = icmp eq i32 ptrtoint (ptr @B to i32), ptrtoint (ptr @A to i32) +; CHECK-NEXT: call void @use(i1 [[F_2]]) ; CHECK-NEXT: ret void ; CHECK: false: ; CHECK-NEXT: ret void diff --git a/llvm/test/Transforms/SimplifyCFG/phi-to-select-constexpr-icmp.ll b/llvm/test/Transforms/SimplifyCFG/phi-to-select-constexpr-icmp.ll index 307de76bc321b89..a56e7041bf2e6db 100644 --- a/llvm/test/Transforms/SimplifyCFG/phi-to-select-constexpr-icmp.ll +++ b/llvm/test/Transforms/SimplifyCFG/phi-to-select-constexpr-icmp.ll @@ -8,7 +8,7 @@ define i1 @test(i1 %c) { ; CHECK-LABEL: @test( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[C:%.*]], i1 false, i1 icmp ugt (ptr inttoptr (i64 -40 to ptr), ptr @glob) +; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[C:%.*]], i1 false, i1 icmp ult (ptr @glob, ptr inttoptr (i64 -40 to ptr)) ; CHECK-NEXT: ret i1 [[SPEC_SELECT]] ; entry: