Index: llvm/lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- llvm/lib/CodeGen/CodeGenPrepare.cpp +++ llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -4966,7 +4966,7 @@ // Max number of memory uses to look at before aborting the search to conserve // compile time. -static constexpr int MaxMemoryUsesToScan = 20; +static constexpr int MaxMemoryUsesToScan = 100; /// Recursively walk all the uses of I until we find a memory use. /// If we find an obviously non-foldable instruction, return true. Index: llvm/test/CodeGen/Generic/addr-use-count.ll =================================================================== --- llvm/test/CodeGen/Generic/addr-use-count.ll +++ llvm/test/CodeGen/Generic/addr-use-count.ll @@ -1,10 +1,6 @@ ; RUN: llc --stop-after=codegenprepare < %s | FileCheck %s -; Originally, in the function `f`, `%addr` is not folded into its uses, since CodeGenPrepare -; hits the instruction scan limit, but it is folded in `g` even though `g` contains -; the same number of uses. -; Test that now `addr` is not folded in either function. -; CHECK-NOT: sunkaddr +; Update the test after increasing the scan limits in CodeGenPrepare define i32 @f(i32 %x, ptr %p) { entry: %addr = getelementptr i32 *, ptr %p, i32 4 @@ -32,106 +28,169 @@ i32 20, label %case20] case0: +; CHECK: case0: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t0 = load i32, ptr %sunkaddr{{.*}}, align 4 %t0 = load i32, ptr %addr %v0 = add i32 %t0, 0 br label %exit case1: +; CHECK: case1: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t1 = load i32, ptr %sunkaddr{{.*}}, align 4 %t1 = load i32, ptr %addr %v1 = add i32 %t1, 1 br label %exit case2: +; CHECK: case2: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t2 = load i32, ptr %sunkaddr{{.*}}, align 4 %t2 = load i32, ptr %addr %v2 = add i32 %t2, 2 br label %exit case3: +; CHECK: case3: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t3 = load i32, ptr %sunkaddr{{.*}}, align 4 %t3 = load i32, ptr %addr %v3 = add i32 %t3, 3 br label %exit case4: +; CHECK: case4: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t4 = load i32, ptr %sunkaddr{{.*}}, align 4 %t4 = load i32, ptr %addr %v4 = add i32 %t4, 4 br label %exit case5: +; CHECK: case5: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t5 = load i32, ptr %sunkaddr{{.*}}, align 4 %t5 = load i32, ptr %addr %v5 = add i32 %t5, 5 br label %exit case6: +; CHECK: case6: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t6 = load i32, ptr %sunkaddr{{.*}}, align 4 %t6 = load i32, ptr %addr %v6 = add i32 %t6, 6 br label %exit case7: +; CHECK: case7: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t7 = load i32, ptr %sunkaddr{{.*}}, align 4 %t7 = load i32, ptr %addr %v7 = add i32 %t7, 7 br label %exit case8: +; CHECK: case8: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t8 = load i32, ptr %sunkaddr{{.*}}, align 4 %t8 = load i32, ptr %addr %v8 = add i32 %t8, 8 br label %exit case9: +; CHECK: case9: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t9 = load i32, ptr %sunkaddr{{.*}}, align 4 %t9 = load i32, ptr %addr %v9 = add i32 %t9, 9 br label %exit case10: +; CHECK: case10: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t10 = load i32, ptr %sunkaddr{{.*}}, align 4 %t10 = load i32, ptr %addr %v10 = add i32 %t10, 10 br label %exit case11: +; CHECK: case11: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t11 = load i32, ptr %sunkaddr{{.*}}, align 4 %t11 = load i32, ptr %addr %v11 = add i32 %t11, 11 br label %exit case12: +; CHECK: case12: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t12 = load i32, ptr %sunkaddr{{.*}}, align 4 %t12 = load i32, ptr %addr %v12 = add i32 %t12, 12 br label %exit case13: +; CHECK: case13: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t13 = load i32, ptr %sunkaddr{{.*}}, align 4 %t13 = load i32, ptr %addr %v13 = add i32 %t13, 13 br label %exit case14: +; CHECK: case14: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t14 = load i32, ptr %sunkaddr{{.*}}, align 4 %t14 = load i32, ptr %addr %v14 = add i32 %t14, 14 br label %exit case15: +; CHECK: case15: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t15 = load i32, ptr %sunkaddr{{.*}}, align 4 %t15 = load i32, ptr %addr %v15 = add i32 %t15, 15 br label %exit case16: +; CHECK: case16: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t16 = load i32, ptr %sunkaddr{{.*}}, align 4 %t16 = load i32, ptr %addr %v16 = add i32 %t16, 16 br label %exit case17: +; CHECK: case17: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t17 = load i32, ptr %sunkaddr{{.*}}, align 4 %t17 = load i32, ptr %addr %v17 = add i32 %t17, 17 br label %exit case18: +; CHECK: case18: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t18 = load i32, ptr %sunkaddr{{.*}}, align 4 %t18 = load i32, ptr %addr %v18 = add i32 %t18, 18 br label %exit case19: +; CHECK: case19: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t19 = load i32, ptr %sunkaddr{{.*}}, align 4 %t19 = load i32, ptr %addr %v19 = add i32 %t19, 19 br label %exit case20: +; CHECK: case20: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t20 = load i32, ptr %sunkaddr{{.*}}, align 4 %t20 = load i32, ptr %addr %v20 = add i32 %t20, 20 br label %exit @@ -173,101 +232,161 @@ i32 19, label %case19] case0: +; CHECK: case0: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t0 = load i32, ptr %sunkaddr{{.*}}, align 4 %t0 = load i32, ptr %addr %v0 = add i32 %t0, 0 br label %exit case1: +; CHECK: case1: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t1 = load i32, ptr %sunkaddr{{.*}}, align 4 %t1 = load i32, ptr %addr %v1 = add i32 %t1, 1 br label %exit case2: +; CHECK: case2: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t2 = load i32, ptr %sunkaddr{{.*}}, align 4 %t2 = load i32, ptr %addr %v2 = add i32 %t2, 2 br label %exit case3: +; CHECK: case3: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t3 = load i32, ptr %sunkaddr{{.*}}, align 4 %t3 = load i32, ptr %addr %v3 = add i32 %t3, 3 br label %exit case4: +; CHECK: case4: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t4 = load i32, ptr %sunkaddr{{.*}}, align 4 %t4 = load i32, ptr %addr %v4 = add i32 %t4, 4 br label %exit case5: +; CHECK: case5: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t5 = load i32, ptr %sunkaddr{{.*}}, align 4 %t5 = load i32, ptr %addr %v5 = add i32 %t5, 5 br label %exit case6: +; CHECK: case6: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t6 = load i32, ptr %sunkaddr{{.*}}, align 4 %t6 = load i32, ptr %addr %v6 = add i32 %t6, 6 br label %exit case7: +; CHECK: case7: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t7 = load i32, ptr %sunkaddr{{.*}}, align 4 %t7 = load i32, ptr %addr %v7 = add i32 %t7, 7 br label %exit case8: +; CHECK: case8: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t8 = load i32, ptr %sunkaddr{{.*}}, align 4 %t8 = load i32, ptr %addr %v8 = add i32 %t8, 8 br label %exit case9: +; CHECK: case9: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t9 = load i32, ptr %sunkaddr{{.*}}, align 4 %t9 = load i32, ptr %addr %v9 = add i32 %t9, 9 br label %exit case10: +; CHECK: case10: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t10 = load i32, ptr %sunkaddr{{.*}}, align 4 %t10 = load i32, ptr %addr %v10 = add i32 %t10, 10 br label %exit case11: +; CHECK: case11: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t11 = load i32, ptr %sunkaddr{{.*}}, align 4 %t11 = load i32, ptr %addr %v11 = add i32 %t11, 11 br label %exit case12: +; CHECK: case12: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t12 = load i32, ptr %sunkaddr{{.*}}, align 4 %t12 = load i32, ptr %addr %v12 = add i32 %t12, 12 br label %exit case13: +; CHECK: case13: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t13 = load i32, ptr %sunkaddr{{.*}}, align 4 %t13 = load i32, ptr %addr %v13 = add i32 %t13, 13 br label %exit case14: +; CHECK: case14: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t14 = load i32, ptr %sunkaddr{{.*}}, align 4 %t14 = load i32, ptr %addr %v14 = add i32 %t14, 14 br label %exit case15: +; CHECK: case15: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t15 = load i32, ptr %sunkaddr{{.*}}, align 4 %t15 = load i32, ptr %addr %v15 = add i32 %t15, 15 br label %exit case16: +; CHECK: case16: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t16 = load i32, ptr %sunkaddr{{.*}}, align 4 %t16 = load i32, ptr %addr %v16 = add i32 %t16, 16 br label %exit case17: +; CHECK: case17: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t17 = load i32, ptr %sunkaddr{{.*}}, align 4 %t17 = load i32, ptr %addr %v17 = add i32 %t17, 17 br label %exit case18: +; CHECK: case18: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 32 +; CHECK-NEXT: %t18 = load i32, ptr %sunkaddr{{.*}}, align 4 %t18 = load i32, ptr %addr %v18 = add i32 %t18, 18 br label %exit case19: +; CHECK: case19: +; CHECK-NEXT: %sunkaddr{{.*}} = getelementptr i8, ptr %p, i64 40 +; CHECK-NEXT: %t20 = load i32, ptr %sunkaddr{{.*}}, align 4 %t19 = getelementptr i32 *, ptr %addr, i32 1 %t20 = load i32, ptr %t19 %v19 = add i32 %t20, 19