Author: Andreas Jonson Date: 2024-04-26T11:04:47+09:00 New Revision: 93de97d750548cd90c53efd4367dbd0367aa30fd
URL: https://github.com/llvm/llvm-project/commit/93de97d750548cd90c53efd4367dbd0367aa30fd DIFF: https://github.com/llvm/llvm-project/commit/93de97d750548cd90c53efd4367dbd0367aa30fd.diff LOG: [SCCP] Swap out range metadata to range attribute (#90134) Also moved the range from the function's call sites to the functions return value as that is possible now. Added: Modified: clang/test/CodeGen/X86/ms-x86-intrinsics.c clang/test/CodeGen/attr-counted-by.c clang/test/CodeGen/ms-mixed-ptr-sizes.c llvm/include/llvm/IR/Function.h llvm/lib/IR/Function.cpp llvm/lib/Transforms/IPO/SCCP.cpp llvm/test/Transforms/FunctionSpecialization/discover-transitive-phis.ll llvm/test/Transforms/FunctionSpecialization/global-var-constants.ll llvm/test/Transforms/FunctionSpecialization/literal-const.ll llvm/test/Transforms/LowerTypeTests/cfi-nounwind-direct-call.ll llvm/test/Transforms/PhaseOrdering/AArch64/quant_4x4.ll llvm/test/Transforms/PhaseOrdering/icmp-ashr-breaking-select-idiom.ll llvm/test/Transforms/PhaseOrdering/min_max_loop.ll llvm/test/Transforms/SCCP/and-add-shl.ll llvm/test/Transforms/SCCP/ip-add-range-to-call.ll llvm/test/Transforms/SCCP/ip-ranges-casts.ll llvm/test/Transforms/SCCP/ipsccp-basic.ll llvm/test/Transforms/SCCP/switch.ll llvm/test/Transforms/SCCP/trunc-nuw-nsw-flags.ll Removed: ################################################################################ diff --git a/clang/test/CodeGen/X86/ms-x86-intrinsics.c b/clang/test/CodeGen/X86/ms-x86-intrinsics.c index a1c90d71c8ebf5..aa557c8e19a83d 100644 --- a/clang/test/CodeGen/X86/ms-x86-intrinsics.c +++ b/clang/test/CodeGen/X86/ms-x86-intrinsics.c @@ -48,7 +48,7 @@ long long test__readfsqword(unsigned long Offset) { __int64 test__emul(int a, int b) { return __emul(a, b); } -// CHECK-LABEL: define dso_local i64 @test__emul(i32 noundef %a, i32 noundef %b) +// CHECK-LABEL: define dso_local range(i64 -4611686016279904256, 4611686018427387905) i64 @test__emul(i32 noundef %a, i32 noundef %b) // CHECK: [[X:%[0-9]+]] = sext i32 %a to i64 // CHECK: [[Y:%[0-9]+]] = sext i32 %b to i64 // CHECK: [[RES:%[0-9]+]] = mul nsw i64 [[Y]], [[X]] @@ -57,7 +57,7 @@ __int64 test__emul(int a, int b) { unsigned __int64 test__emulu(unsigned int a, unsigned int b) { return __emulu(a, b); } -// CHECK-LABEL: define dso_local i64 @test__emulu(i32 noundef %a, i32 noundef %b) +// CHECK-LABEL: define dso_local range(i64 0, -8589934590) i64 @test__emulu(i32 noundef %a, i32 noundef %b) // CHECK: [[X:%[0-9]+]] = zext i32 %a to i64 // CHECK: [[Y:%[0-9]+]] = zext i32 %b to i64 // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] @@ -108,13 +108,13 @@ long long test__readgsqword(unsigned long Offset) { __int64 test__mulh(__int64 a, __int64 b) { return __mulh(a, b); } -// CHECK-X64-LABEL: define dso_local i64 @test__mulh(i64 noundef %a, i64 noundef %b) +// CHECK-X64-LABEL: define dso_local range(i64 -4611686018427387904, 4611686018427387905) i64 @test__mulh(i64 noundef %a, i64 noundef %b) // CHECK-X64: = mul nsw i128 % unsigned __int64 test__umulh(unsigned __int64 a, unsigned __int64 b) { return __umulh(a, b); } -// CHECK-X64-LABEL: define dso_local i64 @test__umulh(i64 noundef %a, i64 noundef %b) +// CHECK-X64-LABEL: define dso_local range(i64 0, -1) i64 @test__umulh(i64 noundef %a, i64 noundef %b) // CHECK-X64: = mul nuw i128 % __int64 test_mul128(__int64 Multiplier, diff --git a/clang/test/CodeGen/attr-counted-by.c b/clang/test/CodeGen/attr-counted-by.c index 1fb39f9a346667..de30a00138ac80 100644 --- a/clang/test/CodeGen/attr-counted-by.c +++ b/clang/test/CodeGen/attr-counted-by.c @@ -66,7 +66,7 @@ struct anon_struct { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ult i64 [[IDXPROM]], [[TMP0]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB2:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10:[0-9]+]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10:[0-9]+]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont3: // SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 12 @@ -114,7 +114,7 @@ void test1(struct annotated *p, int index, int val) { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ugt i64 [[TMP0]], [[INDEX]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB4:[0-9]+]], i64 [[INDEX]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB3:[0-9]+]], i64 [[INDEX]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont3: // SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 12 @@ -158,7 +158,7 @@ void test2(struct annotated *p, size_t index) { p->array[index] = __builtin_dynamic_object_size(p->array, 1); } -// SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test2_bdos( +// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -8589934592, 8589934589) i64 @test2_bdos( // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { // SANITIZE-WITH-ATTR-NEXT: entry: // SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -169,7 +169,7 @@ void test2(struct annotated *p, size_t index) { // SANITIZE-WITH-ATTR-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i64 [[TMP1]], i64 0 // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP3]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test2_bdos( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -8589934592, 8589934589) i64 @test2_bdos( // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { // NO-SANITIZE-WITH-ATTR-NEXT: entry: // NO-SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -203,7 +203,7 @@ size_t test2_bdos(struct annotated *p) { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ugt i64 [[TMP0]], [[INDEX]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB5:[0-9]+]], i64 [[INDEX]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB4:[0-9]+]], i64 [[INDEX]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont3: // SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 12 @@ -257,7 +257,7 @@ void test3(struct annotated *p, size_t index) { p->array[index] = __builtin_dynamic_object_size(p, 1); } -// SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test3_bdos( +// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 0, 8589934601) i64 @test3_bdos( // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // SANITIZE-WITH-ATTR-NEXT: entry: // SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -270,7 +270,7 @@ void test3(struct annotated *p, size_t index) { // SANITIZE-WITH-ATTR-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i64 [[TMP3]], i64 0 // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP5]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test3_bdos( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 0, 8589934601) i64 @test3_bdos( // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // NO-SANITIZE-WITH-ATTR-NEXT: entry: // NO-SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -308,7 +308,7 @@ size_t test3_bdos(struct annotated *p) { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ult i64 [[IDXPROM]], [[TMP0]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT4:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB6:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB5:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont4: // SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[DOT_COUNTED_BY_LOAD]], 2 @@ -325,7 +325,7 @@ size_t test3_bdos(struct annotated *p) { // SANITIZE-WITH-ATTR-NEXT: [[TMP7:%.*]] = icmp ult i64 [[IDXPROM13]], [[TMP6]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP7]], label [[CONT20:%.*]], label [[HANDLER_OUT_OF_BOUNDS16:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds16: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB7:[0-9]+]], i64 [[IDXPROM13]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB6:[0-9]+]], i64 [[IDXPROM13]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont20: // SANITIZE-WITH-ATTR-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[DOT_COUNTED_BY_LOAD7]], 3 @@ -342,7 +342,7 @@ size_t test3_bdos(struct annotated *p) { // SANITIZE-WITH-ATTR-NEXT: [[TMP13:%.*]] = icmp ult i64 [[IDXPROM30]], [[TMP12]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP13]], label [[CONT37:%.*]], label [[HANDLER_OUT_OF_BOUNDS33:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds33: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB8:[0-9]+]], i64 [[IDXPROM30]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB7:[0-9]+]], i64 [[IDXPROM30]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont37: // SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX35:%.*]] = getelementptr inbounds [0 x i32], ptr [[ARRAY]], i64 0, i64 [[IDXPROM30]] @@ -441,7 +441,7 @@ void test4(struct annotated *p, int index, int fam_idx) { p->array[index + 2] = (unsigned char)__builtin_dynamic_object_size(&(p->array[fam_idx]), 1); } -// SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test4_bdos( +// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -17179869180, 17179869181) i64 @test4_bdos( // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR2]] { // SANITIZE-WITH-ATTR-NEXT: entry: // SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -456,7 +456,7 @@ void test4(struct annotated *p, int index, int fam_idx) { // SANITIZE-WITH-ATTR-NEXT: [[TMP7:%.*]] = select i1 [[TMP6]], i64 [[TMP3]], i64 0 // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP7]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test4_bdos( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -17179869180, 17179869181) i64 @test4_bdos( // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR2]] { // NO-SANITIZE-WITH-ATTR-NEXT: entry: // NO-SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -494,7 +494,7 @@ size_t test4_bdos(struct annotated *p, int index) { // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp ugt i64 [[DOT_COUNTED_BY_LOAD]], [[IDXPROM]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB9:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB8:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont3: // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 16 @@ -545,7 +545,7 @@ void test5(struct anon_struct *p, int index) { p->array[index] = __builtin_dynamic_object_size(p, 1); } -// SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test5_bdos( +// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 16, 1) i64 @test5_bdos( // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // SANITIZE-WITH-ATTR-NEXT: entry: // SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -556,7 +556,7 @@ void test5(struct anon_struct *p, int index) { // SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = select i1 [[DOTINV]], i64 0, i64 [[TMP1]] // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP2]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test5_bdos( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 16, 1) i64 @test5_bdos( // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // NO-SANITIZE-WITH-ATTR-NEXT: entry: // NO-SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -590,7 +590,7 @@ size_t test5_bdos(struct anon_struct *p) { // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp ugt i64 [[DOT_COUNTED_BY_LOAD]], [[IDXPROM]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB10:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB9:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont3: // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 16 @@ -683,7 +683,7 @@ size_t test6_bdos(struct anon_struct *p) { // SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = icmp ult i64 [[IDXPROM]], [[TMP1]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP2]], label [[CONT7:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB12:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB11:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont7: // SANITIZE-WITH-ATTR-NEXT: [[INTS:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 9 @@ -756,7 +756,7 @@ size_t test7_bdos(struct union_of_fams *p) { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ult i64 [[IDXPROM]], [[TMP0]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT9:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB13:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB12:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont9: // SANITIZE-WITH-ATTR-NEXT: [[INTS:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 9 @@ -797,7 +797,7 @@ void test8(struct union_of_fams *p, int index) { p->ints[index] = __builtin_dynamic_object_size(p->ints, 1); } -// SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test8_bdos( +// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 0, 256) i64 @test8_bdos( // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // SANITIZE-WITH-ATTR-NEXT: entry: // SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -805,7 +805,7 @@ void test8(struct union_of_fams *p, int index) { // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext i8 [[DOT_COUNTED_BY_LOAD]] to i64 // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP0]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test8_bdos( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 0, 256) i64 @test8_bdos( // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // NO-SANITIZE-WITH-ATTR-NEXT: entry: // NO-SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -955,7 +955,7 @@ void test10(struct union_of_fams *p, int index) { p->bytes[index] = (unsigned char)__builtin_dynamic_object_size(p->bytes, 1); } -// SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test10_bdos( +// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -2147483648, 2147483648) i64 @test10_bdos( // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // SANITIZE-WITH-ATTR-NEXT: entry: // SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -964,7 +964,7 @@ void test10(struct union_of_fams *p, int index) { // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext nneg i32 [[NARROW]] to i64 // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP0]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test10_bdos( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -2147483648, 2147483648) i64 @test10_bdos( // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR2]] { // NO-SANITIZE-WITH-ATTR-NEXT: entry: // NO-SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 8 @@ -1095,10 +1095,10 @@ int test12_a, test12_b; // SANITIZE-WITH-ATTR-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[DOTCOUNTED_BY_LOAD]], 0 // SANITIZE-WITH-ATTR-NEXT: br i1 [[DOTNOT]], label [[HANDLER_OUT_OF_BOUNDS4:%.*]], label [[HANDLER_TYPE_MISMATCH6:%.*]], !prof [[PROF10:![0-9]+]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds4: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB19:[0-9]+]], i64 0) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB20:[0-9]+]], i64 0) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.type_mismatch6: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_type_mismatch_v1_abort(ptr nonnull @[[GLOB20:[0-9]+]], i64 ptrtoint (ptr getelementptr inbounds ([[STRUCT_ANON_5:%.*]], ptr @test12_foo, i64 1, i32 0, i32 0, i32 0) to i64)) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_type_mismatch_v1_abort(ptr nonnull @[[GLOB21:[0-9]+]], i64 ptrtoint (ptr getelementptr inbounds ([[STRUCT_ANON_5:%.*]], ptr @test12_foo, i64 1, i32 0, i32 0, i32 0) to i64)) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // // NO-SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i32 @test12( @@ -1188,7 +1188,7 @@ struct test13_bar { // SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = icmp ugt i64 [[TMP1]], [[INDEX]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP2]], label [[CONT5:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB23:[0-9]+]], i64 [[INDEX]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB24:[0-9]+]], i64 [[INDEX]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont5: // SANITIZE-WITH-ATTR-NEXT: [[REVMAP:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 16 @@ -1249,7 +1249,7 @@ struct test14_foo { // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[TRAP:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: // SANITIZE-WITH-ATTR-NEXT: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i64 -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB24:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB25:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: trap: // SANITIZE-WITH-ATTR-NEXT: tail call void @llvm.trap() #[[ATTR10]] @@ -1305,7 +1305,7 @@ int test14(int idx) { // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[TRAP:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: // SANITIZE-WITH-ATTR-NEXT: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i64 -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB25:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB27:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: trap: // SANITIZE-WITH-ATTR-NEXT: tail call void @llvm.trap() #[[ATTR10]] @@ -1326,7 +1326,7 @@ int test14(int idx) { // SANITIZE-WITHOUT-ATTR-NEXT: br i1 [[TMP0]], label [[TRAP:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF8]], !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR: handler.out_of_bounds: // SANITIZE-WITHOUT-ATTR-NEXT: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i64 -// SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB10:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR8]], !nosanitize [[META9]] +// SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB11:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR8]], !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR-NEXT: unreachable, !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR: trap: // SANITIZE-WITHOUT-ATTR-NEXT: tail call void @llvm.trap() #[[ATTR8]] @@ -1487,7 +1487,7 @@ struct tests_foo { // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp ugt i32 [[DOTCOUNTED_BY_LOAD]], 10 // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[CONT4:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB26:[0-9]+]], i64 10) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB28:[0-9]+]], i64 10) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont4: // SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[VAR]], i64 84 @@ -1528,7 +1528,7 @@ int test24(int c, struct tests_foo *var) { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[DOTCOUNTED_BY_LOAD]], 10 // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT5:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB27:[0-9]+]], i64 10) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB29:[0-9]+]], i64 10) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont5: // SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 44 @@ -1580,7 +1580,7 @@ struct test26_foo { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ult i64 [[IDXPROM]], [[TMP0]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT5:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB28:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB30:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont5: // SANITIZE-WITH-ATTR-NEXT: [[ARR:%.*]] = getelementptr inbounds i8, ptr [[FOO]], i64 8 @@ -1651,7 +1651,7 @@ struct test27_foo { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ult i64 [[IDXPROM]], [[TMP0]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB30:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB32:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont3: // SANITIZE-WITH-ATTR-NEXT: [[ENTRIES:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 24 @@ -1717,7 +1717,7 @@ struct test28_foo { // SANITIZE-WITH-ATTR-NEXT: [[TMP4:%.*]] = icmp ult i64 [[IDXPROM]], [[TMP3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP4]], label [[CONT17:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB31:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB34:[0-9]+]], i64 [[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont17: // SANITIZE-WITH-ATTR-NEXT: [[ARR:%.*]] = getelementptr inbounds i8, ptr [[TMP2]], i64 12 @@ -1779,7 +1779,7 @@ struct annotated_struct_array { // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[IDX1]] to i64 // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB33:[0-9]+]], i64 [[TMP1]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB36:[0-9]+]], i64 [[TMP1]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont3: // SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x ptr], ptr [[ANN]], i64 0, i64 [[TMP1]] @@ -1791,7 +1791,7 @@ struct annotated_struct_array { // SANITIZE-WITH-ATTR-NEXT: [[TMP4:%.*]] = icmp ult i64 [[IDXPROM15]], [[TMP3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP4]], label [[CONT20:%.*]], label [[HANDLER_OUT_OF_BOUNDS16:%.*]], !prof [[PROF3]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR: handler.out_of_bounds16: -// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB34:[0-9]+]], i64 [[IDXPROM15]]) #[[ATTR10]], !nosanitize [[META2]] +// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB37:[0-9]+]], i64 [[IDXPROM15]]) #[[ATTR10]], !nosanitize [[META2]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]] // SANITIZE-WITH-ATTR: cont20: // SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds i8, ptr [[TMP2]], i64 12 @@ -1826,7 +1826,7 @@ struct annotated_struct_array { // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[IDX1]] to i64 // SANITIZE-WITHOUT-ATTR-NEXT: br i1 [[TMP0]], label [[CONT21:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF8]], !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR: handler.out_of_bounds: -// SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB12:[0-9]+]], i64 [[TMP1]]) #[[ATTR8]], !nosanitize [[META9]] +// SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB13:[0-9]+]], i64 [[TMP1]]) #[[ATTR8]], !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR-NEXT: unreachable, !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR: cont21: // SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x ptr], ptr [[ANN]], i64 0, i64 [[TMP1]] diff --git a/clang/test/CodeGen/ms-mixed-ptr-sizes.c b/clang/test/CodeGen/ms-mixed-ptr-sizes.c index 89d05fd30b72c2..51bea60eb39dce 100644 --- a/clang/test/CodeGen/ms-mixed-ptr-sizes.c +++ b/clang/test/CodeGen/ms-mixed-ptr-sizes.c @@ -49,7 +49,7 @@ void test_other(struct Foo *f, __attribute__((address_space(10))) int *i) { } int test_compare1(int *__ptr32 __uptr i, int *__ptr64 j) { - // ALL-LABEL: define dso_local noundef i32 @test_compare1 + // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare1 // X64: %{{.+}} = addrspacecast ptr %j to ptr addrspace(271) // X64: %cmp = icmp eq ptr addrspace(271) %{{.+}}, %i // X86: %{{.+}} = addrspacecast ptr addrspace(272) %j to ptr addrspace(271) @@ -58,7 +58,7 @@ int test_compare1(int *__ptr32 __uptr i, int *__ptr64 j) { } int test_compare2(int *__ptr32 __sptr i, int *__ptr64 j) { - // ALL-LABEL: define dso_local noundef i32 @test_compare2 + // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare2 // X64: %{{.+}} = addrspacecast ptr %j to ptr addrspace(270) // X64: %cmp = icmp eq ptr addrspace(270) %{{.+}}, %i // X86: %{{.+}} = addrspacecast ptr addrspace(272) %j to ptr @@ -67,7 +67,7 @@ int test_compare2(int *__ptr32 __sptr i, int *__ptr64 j) { } int test_compare3(int *__ptr32 __uptr i, int *__ptr64 j) { - // ALL-LABEL: define dso_local noundef i32 @test_compare3 + // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare3 // X64: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr // X64: %cmp = icmp eq ptr %{{.+}}, %j // X86: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr addrspace(272) @@ -76,7 +76,7 @@ int test_compare3(int *__ptr32 __uptr i, int *__ptr64 j) { } int test_compare4(int *__ptr32 __sptr i, int *__ptr64 j) { - // ALL-LABEL: define dso_local noundef i32 @test_compare4 + // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare4 // X64: %{{.+}} = addrspacecast ptr addrspace(270) %i to ptr // X64: %cmp = icmp eq ptr %{{.+}}, %j // X86: %{{.+}} = addrspacecast ptr %i to ptr addrspace(272) diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h index 60f41b30e91c24..cb514cde95b51a 100644 --- a/llvm/include/llvm/IR/Function.h +++ b/llvm/include/llvm/IR/Function.h @@ -46,6 +46,7 @@ typedef unsigned ID; class AssemblyAnnotationWriter; class Constant; +class ConstantRange; struct DenormalMode; class DISubprogram; enum LibFunc : unsigned; @@ -462,6 +463,9 @@ class LLVM_EXTERNAL_VISIBILITY Function : public GlobalObject, /// attributes for the given arg. void addDereferenceableOrNullParamAttr(unsigned ArgNo, uint64_t Bytes); + /// adds the range attribute to the list of attributes for the return value. + void addRangeRetAttr(const ConstantRange &CR); + MaybeAlign getParamAlign(unsigned ArgNo) const { return AttributeSets.getParamAlignment(ArgNo); } diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index e66fe73425e863..545940dd86f90f 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -735,6 +735,10 @@ void Function::addDereferenceableOrNullParamAttr(unsigned ArgNo, ArgNo, Bytes); } +void Function::addRangeRetAttr(const ConstantRange &CR) { + AttributeSets = AttributeSets.addRangeRetAttr(getContext(), CR); +} + DenormalMode Function::getDenormalMode(const fltSemantics &FPType) const { if (&FPType == &APFloat::IEEEsingle()) { DenormalMode Mode = getDenormalModeF32Raw(); diff --git a/llvm/lib/Transforms/IPO/SCCP.cpp b/llvm/lib/Transforms/IPO/SCCP.cpp index f8920541e6fd64..e591a8e73b1c6f 100644 --- a/llvm/lib/Transforms/IPO/SCCP.cpp +++ b/llvm/lib/Transforms/IPO/SCCP.cpp @@ -281,32 +281,21 @@ static bool runIPSCCP( Function *F = I.first; const ValueLatticeElement &ReturnValue = I.second; - // If there is a known constant range for the return value, add !range - // metadata to the function's call sites. + // If there is a known constant range for the return value, add range + // attribute to the return value. if (ReturnValue.isConstantRange() && !ReturnValue.getConstantRange().isSingleElement()) { // Do not add range metadata if the return value may include undef. if (ReturnValue.isConstantRangeIncludingUndef()) continue; + // Do not touch existing attribute for now. + // TODO: We should be able to take the intersection of the existing + // attribute and the inferred range. + if (F->hasRetAttribute(Attribute::Range)) + continue; auto &CR = ReturnValue.getConstantRange(); - for (User *User : F->users()) { - auto *CB = dyn_cast<CallBase>(User); - if (!CB || CB->getCalledFunction() != F) - continue; - - // Do not touch existing metadata for now. - // TODO: We should be able to take the intersection of the existing - // metadata and the inferred range. - if (CB->getMetadata(LLVMContext::MD_range)) - continue; - - LLVMContext &Context = CB->getParent()->getContext(); - Metadata *RangeMD[] = { - ConstantAsMetadata::get(ConstantInt::get(Context, CR.getLower())), - ConstantAsMetadata::get(ConstantInt::get(Context, CR.getUpper()))}; - CB->setMetadata(LLVMContext::MD_range, MDNode::get(Context, RangeMD)); - } + F->addRangeRetAttr(CR); continue; } if (F->getReturnType()->isVoidTy()) diff --git a/llvm/test/Transforms/FunctionSpecialization/discover-transitive-phis.ll b/llvm/test/Transforms/FunctionSpecialization/discover-transitive-phis.ll index b4c24715037bca..d0095231a30f93 100644 --- a/llvm/test/Transforms/FunctionSpecialization/discover-transitive-phis.ll +++ b/llvm/test/Transforms/FunctionSpecialization/discover-transitive-phis.ll @@ -1,22 +1,22 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; ; RUN: opt -passes="ipsccp<func-spec>" -funcspec-min-function-size=20 -funcspec-for-literal-constant -S < %s | FileCheck %s --check-prefix=FUNCSPEC ; RUN: opt -passes="ipsccp<func-spec>" -funcspec-min-function-size=20 -funcspec-for-literal-constant -funcspec-max-discovery-iterations=16 -S < %s | FileCheck %s --check-prefix=NOFUNCSPEC define i64 @bar(i1 %c1, i1 %c2, i1 %c3, i1 %c4, i1 %c5, i1 %c6, i1 %c7, i1 %c8, i1 %c9, i1 %c10) { -; FUNCSPEC-LABEL: define i64 @bar( +; FUNCSPEC-LABEL: define range(i64 4, 13) i64 @bar( ; FUNCSPEC-SAME: i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]], i1 [[C4:%.*]], i1 [[C5:%.*]], i1 [[C6:%.*]], i1 [[C7:%.*]], i1 [[C8:%.*]], i1 [[C9:%.*]], i1 [[C10:%.*]]) { ; FUNCSPEC-NEXT: entry: -; FUNCSPEC-NEXT: [[F1:%.*]] = call i64 @foo.specialized.1(i64 3, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]), !range [[RNG0:![0-9]+]] -; FUNCSPEC-NEXT: [[F2:%.*]] = call i64 @foo.specialized.2(i64 4, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]), !range [[RNG1:![0-9]+]] +; FUNCSPEC-NEXT: [[F1:%.*]] = call i64 @foo.specialized.1(i64 3, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]) +; FUNCSPEC-NEXT: [[F2:%.*]] = call i64 @foo.specialized.2(i64 4, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]) ; FUNCSPEC-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[F1]], [[F2]] ; FUNCSPEC-NEXT: ret i64 [[ADD]] ; -; NOFUNCSPEC-LABEL: define i64 @bar( +; NOFUNCSPEC-LABEL: define range(i64 4, 13) i64 @bar( ; NOFUNCSPEC-SAME: i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]], i1 [[C4:%.*]], i1 [[C5:%.*]], i1 [[C6:%.*]], i1 [[C7:%.*]], i1 [[C8:%.*]], i1 [[C9:%.*]], i1 [[C10:%.*]]) { ; NOFUNCSPEC-NEXT: entry: -; NOFUNCSPEC-NEXT: [[F1:%.*]] = call i64 @foo(i64 3, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]), !range [[RNG0:![0-9]+]] -; NOFUNCSPEC-NEXT: [[F2:%.*]] = call i64 @foo(i64 4, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]), !range [[RNG0]] +; NOFUNCSPEC-NEXT: [[F1:%.*]] = call i64 @foo(i64 3, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]) +; NOFUNCSPEC-NEXT: [[F2:%.*]] = call i64 @foo(i64 4, i1 [[C1]], i1 [[C2]], i1 [[C3]], i1 [[C4]], i1 [[C5]], i1 [[C6]], i1 [[C7]], i1 [[C8]], i1 [[C9]], i1 [[C10]]) ; NOFUNCSPEC-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[F1]], [[F2]] ; NOFUNCSPEC-NEXT: ret i64 [[ADD]] ; @@ -28,6 +28,50 @@ entry: } define internal i64 @foo(i64 %n, i1 %c1, i1 %c2, i1 %c3, i1 %c4, i1 %c5, i1 %c6, i1 %c7, i1 %c8, i1 %c9, i1 %c10) { +; NOFUNCSPEC-LABEL: define internal range(i64 2, 7) i64 @foo( +; NOFUNCSPEC-SAME: i64 [[N:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]], i1 [[C4:%.*]], i1 [[C5:%.*]], i1 [[C6:%.*]], i1 [[C7:%.*]], i1 [[C8:%.*]], i1 [[C9:%.*]], i1 [[C10:%.*]]) { +; NOFUNCSPEC-NEXT: entry: +; NOFUNCSPEC-NEXT: br i1 [[C1]], label [[L1:%.*]], label [[L9:%.*]] +; NOFUNCSPEC: l1: +; NOFUNCSPEC-NEXT: [[PHI1:%.*]] = phi i64 [ [[N]], [[ENTRY:%.*]] ], [ [[PHI2:%.*]], [[L2:%.*]] ] +; NOFUNCSPEC-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[PHI1]], 1 +; NOFUNCSPEC-NEXT: br i1 [[C2]], label [[L1_5:%.*]], label [[EXIT:%.*]] +; NOFUNCSPEC: l1_5: +; NOFUNCSPEC-NEXT: br i1 [[C3]], label [[L1_75:%.*]], label [[L6:%.*]] +; NOFUNCSPEC: l1_75: +; NOFUNCSPEC-NEXT: br i1 [[C4]], label [[L2]], label [[L3:%.*]] +; NOFUNCSPEC: l2: +; NOFUNCSPEC-NEXT: [[PHI2]] = phi i64 [ [[PHI1]], [[L1_75]] ], [ [[PHI3:%.*]], [[L3]] ] +; NOFUNCSPEC-NEXT: br label [[L1]] +; NOFUNCSPEC: l3: +; NOFUNCSPEC-NEXT: [[PHI3]] = phi i64 [ [[PHI1]], [[L1_75]] ], [ [[PHI4:%.*]], [[L4:%.*]] ] +; NOFUNCSPEC-NEXT: br label [[L2]] +; NOFUNCSPEC: l4: +; NOFUNCSPEC-NEXT: [[PHI4]] = phi i64 [ [[PHI5:%.*]], [[L5:%.*]] ], [ [[PHI6:%.*]], [[L6]] ] +; NOFUNCSPEC-NEXT: br i1 [[C5]], label [[L3]], label [[L6]] +; NOFUNCSPEC: l5: +; NOFUNCSPEC-NEXT: [[PHI5]] = phi i64 [ [[PHI6]], [[L6_5:%.*]] ], [ [[PHI7:%.*]], [[L7:%.*]] ] +; NOFUNCSPEC-NEXT: br label [[L4]] +; NOFUNCSPEC: l6: +; NOFUNCSPEC-NEXT: [[PHI6]] = phi i64 [ [[PHI4]], [[L4]] ], [ [[PHI1]], [[L1_5]] ] +; NOFUNCSPEC-NEXT: br i1 [[C6]], label [[L4]], label [[L6_5]] +; NOFUNCSPEC: l6_5: +; NOFUNCSPEC-NEXT: br i1 [[C7]], label [[L5]], label [[L8:%.*]] +; NOFUNCSPEC: l7: +; NOFUNCSPEC-NEXT: [[PHI7]] = phi i64 [ [[PHI9:%.*]], [[L9]] ], [ [[PHI8:%.*]], [[L8]] ] +; NOFUNCSPEC-NEXT: br i1 [[C8]], label [[L5]], label [[L8]] +; NOFUNCSPEC: l8: +; NOFUNCSPEC-NEXT: [[PHI8]] = phi i64 [ [[PHI6]], [[L6_5]] ], [ [[PHI7]], [[L7]] ] +; NOFUNCSPEC-NEXT: br i1 [[C9]], label [[L7]], label [[L9]] +; NOFUNCSPEC: l9: +; NOFUNCSPEC-NEXT: [[PHI9]] = phi i64 [ [[N]], [[ENTRY]] ], [ [[PHI8]], [[L8]] ] +; NOFUNCSPEC-NEXT: [[SUB:%.*]] = sub nuw nsw i64 [[PHI9]], 1 +; NOFUNCSPEC-NEXT: [[MUL:%.*]] = mul nuw nsw i64 [[SUB]], 2 +; NOFUNCSPEC-NEXT: br i1 [[C10]], label [[L7]], label [[EXIT]] +; NOFUNCSPEC: exit: +; NOFUNCSPEC-NEXT: [[RES:%.*]] = phi i64 [ 2, [[L1]] ], [ [[MUL]], [[L9]] ] +; NOFUNCSPEC-NEXT: ret i64 [[RES]] +; entry: br i1 %c1, label %l1, label %l9 diff --git a/llvm/test/Transforms/FunctionSpecialization/global-var-constants.ll b/llvm/test/Transforms/FunctionSpecialization/global-var-constants.ll index b9481baae60b9e..a576d9aa32e140 100644 --- a/llvm/test/Transforms/FunctionSpecialization/global-var-constants.ll +++ b/llvm/test/Transforms/FunctionSpecialization/global-var-constants.ll @@ -49,10 +49,10 @@ entry: ; Check if specialisation on the address of a non-const global variable ; is not allowed, then it is not performed. -; NO-GLOBALS-LABEL: define internal i32 @g() +; NO-GLOBALS-LABEL: define internal range(i32 -2147483646, -2147483648) i32 @g() ; NO-GLOBALS: call i32 @f(ptr @G) -; NO-GLOBALS-LABEL: define i32 @h0(ptr %p) +; NO-GLOBALS-LABEL: define range(i32 -2147483646, -2147483648) i32 @h0(ptr %p) ; NO-GLOBALS:call i32 @g() ; NO-GLOBALS-LABEL: define i32 @h1() @@ -64,10 +64,10 @@ entry: ; Check if specialisation on the address of a non-const global variable ; is allowed, then it is performed where possible. -; GLOBALS-LABEL: define internal i32 @g() +; GLOBALS-LABEL: define internal range(i32 -2147483646, -2147483648) i32 @g() ; GLOBALS: call i32 @f.specialized.2() -; GLOBALS-LABEL: define i32 @h0(ptr %p) +; GLOBALS-LABEL: define range(i32 -2147483646, -2147483648) i32 @h0(ptr %p) ; GLOBALS: call i32 @g() ; GLOBALS-LABEL: define i32 @h1() diff --git a/llvm/test/Transforms/FunctionSpecialization/literal-const.ll b/llvm/test/Transforms/FunctionSpecialization/literal-const.ll index f107ffe0ec7ebf..3eae3dc261fb2a 100644 --- a/llvm/test/Transforms/FunctionSpecialization/literal-const.ll +++ b/llvm/test/Transforms/FunctionSpecialization/literal-const.ll @@ -71,10 +71,10 @@ entry: ; CHECK-LIT-LABEL: define i32 @f1 ; CHECK-LIT: call i32 @neg.specialized.[[#B:]] -; CHECK-LIT-LABEL: define i32 @g0 +; CHECK-LIT-LABEL: define range(i32 -2147483647, -2147483648) i32 @g0 ; CHECK-LIT: call i32 @add.specialized.[[#C:]] -; CHECK-LIT-LABEL: define i32 @g1 +; CHECK-LIT-LABEL: define range(i32 -2147483647, -2147483648) i32 @g1 ; CHECK-LIT: call i32 @add.specialized.[[#D:]] ; CHECK-LIT-LABEL: define float @h0 diff --git a/llvm/test/Transforms/LowerTypeTests/cfi-nounwind-direct-call.ll b/llvm/test/Transforms/LowerTypeTests/cfi-nounwind-direct-call.ll index 4c88f4acc12f16..2795333effd76b 100644 --- a/llvm/test/Transforms/LowerTypeTests/cfi-nounwind-direct-call.ll +++ b/llvm/test/Transforms/LowerTypeTests/cfi-nounwind-direct-call.ll @@ -109,8 +109,8 @@ attributes #6 = { noreturn nounwind } !11 = !{} !12 = !{!"branch_weights", i32 1048575, i32 1} ; CHECK: Function Attrs: minsize mustprogress nofree norecurse nosync nounwind optsize willreturn memory(none) -; CHECK-LABEL: define dso_local noundef i32 @_Z9nothrow_ei -; CHECK-SAME: (i32 noundef [[NUM:%.*]]) #[[ATTR0:[0-9]+]] !type !4 !type !5 !type !6 { +; CHECK-LABEL: define dso_local noundef range(i32 0, 2) i32 @_Z9nothrow_ei +; CHECK-SAME: (i32 noundef [[NUM:%.*]]) #[[ATTR0:[0-9]+]] !type [[META4:![0-9]+]] !type [[META5:![0-9]+]] !type [[META6:![0-9]+]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp ne i32 [[NUM]], 0 ; CHECK-NEXT: [[DOT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32 @@ -118,8 +118,8 @@ attributes #6 = { noreturn nounwind } ; ; ; CHECK: Function Attrs: minsize mustprogress nofree norecurse nosync nounwind optsize willreturn memory(write, argmem: none, inaccessiblemem: none) -; CHECK-LABEL: define dso_local noundef i32 @_Z10call_catchi -; CHECK-SAME: (i32 noundef [[NUM:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] !type !4 !type !5 !type !6 { +; CHECK-LABEL: define dso_local noundef range(i32 0, 2) i32 @_Z10call_catchi +; CHECK-SAME: (i32 noundef [[NUM:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] !type [[META4]] !type [[META5]] !type [[META6]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: store ptr @_Z9nothrow_ei.cfi_jt, ptr @catch_ptr, align 8, !tbaa [[TBAA7:![0-9]+]] ; CHECK-NEXT: [[TOBOOL_NOT_I:%.*]] = icmp ne i32 [[NUM]], 0 @@ -131,17 +131,17 @@ attributes #6 = { noreturn nounwind } ; CHECK-LABEL: define weak_odr hidden void @__cfi_check_fail ; CHECK-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize !11 -; CHECK-NEXT: br i1 [[DOTNOT]], label [[TRAP:%.*]], label [[CONT:%.*]], !nosanitize !11 +; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize [[META11:![0-9]+]] +; CHECK-NEXT: br i1 [[DOTNOT]], label [[TRAP:%.*]], label [[CONT:%.*]], !nosanitize [[META11]] ; CHECK: trap: -; CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR5:[0-9]+]], !nosanitize !11 -; CHECK-NEXT: unreachable, !nosanitize !11 +; CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6:[0-9]+]], !nosanitize [[META11]] +; CHECK-NEXT: unreachable, !nosanitize [[META11]] ; CHECK: cont: -; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize !11 +; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize [[META11]] ; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i8 [[TMP2]], 5 ; CHECK-NEXT: br i1 [[SWITCH]], label [[TRAP]], label [[CONT6:%.*]] ; CHECK: cont6: -; CHECK-NEXT: ret void, !nosanitize !11 +; CHECK-NEXT: ret void, !nosanitize [[META11]] ; ; ; CHECK-LABEL: define weak void @__cfi_check @@ -153,8 +153,8 @@ attributes #6 = { noreturn nounwind } ; ; CHECK: Function Attrs: naked nocf_check noinline nounwind ; CHECK-LABEL: define internal void @_Z9nothrow_ei.cfi_jt -; CHECK-SAME: () #[[ATTR4:[0-9]+]] align 8 { +; CHECK-SAME: () #[[ATTR5:[0-9]+]] align 8 { ; CHECK-NEXT: entry: -; CHECK-NEXT: tail call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(ptr nonnull @_Z9nothrow_ei) #[[ATTR6:[0-9]+]] +; CHECK-NEXT: tail call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(ptr nonnull @_Z9nothrow_ei) #[[ATTR7:[0-9]+]] ; CHECK-NEXT: unreachable ; diff --git a/llvm/test/Transforms/PhaseOrdering/AArch64/quant_4x4.ll b/llvm/test/Transforms/PhaseOrdering/AArch64/quant_4x4.ll index 9206893cb2341e..c133852f66937d 100644 --- a/llvm/test/Transforms/PhaseOrdering/AArch64/quant_4x4.ll +++ b/llvm/test/Transforms/PhaseOrdering/AArch64/quant_4x4.ll @@ -7,7 +7,7 @@ target triple = "aarch64" ; Check that the function gets vectorized. define i32 @quant_4x4(ptr noundef %dct, ptr noundef %mf, ptr noundef %bias) { -; CHECK-LABEL: define i32 @quant_4x4 +; CHECK-LABEL: define range(i32 0, 2) i32 @quant_4x4 ; CHECK-SAME: (ptr nocapture noundef [[DCT:%.*]], ptr nocapture noundef readonly [[MF:%.*]], ptr nocapture noundef readonly [[BIAS:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DCT]], i64 32 diff --git a/llvm/test/Transforms/PhaseOrdering/icmp-ashr-breaking-select-idiom.ll b/llvm/test/Transforms/PhaseOrdering/icmp-ashr-breaking-select-idiom.ll index 67d721b23d6f00..35d5ceeb91950f 100644 --- a/llvm/test/Transforms/PhaseOrdering/icmp-ashr-breaking-select-idiom.ll +++ b/llvm/test/Transforms/PhaseOrdering/icmp-ashr-breaking-select-idiom.ll @@ -2,7 +2,7 @@ ; RUN: opt -O1 -S < %s | FileCheck %s define i32 @testa(i32 %mul) { -; CHECK-LABEL: define i32 @testa( +; CHECK-LABEL: define range(i32 -65536, 65536) i32 @testa( ; CHECK-SAME: i32 [[MUL:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[SHR:%.*]] = ashr i32 [[MUL]], 15 ; CHECK-NEXT: [[SPEC_SELECT_I:%.*]] = tail call i32 @llvm.smin.i32(i32 [[SHR]], i32 32767) @@ -16,7 +16,7 @@ define i32 @testa(i32 %mul) { } define i32 @testb(i32 %mul) { -; CHECK-LABEL: define i32 @testb( +; CHECK-LABEL: define range(i32 -16777216, 16777216) i32 @testb( ; CHECK-SAME: i32 [[MUL:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[SHR102:%.*]] = ashr i32 [[MUL]], 7 ; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.smax.i32(i32 [[SHR102]], i32 -128) diff --git a/llvm/test/Transforms/PhaseOrdering/min_max_loop.ll b/llvm/test/Transforms/PhaseOrdering/min_max_loop.ll index fb338a6507eba8..63cfef6f3d09ae 100644 --- a/llvm/test/Transforms/PhaseOrdering/min_max_loop.ll +++ b/llvm/test/Transforms/PhaseOrdering/min_max_loop.ll @@ -19,7 +19,7 @@ ;; } define i16 @vecreduce_smin_v2i16(i32 %n, ptr %v) { -; CHECK-LABEL: define i16 @vecreduce_smin_v2i16( +; CHECK-LABEL: define range(i16 -32768, 1) i16 @vecreduce_smin_v2i16( ; CHECK: @llvm.smin.v2i16 entry: @@ -65,7 +65,7 @@ for.end: ; preds = %for.cond } define i16 @vecreduce_smax_v2i16(i32 %n, ptr %v) { -; CHECK-LABEL: define i16 @vecreduce_smax_v2i16( +; CHECK-LABEL: define range(i16 0, -32768) i16 @vecreduce_smax_v2i16( ; CHECK: @llvm.smax.v2i16 entry: diff --git a/llvm/test/Transforms/SCCP/and-add-shl.ll b/llvm/test/Transforms/SCCP/and-add-shl.ll index 7c037ffa6bf640..7af563f13a18ab 100644 --- a/llvm/test/Transforms/SCCP/and-add-shl.ll +++ b/llvm/test/Transforms/SCCP/and-add-shl.ll @@ -59,7 +59,7 @@ define i8 @and_not_shl_1(i8 %x) { ; Negative test: https://alive2.llvm.org/ce/z/Zv4Pyu define i8 @and_add_shl_overlap(i8 %x) { -; CHECK-LABEL: define i8 @and_add_shl_overlap +; CHECK-LABEL: define range(i8 0, 33) i8 @and_add_shl_overlap ; CHECK-SAME: (i8 [[X:%.*]]) { ; CHECK-NEXT: [[OP1_P2:%.*]] = icmp ule i8 [[X]], 6 ; CHECK-NEXT: call void @llvm.assume(i1 [[OP1_P2]]) @@ -77,7 +77,7 @@ define i8 @and_add_shl_overlap(i8 %x) { } define i8 @and_not_shl_overlap(i8 %x) { -; CHECK-LABEL: define i8 @and_not_shl_overlap +; CHECK-LABEL: define range(i8 0, 5) i8 @and_not_shl_overlap ; CHECK-SAME: (i8 [[X:%.*]]) { ; CHECK-NEXT: [[OP1_P2:%.*]] = icmp ule i8 [[X]], 3 ; CHECK-NEXT: call void @llvm.assume(i1 [[OP1_P2]]) diff --git a/llvm/test/Transforms/SCCP/ip-add-range-to-call.ll b/llvm/test/Transforms/SCCP/ip-add-range-to-call.ll index 64c1b9020a054f..c24c554102ddf8 100644 --- a/llvm/test/Transforms/SCCP/ip-add-range-to-call.ll +++ b/llvm/test/Transforms/SCCP/ip-add-range-to-call.ll @@ -1,20 +1,21 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; RUN: opt -passes=ipsccp -S %s | FileCheck %s ; Test 1. ; Both arguments and return value of @callee can be tracked. The inferred range ; can be added to call sites. define internal i32 @callee(i32 %x) { -; CHECK-LABEL: @callee( -; CHECK-NEXT: ret i32 [[X:%.*]] +; CHECK-LABEL: define internal range(i32 0, 21) i32 @callee( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: ret i32 [[X]] ; ret i32 %x } define i32 @caller1() { -; CHECK-LABEL: @caller1( -; CHECK-NEXT: [[C1:%.*]] = call i32 @callee(i32 10), !range [[RNG0:![0-9]+]] -; CHECK-NEXT: [[C2:%.*]] = call i32 @callee(i32 20), !range [[RNG0]] +; CHECK-LABEL: define range(i32 0, 41) i32 @caller1() { +; CHECK-NEXT: [[C1:%.*]] = call i32 @callee(i32 10) +; CHECK-NEXT: [[C2:%.*]] = call i32 @callee(i32 20) ; CHECK-NEXT: [[A:%.*]] = add nuw nsw i32 [[C1]], [[C2]] ; CHECK-NEXT: ret i32 [[A]] ; @@ -25,9 +26,10 @@ define i32 @caller1() { } define i32 @caller2(i32 %x) { -; CHECK-LABEL: @caller2( -; CHECK-NEXT: [[X_15:%.*]] = and i32 [[X:%.*]], 15 -; CHECK-NEXT: [[C:%.*]] = call i32 @callee(i32 [[X_15]]), !range [[RNG0]] +; CHECK-LABEL: define range(i32 0, 21) i32 @caller2( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[X_15:%.*]] = and i32 [[X]], 15 +; CHECK-NEXT: [[C:%.*]] = call i32 @callee(i32 [[X_15]]) ; CHECK-NEXT: ret i32 [[C]] ; %x.15 = and i32 %x, 15 @@ -43,14 +45,15 @@ define i32 @caller2(i32 %x) { declare void @use_cb1(ptr) define internal i32 @callee2(i32 %x) { -; CHECK-LABEL: @callee2( -; CHECK-NEXT: ret i32 [[X:%.*]] +; CHECK-LABEL: define internal i32 @callee2( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: ret i32 [[X]] ; ret i32 %x } define void @caller_cb1() { -; CHECK-LABEL: @caller_cb1( +; CHECK-LABEL: define void @caller_cb1() { ; CHECK-NEXT: [[C1:%.*]] = call i32 @callee2(i32 9) ; CHECK-NEXT: [[C2:%.*]] = call i32 @callee2(i32 10) ; CHECK-NEXT: call void @use_cb1(ptr @callee2) @@ -70,8 +73,9 @@ define void @caller_cb1() { declare void @use_cb2(ptr) define internal i32 @callee3(i32 %x) { -; CHECK-LABEL: @callee3( -; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 10 +; CHECK-LABEL: define internal range(i32 500, 601) i32 @callee3( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X]], 10 ; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 500, i32 600 ; CHECK-NEXT: ret i32 [[S]] ; @@ -81,9 +85,9 @@ define internal i32 @callee3(i32 %x) { } define void @caller_cb2() { -; CHECK-LABEL: @caller_cb2( -; CHECK-NEXT: [[C1:%.*]] = call i32 @callee3(i32 9), !range [[RNG1:![0-9]+]] -; CHECK-NEXT: [[C2:%.*]] = call i32 @callee3(i32 10), !range [[RNG1]] +; CHECK-LABEL: define void @caller_cb2() { +; CHECK-NEXT: [[C1:%.*]] = call i32 @callee3(i32 9) +; CHECK-NEXT: [[C2:%.*]] = call i32 @callee3(i32 10) ; CHECK-NEXT: call void @use_cb2(ptr @callee3) ; CHECK-NEXT: ret void ; @@ -100,9 +104,10 @@ define void @caller_cb2() { declare void @use_cb3(ptr) define internal i32 @callee4(i32 %x, i32 %y) { -; CHECK-LABEL: @callee4( -; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 10 -; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 500, i32 [[Y:%.*]] +; CHECK-LABEL: define internal i32 @callee4( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X]], 10 +; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 500, i32 [[Y]] ; CHECK-NEXT: ret i32 [[S]] ; %c = icmp eq i32 %x, 10 @@ -111,11 +116,9 @@ define internal i32 @callee4(i32 %x, i32 %y) { } define void @caller_cb3() { -; CHECK-LABEL: @caller_cb3( +; CHECK-LABEL: define void @caller_cb3() { ; CHECK-NEXT: [[C1:%.*]] = call i32 @callee4(i32 11, i32 30) -; CHECK-NOT: !range ; CHECK-NEXT: [[C2:%.*]] = call i32 @callee4(i32 12, i32 40) -; CHECK-NOT: !range ; CHECK-NEXT: call void @use_cb3(ptr @callee4) ; CHECK-NEXT: ret void ; @@ -129,15 +132,16 @@ define void @caller_cb3() { ; Range for the return value of callee5 includes undef. No range metadata ; should be added at call sites. define internal i32 @callee5(i32 %x, i32 %y) { -; CHECK-LABEL: @callee5( -; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X:%.*]], 15 +; CHECK-LABEL: define internal i32 @callee5( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X]], 15 ; CHECK-NEXT: br i1 [[C]], label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: br label [[EXIT:%.*]] ; CHECK: bb2: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: -; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[Y:%.*]], [[BB1]] ], [ undef, [[BB2]] ] +; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[Y]], [[BB1]] ], [ undef, [[BB2]] ] ; CHECK-NEXT: ret i32 [[RES]] ; %c = icmp slt i32 %x, 15 @@ -155,11 +159,9 @@ exit: } define i32 @caller5() { -; CHECK-LABEL: @caller5( +; CHECK-LABEL: define range(i32 200, 401) i32 @caller5() { ; CHECK-NEXT: [[C1:%.*]] = call i32 @callee5(i32 10, i32 100) -; CHECK-NOT: !range ; CHECK-NEXT: [[C2:%.*]] = call i32 @callee5(i32 20, i32 200) -; CHECK-NOT: !range ; CHECK-NEXT: [[A:%.*]] = add i32 [[C1]], [[C2]] ; CHECK-NEXT: ret i32 [[A]] ; @@ -170,8 +172,9 @@ define i32 @caller5() { } define internal <2 x i64> @ctlz(<2 x i64> %arg) { -; CHECK-LABEL: @ctlz( -; CHECK-NEXT: [[RES:%.*]] = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> [[ARG:%.*]], i1 false) +; CHECK-LABEL: define internal range(i64 0, 65) <2 x i64> @ctlz( +; CHECK-SAME: <2 x i64> [[ARG:%.*]]) { +; CHECK-NEXT: [[RES:%.*]] = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> [[ARG]], i1 false) ; CHECK-NEXT: ret <2 x i64> [[RES]] ; %res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %arg, i1 false) @@ -179,8 +182,9 @@ define internal <2 x i64> @ctlz(<2 x i64> %arg) { } define <2 x i64> @ctlz_caller(<2 x i64> %arg) { -; CHECK-LABEL: @ctlz_caller( -; CHECK-NEXT: [[RES:%.*]] = call <2 x i64> @ctlz(<2 x i64> [[ARG:%.*]]), !range [[RNG2:![0-9]+]] +; CHECK-LABEL: define range(i64 0, 65) <2 x i64> @ctlz_caller( +; CHECK-SAME: <2 x i64> [[ARG:%.*]]) { +; CHECK-NEXT: [[RES:%.*]] = call <2 x i64> @ctlz(<2 x i64> [[ARG]]) ; CHECK-NEXT: ret <2 x i64> [[RES]] ; %res = call <2 x i64> @ctlz(<2 x i64> %arg) @@ -189,6 +193,3 @@ define <2 x i64> @ctlz_caller(<2 x i64> %arg) { declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) -; CHECK: [[RNG0]] = !{i32 0, i32 21} -; CHECK: [[RNG1]] = !{i32 500, i32 601} -; CHECK: [[RNG2]] = !{i64 0, i64 65} diff --git a/llvm/test/Transforms/SCCP/ip-ranges-casts.ll b/llvm/test/Transforms/SCCP/ip-ranges-casts.ll index 80d90922c2fbdb..05fa04a9fbe06f 100644 --- a/llvm/test/Transforms/SCCP/ip-ranges-casts.ll +++ b/llvm/test/Transforms/SCCP/ip-ranges-casts.ll @@ -1,10 +1,11 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; RUN: opt < %s -passes=ipsccp -S | FileCheck %s ; x = [100, 301) define internal i1 @f.trunc(i32 %x) { -; CHECK-LABEL: @f.trunc( -; CHECK-NEXT: [[T_1:%.*]] = trunc nuw nsw i32 [[X:%.*]] to i16 +; CHECK-LABEL: define internal i1 @f.trunc( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[T_1:%.*]] = trunc nuw nsw i32 [[X]] to i16 ; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i16 [[T_1]], 299 ; CHECK-NEXT: [[C_4:%.*]] = icmp slt i16 [[T_1]], 101 ; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]] @@ -43,7 +44,7 @@ define internal i1 @f.trunc(i32 %x) { } define i1 @caller1() { -; CHECK-LABEL: @caller1( +; CHECK-LABEL: define i1 @caller1() { ; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.trunc(i32 100) ; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.trunc(i32 300) ; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] @@ -58,14 +59,15 @@ define i1 @caller1() { ; x = [100, 301) define internal i1 @f.zext(i32 %x, i32 %y) { -; CHECK-LABEL: @f.zext( -; CHECK-NEXT: [[T_1:%.*]] = zext nneg i32 [[X:%.*]] to i64 +; CHECK-LABEL: define internal i1 @f.zext( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[T_1:%.*]] = zext nneg i32 [[X]] to i64 ; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i64 [[T_1]], 299 ; CHECK-NEXT: [[C_4:%.*]] = icmp slt i64 [[T_1]], 101 ; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]] ; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false ; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]] -; CHECK-NEXT: [[T_2:%.*]] = zext i32 [[Y:%.*]] to i64 +; CHECK-NEXT: [[T_2:%.*]] = zext i32 [[Y]] to i64 ; CHECK-NEXT: [[C_5:%.*]] = icmp sgt i64 [[T_2]], 300 ; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i64 [[T_2]], 299 ; CHECK-NEXT: [[C_8:%.*]] = icmp slt i64 [[T_2]], 1 @@ -97,7 +99,7 @@ define internal i1 @f.zext(i32 %x, i32 %y) { } define i1 @caller.zext() { -; CHECK-LABEL: @caller.zext( +; CHECK-LABEL: define i1 @caller.zext() { ; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.zext(i32 100, i32 -120) ; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.zext(i32 300, i32 900) ; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] @@ -111,14 +113,15 @@ define i1 @caller.zext() { ; x = [100, 301) define internal i1 @f.sext(i32 %x, i32 %y) { -; CHECK-LABEL: @f.sext( -; CHECK-NEXT: [[T_1:%.*]] = zext nneg i32 [[X:%.*]] to i64 +; CHECK-LABEL: define internal i1 @f.sext( +; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { +; CHECK-NEXT: [[T_1:%.*]] = zext nneg i32 [[X]] to i64 ; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i64 [[T_1]], 299 ; CHECK-NEXT: [[C_4:%.*]] = icmp slt i64 [[T_1]], 101 ; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]] ; CHECK-NEXT: [[RES_2:%.*]] = add nuw nsw i1 [[RES_1]], false ; CHECK-NEXT: [[RES_3:%.*]] = add i1 [[RES_2]], [[C_4]] -; CHECK-NEXT: [[T_2:%.*]] = sext i32 [[Y:%.*]] to i64 +; CHECK-NEXT: [[T_2:%.*]] = sext i32 [[Y]] to i64 ; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i64 [[T_2]], 899 ; CHECK-NEXT: [[C_8:%.*]] = icmp slt i64 [[T_2]], -119 ; CHECK-NEXT: [[RES_4:%.*]] = add nuw nsw i1 [[RES_3]], false @@ -148,7 +151,7 @@ define internal i1 @f.sext(i32 %x, i32 %y) { } define i1 @caller.sext() { -; CHECK-LABEL: @caller.sext( +; CHECK-LABEL: define i1 @caller.sext() { ; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.sext(i32 100, i32 -120) ; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.sext(i32 300, i32 900) ; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] @@ -162,8 +165,9 @@ define i1 @caller.sext() { ; There's nothing we can do besides going to the full range or overdefined. define internal i1 @f.fptosi(i32 %x) { -; CHECK-LABEL: @f.fptosi( -; CHECK-NEXT: [[TO_DOUBLE:%.*]] = sitofp i32 [[X:%.*]] to double +; CHECK-LABEL: define internal i1 @f.fptosi( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[TO_DOUBLE:%.*]] = sitofp i32 [[X]] to double ; CHECK-NEXT: [[ADD:%.*]] = fadd double 0.000000e+00, [[TO_DOUBLE]] ; CHECK-NEXT: [[TO_I32:%.*]] = fptosi double [[ADD]] to i32 ; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i32 [[TO_I32]], 300 @@ -189,7 +193,7 @@ define internal i1 @f.fptosi(i32 %x) { } define i1 @caller.fptosi() { -; CHECK-LABEL: @caller.fptosi( +; CHECK-LABEL: define i1 @caller.fptosi() { ; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.fptosi(i32 100) ; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.fptosi(i32 300) ; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] @@ -203,8 +207,9 @@ define i1 @caller.fptosi() { ; There's nothing we can do besides going to the full range or overdefined. define internal i1 @f.fpext(i16 %x) { -; CHECK-LABEL: @f.fpext( -; CHECK-NEXT: [[TO_FLOAT:%.*]] = sitofp i16 [[X:%.*]] to float +; CHECK-LABEL: define internal i1 @f.fpext( +; CHECK-SAME: i16 [[X:%.*]]) { +; CHECK-NEXT: [[TO_FLOAT:%.*]] = sitofp i16 [[X]] to float ; CHECK-NEXT: [[TO_DOUBLE:%.*]] = fpext float [[TO_FLOAT]] to double ; CHECK-NEXT: [[TO_I64:%.*]] = fptoui float [[TO_FLOAT]] to i64 ; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i64 [[TO_I64]], 300 @@ -231,7 +236,7 @@ define internal i1 @f.fpext(i16 %x) { ; There's nothing we can do besides going to the full range or overdefined. define i1 @caller.fpext() { -; CHECK-LABEL: @caller.fpext( +; CHECK-LABEL: define i1 @caller.fpext() { ; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.fpext(i16 100) ; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.fpext(i16 300) ; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] @@ -245,8 +250,9 @@ define i1 @caller.fpext() { ; There's nothing we can do besides going to the full range or overdefined. define internal i1 @f.inttoptr.ptrtoint(i64 %x) { -; CHECK-LABEL: @f.inttoptr.ptrtoint( -; CHECK-NEXT: [[TO_PTR:%.*]] = inttoptr i64 [[X:%.*]] to ptr +; CHECK-LABEL: define internal i1 @f.inttoptr.ptrtoint( +; CHECK-SAME: i64 [[X:%.*]]) { +; CHECK-NEXT: [[TO_PTR:%.*]] = inttoptr i64 [[X]] to ptr ; CHECK-NEXT: [[TO_I64:%.*]] = ptrtoint ptr [[TO_PTR]] to i64 ; CHECK-NEXT: [[C_1:%.*]] = icmp sgt i64 [[TO_I64]], 300 ; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i64 [[TO_I64]], 299 @@ -270,7 +276,7 @@ define internal i1 @f.inttoptr.ptrtoint(i64 %x) { } define i1 @caller.inttoptr.ptrtoint() { -; CHECK-LABEL: @caller.inttoptr.ptrtoint( +; CHECK-LABEL: define i1 @caller.inttoptr.ptrtoint() { ; CHECK-NEXT: [[CALL_1:%.*]] = tail call i1 @f.inttoptr.ptrtoint(i64 100) ; CHECK-NEXT: [[CALL_2:%.*]] = tail call i1 @f.inttoptr.ptrtoint(i64 300) ; CHECK-NEXT: [[RES:%.*]] = and i1 [[CALL_1]], [[CALL_2]] @@ -284,8 +290,9 @@ define i1 @caller.inttoptr.ptrtoint() { ; Make sure we do not create constant ranges for int to fp casts. define i1 @int_range_to_double_cast(i32 %a) { -; CHECK-LABEL: @int_range_to_double_cast( -; CHECK-NEXT: [[R:%.*]] = and i32 [[A:%.*]], 255 +; CHECK-LABEL: define i1 @int_range_to_double_cast( +; CHECK-SAME: i32 [[A:%.*]]) { +; CHECK-NEXT: [[R:%.*]] = and i32 [[A]], 255 ; CHECK-NEXT: [[T4:%.*]] = sitofp i32 [[R]] to double ; CHECK-NEXT: [[T10:%.*]] = fadd double 0.000000e+00, [[T4]] ; CHECK-NEXT: [[T11:%.*]] = fcmp olt double [[T4]], [[T10]] @@ -300,7 +307,7 @@ define i1 @int_range_to_double_cast(i32 %a) { ; Make sure we do not use ranges to propagate info from vectors. define i16 @vector_binop_and_cast() { -; CHECK-LABEL: @vector_binop_and_cast( +; CHECK-LABEL: define i16 @vector_binop_and_cast() { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <8 x i16> <i16 undef, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, i16 undef, i32 0 ; CHECK-NEXT: [[REM:%.*]] = srem <8 x i16> <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>, [[VECINIT7]] @@ -317,8 +324,9 @@ entry: } define internal i64 @f.sext_to_zext(i32 %t) { -; CHECK-LABEL: @f.sext_to_zext( -; CHECK-NEXT: [[A:%.*]] = zext nneg i32 [[T:%.*]] to i64 +; CHECK-LABEL: define internal range(i64 0, 2) i64 @f.sext_to_zext( +; CHECK-SAME: i32 [[T:%.*]]) { +; CHECK-NEXT: [[A:%.*]] = zext nneg i32 [[T]] to i64 ; CHECK-NEXT: ret i64 [[A]] ; %a = sext i32 %t to i64 @@ -326,10 +334,11 @@ define internal i64 @f.sext_to_zext(i32 %t) { } define i64 @caller.sext_to_zext(i32 %i) { -; CHECK-LABEL: @caller.sext_to_zext( -; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[I:%.*]], 9 +; CHECK-LABEL: define range(i64 0, 2) i64 @caller.sext_to_zext( +; CHECK-SAME: i32 [[I:%.*]]) { +; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[I]], 9 ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32 -; CHECK-NEXT: [[T:%.*]] = call i64 @f.sext_to_zext(i32 [[CONV]]), !range [[RNG0:![0-9]+]] +; CHECK-NEXT: [[T:%.*]] = call i64 @f.sext_to_zext(i32 [[CONV]]) ; CHECK-NEXT: ret i64 [[T]] ; %cmp = icmp sle i32 %i, 9 diff --git a/llvm/test/Transforms/SCCP/ipsccp-basic.ll b/llvm/test/Transforms/SCCP/ipsccp-basic.ll index 71c042b9b29467..6a7ab8ac2864cd 100644 --- a/llvm/test/Transforms/SCCP/ipsccp-basic.ll +++ b/llvm/test/Transforms/SCCP/ipsccp-basic.ll @@ -71,7 +71,7 @@ define void @test3a() { } define i32 @test3b() { -; CHECK-LABEL: define i32 @test3b() { +; CHECK-LABEL: define range(i32 0, 18) i32 @test3b() { ; CHECK-NEXT: [[V:%.*]] = load i32, ptr @G, align 4 ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[V]], 17 ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -105,7 +105,7 @@ define internal {i64,i64} @test4a() { } define i64 @test4b() personality ptr @__gxx_personality_v0 { -; CHECK-LABEL: define i64 @test4b() personality ptr @__gxx_personality_v0 { +; CHECK-LABEL: define range(i64 0, 6) i64 @test4b() personality ptr @__gxx_personality_v0 { ; CHECK-NEXT: [[A:%.*]] = invoke { i64, i64 } @test4a() ; CHECK-NEXT: to label [[A:%.*]] unwind label [[B:%.*]] ; CHECK: A: @@ -149,7 +149,7 @@ define internal {i64,i64} @test5a() { } define i64 @test5b() personality ptr @__gxx_personality_v0 { -; CHECK-LABEL: define i64 @test5b() personality ptr @__gxx_personality_v0 { +; CHECK-LABEL: define range(i64 0, 6) i64 @test5b() personality ptr @__gxx_personality_v0 { ; CHECK-NEXT: [[A:%.*]] = invoke { i64, i64 } @test5a() ; CHECK-NEXT: to label [[A:%.*]] unwind label [[B:%.*]] ; CHECK: A: diff --git a/llvm/test/Transforms/SCCP/switch.ll b/llvm/test/Transforms/SCCP/switch.ll index 306f0eebf2b408..5208213de210c1 100644 --- a/llvm/test/Transforms/SCCP/switch.ll +++ b/llvm/test/Transforms/SCCP/switch.ll @@ -1,4 +1,4 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; RUN: opt -S -passes=ipsccp < %s | FileCheck %s ; Make sure we always consider the default edge executable for a switch @@ -7,7 +7,7 @@ declare void @foo() declare i32 @g(i32) define void @test1() { -; CHECK-LABEL: @test1( +; CHECK-LABEL: define void @test1() { ; CHECK-NEXT: switch i32 undef, label [[D:%.*]] [ ; CHECK-NEXT: ] ; CHECK: d: @@ -21,15 +21,16 @@ d: } define i32 @test_duplicate_successors_phi(i1 %c, i32 %x) { -; CHECK-LABEL: @test_duplicate_successors_phi( +; CHECK-LABEL: define i32 @test_duplicate_successors_phi( +; CHECK-SAME: i1 [[C:%.*]], i32 [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C:%.*]], label [[SWITCH:%.*]], label [[END:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[SWITCH:%.*]], label [[END:%.*]] ; CHECK: switch: ; CHECK-NEXT: br label [[SWITCH_DEFAULT:%.*]] ; CHECK: switch.default: ; CHECK-NEXT: ret i32 -1 ; CHECK: end: -; CHECK-NEXT: ret i32 [[X:%.*]] +; CHECK-NEXT: ret i32 [[X]] ; entry: br i1 %c, label %switch, label %end @@ -49,13 +50,14 @@ end: } define i32 @test_duplicate_successors_phi_2(i1 %c, i32 %x) { -; CHECK-LABEL: @test_duplicate_successors_phi_2( +; CHECK-LABEL: define i32 @test_duplicate_successors_phi_2( +; CHECK-SAME: i1 [[C:%.*]], i32 [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C:%.*]], label [[SWITCH:%.*]], label [[END:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[SWITCH:%.*]], label [[END:%.*]] ; CHECK: switch: ; CHECK-NEXT: br label [[END]] ; CHECK: end: -; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[X:%.*]], [[ENTRY:%.*]] ], [ 1, [[SWITCH]] ] +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ 1, [[SWITCH]] ] ; CHECK-NEXT: ret i32 [[PHI]] ; entry: @@ -76,22 +78,23 @@ end: } define i32 @test_duplicate_successors_phi_3(i1 %c1, ptr %p, i32 %y) { -; CHECK-LABEL: @test_duplicate_successors_phi_3( +; CHECK-LABEL: define i32 @test_duplicate_successors_phi_3( +; CHECK-SAME: i1 [[C1:%.*]], ptr [[P:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C1:%.*]], label [[SWITCH:%.*]], label [[SWITCH_1:%.*]] +; CHECK-NEXT: br i1 [[C1]], label [[SWITCH:%.*]], label [[SWITCH_1:%.*]] ; CHECK: switch: -; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0:![0-9]+]] +; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG0:![0-9]+]] ; CHECK-NEXT: switch i32 [[X]], label [[SWITCH_DEFAULT:%.*]] [ -; CHECK-NEXT: i32 0, label [[SWITCH_DEFAULT]] -; CHECK-NEXT: i32 1, label [[SWITCH_0:%.*]] -; CHECK-NEXT: i32 2, label [[SWITCH_0]] +; CHECK-NEXT: i32 0, label [[SWITCH_DEFAULT]] +; CHECK-NEXT: i32 1, label [[SWITCH_0:%.*]] +; CHECK-NEXT: i32 2, label [[SWITCH_0]] ; CHECK-NEXT: ] ; CHECK: switch.default: ; CHECK-NEXT: ret i32 -1 ; CHECK: switch.0: ; CHECK-NEXT: ret i32 0 ; CHECK: switch.1: -; CHECK-NEXT: ret i32 [[Y:%.*]] +; CHECK-NEXT: ret i32 [[Y]] ; entry: br i1 %c1, label %switch, label %switch.1 @@ -118,12 +121,13 @@ switch.1: } define i32 @test_local_range(ptr %p) { -; CHECK-LABEL: @test_local_range( -; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]] +; CHECK-LABEL: define range(i32 0, 3) i32 @test_local_range( +; CHECK-SAME: ptr [[P:%.*]]) { +; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG0]] ; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT_UNREACHABLE:%.*]] [ -; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]] -; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]] -; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]] +; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]] +; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]] +; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]] ; CHECK-NEXT: ] ; CHECK: default.unreachable: ; CHECK-NEXT: unreachable @@ -160,13 +164,14 @@ switch.3: ; TODO: Determine that case i3 is dead, even though the edge is shared? define i32 @test_duplicate_successors(ptr %p) { -; CHECK-LABEL: @test_duplicate_successors( -; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0]] +; CHECK-LABEL: define range(i32 0, 2) i32 @test_duplicate_successors( +; CHECK-SAME: ptr [[P:%.*]]) { +; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG0]] ; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT_UNREACHABLE:%.*]] [ -; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]] -; CHECK-NEXT: i32 1, label [[SWITCH_0]] -; CHECK-NEXT: i32 2, label [[SWITCH_1:%.*]] -; CHECK-NEXT: i32 3, label [[SWITCH_1]] +; CHECK-NEXT: i32 0, label [[SWITCH_0:%.*]] +; CHECK-NEXT: i32 1, label [[SWITCH_0]] +; CHECK-NEXT: i32 2, label [[SWITCH_1:%.*]] +; CHECK-NEXT: i32 3, label [[SWITCH_1]] ; CHECK-NEXT: ] ; CHECK: default.unreachable: ; CHECK-NEXT: unreachable @@ -201,11 +206,12 @@ switch.2: ; Case i32 2 is dead as well, but this cannot be determined based on ; range information. define internal i32 @test_ip_range(i32 %x) { -; CHECK-LABEL: @test_ip_range( -; CHECK-NEXT: switch i32 [[X:%.*]], label [[DEFAULT_UNREACHABLE:%.*]] [ -; CHECK-NEXT: i32 3, label [[SWITCH_3:%.*]] -; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]] -; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]] +; CHECK-LABEL: define internal range(i32 1, 4) i32 @test_ip_range( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT_UNREACHABLE:%.*]] [ +; CHECK-NEXT: i32 3, label [[SWITCH_3:%.*]] +; CHECK-NEXT: i32 1, label [[SWITCH_1:%.*]] +; CHECK-NEXT: i32 2, label [[SWITCH_2:%.*]] ; CHECK-NEXT: ], !prof [[PROF1:![0-9]+]] ; CHECK: default.unreachable: ; CHECK-NEXT: unreachable @@ -240,9 +246,9 @@ switch.3: } define void @call_test_ip_range() { -; CHECK-LABEL: @call_test_ip_range( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @test_ip_range(i32 1), !range [[RNG2:![0-9]+]] -; CHECK-NEXT: [[TMP2:%.*]] = call i32 @test_ip_range(i32 3), !range [[RNG2]] +; CHECK-LABEL: define void @call_test_ip_range() { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @test_ip_range(i32 1) +; CHECK-NEXT: [[TMP2:%.*]] = call i32 @test_ip_range(i32 3) ; CHECK-NEXT: ret void ; call i32 @test_ip_range(i32 1) @@ -251,11 +257,12 @@ define void @call_test_ip_range() { } define i32 @test_switch_range_may_include_undef(i1 %c.1, i1 %c.2, i32 %x) { -; CHECK-LABEL: @test_switch_range_may_include_undef( +; CHECK-LABEL: define range(i32 -1, 21) i32 @test_switch_range_may_include_undef( +; CHECK-SAME: i1 [[C_1:%.*]], i1 [[C_2:%.*]], i32 [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[C_1:%.*]], label [[THEN_1:%.*]], label [[ELSE_1:%.*]] +; CHECK-NEXT: br i1 [[C_1]], label [[THEN_1:%.*]], label [[ELSE_1:%.*]] ; CHECK: then.1: -; CHECK-NEXT: br i1 [[C_2:%.*]], label [[SWITCH:%.*]], label [[ELSE_2:%.*]] +; CHECK-NEXT: br i1 [[C_2]], label [[SWITCH:%.*]], label [[ELSE_2:%.*]] ; CHECK: else.1: ; CHECK-NEXT: br label [[SWITCH]] ; CHECK: else.2: @@ -263,8 +270,8 @@ define i32 @test_switch_range_may_include_undef(i1 %c.1, i1 %c.2, i32 %x) { ; CHECK: switch: ; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[THEN_1]] ], [ 2, [[ELSE_1]] ], [ undef, [[ELSE_2]] ] ; CHECK-NEXT: switch i32 [[P]], label [[SWITCH_DEFAULT:%.*]] [ -; CHECK-NEXT: i32 0, label [[END_1:%.*]] -; CHECK-NEXT: i32 3, label [[END_2:%.*]] +; CHECK-NEXT: i32 0, label [[END_1:%.*]] +; CHECK-NEXT: i32 3, label [[END_2:%.*]] ; CHECK-NEXT: ] ; CHECK: switch.default: ; CHECK-NEXT: ret i32 -1 @@ -303,9 +310,10 @@ end.2: } define i32 @test_default_unreachable_by_dom_cond(i32 %x) { -; CHECK-LABEL: @test_default_unreachable_by_dom_cond( +; CHECK-LABEL: define i32 @test_default_unreachable_by_dom_cond( +; CHECK-SAME: i32 [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[X:%.*]], 4 +; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[X]], 4 ; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[RETURN:%.*]] ; CHECK: if.then: ; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT_UNREACHABLE:%.*]] [ @@ -371,4 +379,7 @@ return: declare void @llvm.assume(i1) -; CHECK: !1 = !{!"branch_weights", i32 1, i32 5, i32 3, i32 4} +;. +; CHECK: [[RNG0]] = !{i32 0, i32 3} +; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 5, i32 3, i32 4} +;. diff --git a/llvm/test/Transforms/SCCP/trunc-nuw-nsw-flags.ll b/llvm/test/Transforms/SCCP/trunc-nuw-nsw-flags.ll index fc3e56011d46cd..d3bac0d68a979f 100644 --- a/llvm/test/Transforms/SCCP/trunc-nuw-nsw-flags.ll +++ b/llvm/test/Transforms/SCCP/trunc-nuw-nsw-flags.ll @@ -16,7 +16,7 @@ entry: } define i8 @range_from_or_nsw(i16 %a) { -; CHECK-LABEL: define i8 @range_from_or_nsw( +; CHECK-LABEL: define range(i8 -128, 0) i8 @range_from_or_nsw( ; CHECK-SAME: i16 [[A:%.*]]) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[AND1:%.*]] = or i16 [[A]], -128 @@ -30,7 +30,7 @@ entry: } define i16 @range_from_and_nuw_nsw(i32 %a) { -; CHECK-LABEL: define i16 @range_from_and_nuw_nsw( +; CHECK-LABEL: define range(i16 0, -32768) i16 @range_from_and_nuw_nsw( ; CHECK-SAME: i32 [[A:%.*]]) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[AND1:%.*]] = and i32 [[A]], 32767 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits