Index: llvm/lib/Target/ARM/ARMInstrThumb.td =================================================================== --- llvm/lib/Target/ARM/ARMInstrThumb.td +++ llvm/lib/Target/ARM/ARMInstrThumb.td @@ -592,6 +592,7 @@ [(ARMbrjt tGPR:$target, tjumptable:$jt)]>, Sched<[WriteBrTbl]> { let Size = 2; + let isNotDuplicable = 1; list Predicates = [IsThumb, IsThumb1Only]; } } Index: llvm/test/CodeGen/Thumb/pr42760.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/Thumb/pr42760.ll @@ -0,0 +1,357 @@ +; RUN: llc -tail-dup-placement-threshold=3 < %s +; We only check that this doesn't trigger an error. +target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv6m-none-unknown-eabi" + +define hidden void @test() { + br i1 undef, label %1, label %59 + +1: ; preds = %0 + br i1 undef, label %17, label %2 + +2: ; preds = %16, %1 + switch i32 undef, label %3 [ + i32 0, label %17 + i32 1, label %5 + i32 2, label %4 + i32 3, label %6 + ] + +3: ; preds = %2 + unreachable + +4: ; preds = %2 + br label %15 + +5: ; preds = %2 + br label %15 + +6: ; preds = %2 + switch i32 undef, label %7 [ + i32 0, label %17 + i32 1, label %14 + i32 2, label %11 + i32 3, label %10 + i32 4, label %9 + i32 5, label %8 + ] + +7: ; preds = %6 + unreachable + +8: ; preds = %6 + br label %15 + +9: ; preds = %6 + br label %15 + +10: ; preds = %6 + br label %15 + +11: ; preds = %6 + br i1 undef, label %13, label %12 + +12: ; preds = %11 + br label %15 + +13: ; preds = %11 + br label %15 + +14: ; preds = %6 + br label %15 + +15: ; preds = %14, %13, %12, %10, %9, %8, %5, %4 + br i1 undef, label %56, label %16 + +16: ; preds = %15 + br label %2 + +17: ; preds = %6, %2, %1 + br i1 undef, label %54, label %18 + +18: ; preds = %17 + br label %19 + +19: ; preds = %37, %18 + br i1 undef, label %20, label %27 + +20: ; preds = %26, %19 + switch i32 undef, label %28 [ + i32 0, label %37 + i32 1, label %37 + i32 2, label %26 + i32 3, label %21 + ] + +21: ; preds = %20 + switch i32 undef, label %30 [ + i32 0, label %37 + i32 1, label %25 + i32 2, label %24 + i32 3, label %23 + i32 4, label %22 + i32 5, label %26 + ] + +22: ; preds = %21 + br label %26 + +23: ; preds = %21 + br label %26 + +24: ; preds = %21 + br label %26 + +25: ; preds = %21 + br label %26 + +26: ; preds = %25, %24, %23, %22, %21, %20 + br i1 undef, label %38, label %20 + +27: ; preds = %36, %19 + switch i32 undef, label %28 [ + i32 0, label %37 + i32 1, label %35 + i32 2, label %36 + i32 3, label %29 + ] + +28: ; preds = %27, %20 + unreachable + +29: ; preds = %27 + switch i32 undef, label %30 [ + i32 0, label %37 + i32 1, label %34 + i32 2, label %33 + i32 3, label %32 + i32 4, label %31 + i32 5, label %36 + ] + +30: ; preds = %29, %21 + unreachable + +31: ; preds = %29 + br label %36 + +32: ; preds = %29 + br label %36 + +33: ; preds = %29 + br label %36 + +34: ; preds = %29 + br label %36 + +35: ; preds = %27 + br label %36 + +36: ; preds = %35, %34, %33, %32, %31, %29, %27 + br i1 undef, label %38, label %27 + +37: ; preds = %29, %27, %21, %20, %20 + br i1 undef, label %54, label %19 + +38: ; preds = %36, %26 + br label %57 + +39: ; preds = %54, %53 + switch i32 undef, label %40 [ + i32 0, label %40 + i32 1, label %42 + i32 2, label %41 + i32 3, label %43 + ] + +40: ; preds = %39 + unreachable + +41: ; preds = %39 + br label %52 + +42: ; preds = %39 + br label %52 + +43: ; preds = %39 + switch i32 undef, label %44 [ + i32 0, label %40 + i32 1, label %51 + i32 2, label %48 + i32 3, label %47 + i32 4, label %46 + i32 5, label %45 + ] + +44: ; preds = %43 + unreachable + +45: ; preds = %43 + br label %52 + +46: ; preds = %43 + br label %52 + +47: ; preds = %43 + br label %52 + +48: ; preds = %43 + br i1 undef, label %50, label %49 + +49: ; preds = %48 + br label %52 + +50: ; preds = %48 + br label %52 + +51: ; preds = %43 + br label %52 + +52: ; preds = %51, %50, %49, %47, %46, %45, %42, %41 + br i1 undef, label %55, label %53 + +53: ; preds = %52 + br label %39 + +54: ; preds = %37, %17 + br i1 undef, label %40, label %39 + +55: ; preds = %52 + br label %57 + +56: ; preds = %15 + br label %57 + +57: ; preds = %40, %95, %94, %56, %55, %38 + ret void + +58: ; preds = %40 + br label %59 + +59: ; preds = %40, %58, %0 + br i1 undef, label %75, label %60 + +60: ; preds = %74, %59 + switch i32 undef, label %61 [ + i32 0, label %75 + i32 1, label %63 + i32 2, label %62 + i32 3, label %64 + ] + +61: ; preds = %60 + unreachable + +62: ; preds = %60 + br label %73 + +63: ; preds = %60 + br label %73 + +64: ; preds = %60 + switch i32 undef, label %65 [ + i32 0, label %75 + i32 1, label %72 + i32 2, label %69 + i32 3, label %68 + i32 4, label %67 + i32 5, label %66 + ] + +65: ; preds = %64 + unreachable + +66: ; preds = %64 + br label %73 + +67: ; preds = %64 + br label %73 + +68: ; preds = %64 + br label %73 + +69: ; preds = %64 + br i1 undef, label %71, label %70 + +70: ; preds = %69 + br label %73 + +71: ; preds = %69 + br label %73 + +72: ; preds = %64 + br label %73 + +73: ; preds = %72, %71, %70, %68, %67, %66, %63, %62 + br i1 undef, label %40, label %74 + +74: ; preds = %73 + br label %60 + +75: ; preds = %64, %60, %59 + br i1 undef, label %40, label %92 + +76: ; preds = %93, %91 + switch i32 undef, label %77 [ + i32 0, label %40 + i32 1, label %79 + i32 2, label %78 + i32 3, label %81 + ] + +77: ; preds = %76 + unreachable + +78: ; preds = %76 + br label %90 + +79: ; preds = %76 + %80 = getelementptr inbounds i8, i8* undef, i32 76 + br label %90 + +81: ; preds = %76 + switch i32 undef, label %82 [ + i32 0, label %40 + i32 1, label %89 + i32 2, label %86 + i32 3, label %85 + i32 4, label %84 + i32 5, label %83 + ] + +82: ; preds = %81 + unreachable + +83: ; preds = %81 + br label %90 + +84: ; preds = %81 + br label %90 + +85: ; preds = %81 + br label %90 + +86: ; preds = %81 + br i1 undef, label %88, label %87 + +87: ; preds = %86 + br label %90 + +88: ; preds = %86 + br label %90 + +89: ; preds = %81 + br label %90 + +90: ; preds = %89, %88, %87, %85, %84, %83, %79, %78 + br i1 undef, label %40, label %91 + +91: ; preds = %90 + br label %76 + +92: ; preds = %75 + br i1 undef, label %40, label %93 + +93: ; preds = %92 + br label %76 +}