|
| 1 | +; RUN: llc < %s -mtriple=x86_64-apple-darwin8 -misched-print-dags -o - 2>&1 > /dev/null | FileCheck %s |
| 2 | + |
| 3 | +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" |
| 4 | + |
| 5 | +@sc = common global i8 0 |
| 6 | +@uc = common global i8 0 |
| 7 | +@ss = common global i16 0 |
| 8 | +@us = common global i16 0 |
| 9 | +@si = common global i32 0 |
| 10 | +@ui = common global i32 0 |
| 11 | +@sl = common global i64 0 |
| 12 | +@ul = common global i64 0 |
| 13 | +@sll = common global i64 0 |
| 14 | +@ull = common global i64 0 |
| 15 | + |
| 16 | +; Regression Test for PR92368. |
| 17 | +; |
| 18 | +; CHECK: SU(75): CMP8rr %49:gr8, %48:gr8, implicit-def $eflags |
| 19 | +; CHECK: Predecessors: |
| 20 | +; CHECK-NEXT: SU(73): Data Latency=0 Reg=%49 |
| 21 | +; CHECK-NEXT: SU(74): Out Latency=0 |
| 22 | +; CHECK-NEXT: SU(72): Out Latency=0 |
| 23 | +; CHECK-NEXT: SU(70): Data Latency=4 Reg=%48 |
| 24 | +define void @misched_bug() nounwind { |
| 25 | +entry: |
| 26 | + %0 = load i8, i8* @sc, align 1 |
| 27 | + %1 = zext i8 %0 to i32 |
| 28 | + %2 = load i8, i8* @uc, align 1 |
| 29 | + %3 = zext i8 %2 to i32 |
| 30 | + %4 = trunc i32 %3 to i8 |
| 31 | + %5 = trunc i32 %1 to i8 |
| 32 | + %pair6 = cmpxchg i8* @sc, i8 %4, i8 %5 monotonic monotonic |
| 33 | + %6 = extractvalue { i8, i1 } %pair6, 0 |
| 34 | + store i8 %6, i8* @sc, align 1 |
| 35 | + %7 = load i8, i8* @sc, align 1 |
| 36 | + %8 = zext i8 %7 to i32 |
| 37 | + %9 = load i8, i8* @uc, align 1 |
| 38 | + %10 = zext i8 %9 to i32 |
| 39 | + %11 = trunc i32 %10 to i8 |
| 40 | + %12 = trunc i32 %8 to i8 |
| 41 | + %pair13 = cmpxchg i8* @uc, i8 %11, i8 %12 monotonic monotonic |
| 42 | + %13 = extractvalue { i8, i1 } %pair13, 0 |
| 43 | + store i8 %13, i8* @uc, align 1 |
| 44 | + %14 = load i8, i8* @sc, align 1 |
| 45 | + %15 = sext i8 %14 to i16 |
| 46 | + %16 = zext i16 %15 to i32 |
| 47 | + %17 = load i8, i8* @uc, align 1 |
| 48 | + %18 = zext i8 %17 to i32 |
| 49 | + %19 = bitcast i8* bitcast (i16* @ss to i8*) to i16* |
| 50 | + %20 = trunc i32 %18 to i16 |
| 51 | + %21 = trunc i32 %16 to i16 |
| 52 | + %pair22 = cmpxchg i16* %19, i16 %20, i16 %21 monotonic monotonic |
| 53 | + %22 = extractvalue { i16, i1 } %pair22, 0 |
| 54 | + store i16 %22, i16* @ss, align 2 |
| 55 | + %23 = load i8, i8* @sc, align 1 |
| 56 | + %24 = sext i8 %23 to i16 |
| 57 | + %25 = zext i16 %24 to i32 |
| 58 | + %26 = load i8, i8* @uc, align 1 |
| 59 | + %27 = zext i8 %26 to i32 |
| 60 | + %28 = bitcast i8* bitcast (i16* @us to i8*) to i16* |
| 61 | + %29 = trunc i32 %27 to i16 |
| 62 | + %30 = trunc i32 %25 to i16 |
| 63 | + %pair31 = cmpxchg i16* %28, i16 %29, i16 %30 monotonic monotonic |
| 64 | + %31 = extractvalue { i16, i1 } %pair31, 0 |
| 65 | + store i16 %31, i16* @us, align 2 |
| 66 | + %32 = load i8, i8* @sc, align 1 |
| 67 | + %33 = sext i8 %32 to i32 |
| 68 | + %34 = load i8, i8* @uc, align 1 |
| 69 | + %35 = zext i8 %34 to i32 |
| 70 | + %36 = bitcast i8* bitcast (i32* @si to i8*) to i32* |
| 71 | + %pair37 = cmpxchg i32* %36, i32 %35, i32 %33 monotonic monotonic |
| 72 | + %37 = extractvalue { i32, i1 } %pair37, 0 |
| 73 | + store i32 %37, i32* @si, align 4 |
| 74 | + %38 = load i8, i8* @sc, align 1 |
| 75 | + %39 = sext i8 %38 to i32 |
| 76 | + %40 = load i8, i8* @uc, align 1 |
| 77 | + %41 = zext i8 %40 to i32 |
| 78 | + %42 = bitcast i8* bitcast (i32* @ui to i8*) to i32* |
| 79 | + %pair43 = cmpxchg i32* %42, i32 %41, i32 %39 monotonic monotonic |
| 80 | + %43 = extractvalue { i32, i1 } %pair43, 0 |
| 81 | + store i32 %43, i32* @ui, align 4 |
| 82 | + %44 = load i8, i8* @sc, align 1 |
| 83 | + %45 = sext i8 %44 to i64 |
| 84 | + %46 = load i8, i8* @uc, align 1 |
| 85 | + %47 = zext i8 %46 to i64 |
| 86 | + %48 = bitcast i8* bitcast (i64* @sl to i8*) to i64* |
| 87 | + %pair49 = cmpxchg i64* %48, i64 %47, i64 %45 monotonic monotonic |
| 88 | + %49 = extractvalue { i64, i1 } %pair49, 0 |
| 89 | + store i64 %49, i64* @sl, align 8 |
| 90 | + %50 = load i8, i8* @sc, align 1 |
| 91 | + %51 = sext i8 %50 to i64 |
| 92 | + %52 = load i8, i8* @uc, align 1 |
| 93 | + %53 = zext i8 %52 to i64 |
| 94 | + %54 = bitcast i8* bitcast (i64* @ul to i8*) to i64* |
| 95 | + %pair55 = cmpxchg i64* %54, i64 %53, i64 %51 monotonic monotonic |
| 96 | + %55 = extractvalue { i64, i1 } %pair55, 0 |
| 97 | + store i64 %55, i64* @ul, align 8 |
| 98 | + %56 = load i8, i8* @sc, align 1 |
| 99 | + %57 = sext i8 %56 to i64 |
| 100 | + %58 = load i8, i8* @uc, align 1 |
| 101 | + %59 = zext i8 %58 to i64 |
| 102 | + %60 = bitcast i8* bitcast (i64* @sll to i8*) to i64* |
| 103 | + %pair61 = cmpxchg i64* %60, i64 %59, i64 %57 monotonic monotonic |
| 104 | + %61 = extractvalue { i64, i1 } %pair61, 0 |
| 105 | + store i64 %61, i64* @sll, align 8 |
| 106 | + %62 = load i8, i8* @sc, align 1 |
| 107 | + %63 = sext i8 %62 to i64 |
| 108 | + %64 = load i8, i8* @uc, align 1 |
| 109 | + %65 = zext i8 %64 to i64 |
| 110 | + %66 = bitcast i8* bitcast (i64* @ull to i8*) to i64* |
| 111 | + %pair67 = cmpxchg i64* %66, i64 %65, i64 %63 monotonic monotonic |
| 112 | + %67 = extractvalue { i64, i1 } %pair67, 0 |
| 113 | + store i64 %67, i64* @ull, align 8 |
| 114 | + %68 = load i8, i8* @sc, align 1 |
| 115 | + %69 = zext i8 %68 to i32 |
| 116 | + %70 = load i8, i8* @uc, align 1 |
| 117 | + %71 = zext i8 %70 to i32 |
| 118 | + %72 = trunc i32 %71 to i8 |
| 119 | + %73 = trunc i32 %69 to i8 |
| 120 | + %pair74 = cmpxchg i8* @sc, i8 %72, i8 %73 monotonic monotonic |
| 121 | + %74 = extractvalue { i8, i1 } %pair74, 0 |
| 122 | + %75 = icmp eq i8 %74, %72 |
| 123 | + %76 = zext i1 %75 to i8 |
| 124 | + %77 = zext i8 %76 to i32 |
| 125 | + store i32 %77, i32* @ui, align 4 |
| 126 | + %78 = load i8, i8* @sc, align 1 |
| 127 | + %79 = zext i8 %78 to i32 |
| 128 | + %80 = load i8, i8* @uc, align 1 |
| 129 | + %81 = zext i8 %80 to i32 |
| 130 | + %82 = trunc i32 %81 to i8 |
| 131 | + %83 = trunc i32 %79 to i8 |
| 132 | + %pair84 = cmpxchg i8* @uc, i8 %82, i8 %83 monotonic monotonic |
| 133 | + %84 = extractvalue { i8, i1 } %pair84, 0 |
| 134 | + %85 = icmp eq i8 %84, %82 |
| 135 | + %86 = zext i1 %85 to i8 |
| 136 | + %87 = zext i8 %86 to i32 |
| 137 | + store i32 %87, i32* @ui, align 4 |
| 138 | + %88 = load i8, i8* @sc, align 1 |
| 139 | + %89 = sext i8 %88 to i16 |
| 140 | + %90 = zext i16 %89 to i32 |
| 141 | + %91 = load i8, i8* @uc, align 1 |
| 142 | + %92 = zext i8 %91 to i32 |
| 143 | + %93 = trunc i32 %92 to i8 |
| 144 | + %94 = trunc i32 %90 to i8 |
| 145 | + %pair95 = cmpxchg i8* bitcast (i16* @ss to i8*), i8 %93, i8 %94 monotonic monotonic |
| 146 | + %95 = extractvalue { i8, i1 } %pair95, 0 |
| 147 | + %96 = icmp eq i8 %95, %93 |
| 148 | + %97 = zext i1 %96 to i8 |
| 149 | + %98 = zext i8 %97 to i32 |
| 150 | + store i32 %98, i32* @ui, align 4 |
| 151 | + %99 = load i8, i8* @sc, align 1 |
| 152 | + %100 = sext i8 %99 to i16 |
| 153 | + %101 = zext i16 %100 to i32 |
| 154 | + %102 = load i8, i8* @uc, align 1 |
| 155 | + %103 = zext i8 %102 to i32 |
| 156 | + %104 = trunc i32 %103 to i8 |
| 157 | + %105 = trunc i32 %101 to i8 |
| 158 | + %pair106 = cmpxchg i8* bitcast (i16* @us to i8*), i8 %104, i8 %105 monotonic monotonic |
| 159 | + %106 = extractvalue { i8, i1 } %pair106, 0 |
| 160 | + %107 = icmp eq i8 %106, %104 |
| 161 | + %108 = zext i1 %107 to i8 |
| 162 | + %109 = zext i8 %108 to i32 |
| 163 | + store i32 %109, i32* @ui, align 4 |
| 164 | + %110 = load i8, i8* @sc, align 1 |
| 165 | + %111 = sext i8 %110 to i32 |
| 166 | + %112 = load i8, i8* @uc, align 1 |
| 167 | + %113 = zext i8 %112 to i32 |
| 168 | + %114 = trunc i32 %113 to i8 |
| 169 | + %115 = trunc i32 %111 to i8 |
| 170 | + %pair116 = cmpxchg i8* bitcast (i32* @si to i8*), i8 %114, i8 %115 monotonic monotonic |
| 171 | + %116 = extractvalue { i8, i1 } %pair116, 0 |
| 172 | + %117 = icmp eq i8 %116, %114 |
| 173 | + %118 = zext i1 %117 to i8 |
| 174 | + %119 = zext i8 %118 to i32 |
| 175 | + store i32 %119, i32* @ui, align 4 |
| 176 | + %120 = load i8, i8* @sc, align 1 |
| 177 | + %121 = sext i8 %120 to i32 |
| 178 | + %122 = load i8, i8* @uc, align 1 |
| 179 | + %123 = zext i8 %122 to i32 |
| 180 | + %124 = trunc i32 %123 to i8 |
| 181 | + %125 = trunc i32 %121 to i8 |
| 182 | + %pair126 = cmpxchg i8* bitcast (i32* @ui to i8*), i8 %124, i8 %125 monotonic monotonic |
| 183 | + %126 = extractvalue { i8, i1 } %pair126, 0 |
| 184 | + %127 = icmp eq i8 %126, %124 |
| 185 | + %128 = zext i1 %127 to i8 |
| 186 | + %129 = zext i8 %128 to i32 |
| 187 | + store i32 %129, i32* @ui, align 4 |
| 188 | + %130 = load i8, i8* @sc, align 1 |
| 189 | + %131 = sext i8 %130 to i64 |
| 190 | + %132 = load i8, i8* @uc, align 1 |
| 191 | + %133 = zext i8 %132 to i64 |
| 192 | + %134 = trunc i64 %133 to i8 |
| 193 | + %135 = trunc i64 %131 to i8 |
| 194 | + %pair136 = cmpxchg i8* bitcast (i64* @sl to i8*), i8 %134, i8 %135 monotonic monotonic |
| 195 | + %136 = extractvalue { i8, i1 } %pair136, 0 |
| 196 | + %137 = icmp eq i8 %136, %134 |
| 197 | + %138 = zext i1 %137 to i8 |
| 198 | + %139 = zext i8 %138 to i32 |
| 199 | + store i32 %139, i32* @ui, align 4 |
| 200 | + %140 = load i8, i8* @sc, align 1 |
| 201 | + %141 = sext i8 %140 to i64 |
| 202 | + %142 = load i8, i8* @uc, align 1 |
| 203 | + %143 = zext i8 %142 to i64 |
| 204 | + %144 = trunc i64 %143 to i8 |
| 205 | + %145 = trunc i64 %141 to i8 |
| 206 | + %pair146 = cmpxchg i8* bitcast (i64* @ul to i8*), i8 %144, i8 %145 monotonic monotonic |
| 207 | + %146 = extractvalue { i8, i1 } %pair146, 0 |
| 208 | + %147 = icmp eq i8 %146, %144 |
| 209 | + %148 = zext i1 %147 to i8 |
| 210 | + %149 = zext i8 %148 to i32 |
| 211 | + store i32 %149, i32* @ui, align 4 |
| 212 | + %150 = load i8, i8* @sc, align 1 |
| 213 | + %151 = sext i8 %150 to i64 |
| 214 | + %152 = load i8, i8* @uc, align 1 |
| 215 | + %153 = zext i8 %152 to i64 |
| 216 | + %154 = trunc i64 %153 to i8 |
| 217 | + %155 = trunc i64 %151 to i8 |
| 218 | + %pair156 = cmpxchg i8* bitcast (i64* @sll to i8*), i8 %154, i8 %155 monotonic monotonic |
| 219 | + %156 = extractvalue { i8, i1 } %pair156, 0 |
| 220 | + %157 = icmp eq i8 %156, %154 |
| 221 | + %158 = zext i1 %157 to i8 |
| 222 | + %159 = zext i8 %158 to i32 |
| 223 | + store i32 %159, i32* @ui, align 4 |
| 224 | + %160 = load i8, i8* @sc, align 1 |
| 225 | + %161 = sext i8 %160 to i64 |
| 226 | + %162 = load i8, i8* @uc, align 1 |
| 227 | + %163 = zext i8 %162 to i64 |
| 228 | + %164 = trunc i64 %163 to i8 |
| 229 | + %165 = trunc i64 %161 to i8 |
| 230 | + %pair166 = cmpxchg i8* bitcast (i64* @ull to i8*), i8 %164, i8 %165 monotonic monotonic |
| 231 | + %166 = extractvalue { i8, i1 } %pair166, 0 |
| 232 | + %167 = icmp eq i8 %166, %164 |
| 233 | + %168 = zext i1 %167 to i8 |
| 234 | + %169 = zext i8 %168 to i32 |
| 235 | + store i32 %169, i32* @ui, align 4 |
| 236 | + br label %return |
| 237 | + |
| 238 | +return: ; preds = %entry |
| 239 | + ret void |
| 240 | +} |
0 commit comments