Index: llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp =================================================================== --- llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -1439,9 +1439,12 @@ if (PrevSI->isUnordered() && equivalentAddressValues(PrevSI->getOperand(1), SI.getOperand(1))) { ++NumDeadStore; - ++BBI; + // Manually add back the original store to the worklist now, so it will + // be processed after the operands of the removed store, as this may + // expose additional DSE opportunities. + Worklist.Add(&SI); eraseInstFromFunction(*PrevSI); - continue; + return nullptr; } break; } Index: llvm/test/Transforms/InstCombine/pr44552.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/InstCombine/pr44552.ll @@ -0,0 +1,394 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -instcombine -instcombine-infinite-loop-threshold=2 < %s | FileCheck %s + +; This used to require 100 instcombine iterations to fully optimize. + +%struct.S3 = type { i64, %struct.S2, %struct.S1, %struct.S1, %struct.S1, %struct.S0, i16, i32 } +%struct.S2 = type { i16, i32, i16, i32, i32, i16 } +%struct.S1 = type { i16, i32, i32, i32, i16, i16, i16 } +%struct.S0 = type { i32, i16 } +%struct.S4 = type { %struct.S2 } + +@csmith_sink_ = dso_local global i64 0, align 1 +@g_302_7 = internal constant i32 0, align 1 +@g_313_0 = internal global i16 0, align 1 +@g_313_1 = internal global i32 0, align 1 +@g_313_2 = internal global i32 0, align 1 +@g_313_3 = internal global i32 0, align 1 +@g_313_4 = internal global i16 0, align 1 +@g_313_5 = internal global i16 0, align 1 +@g_313_6 = internal global i16 0, align 1 +@g_316 = internal global %struct.S3 zeroinitializer, align 1 +@g_316_1_0 = internal global i16 0, align 1 +@g_316_1_1 = internal global i32 0, align 1 +@g_316_1_2 = internal global i16 0, align 1 +@g_316_1_3 = internal global i32 0, align 1 +@g_316_1_4 = internal global i32 0, align 1 +@g_316_1_5 = internal global i16 0, align 1 +@g_316_3_0 = internal global i16 0, align 1 +@g_316_3_1 = internal global i32 0, align 1 +@g_316_3_2 = internal global i32 0, align 1 +@g_316_3_3 = internal global i32 0, align 1 +@g_316_3_4 = internal global i16 0, align 1 +@g_316_3_5 = internal global i16 0, align 1 +@g_316_3_6 = internal global i16 0, align 1 +@g_316_4_0 = internal global i16 0, align 1 +@g_316_4_1 = internal global i32 0, align 1 +@g_316_4_2 = internal global i32 0, align 1 +@g_316_4_3 = internal global i32 0, align 1 +@g_316_4_4 = internal global i16 0, align 1 +@g_316_4_5 = internal global i16 0, align 1 +@g_316_4_6 = internal global i16 0, align 1 +@g_316_5_0 = internal global i32 0, align 1 +@g_316_5_1 = internal global i16 0, align 1 +@g_316_6 = internal global i16 0, align 1 +@g_316_7 = internal global i32 0, align 1 +@g_317 = internal global %struct.S3 zeroinitializer, align 1 +@g_317_1_0 = internal global i16 0, align 1 +@g_317_1_1 = internal global i32 0, align 1 +@g_317_1_2 = internal global i16 0, align 1 +@g_317_1_3 = internal global i32 0, align 1 +@g_317_1_4 = internal global i32 0, align 1 +@g_317_1_5 = internal global i16 0, align 1 +@g_317_3_0 = internal global i16 0, align 1 +@g_317_3_1 = internal global i32 0, align 1 +@g_317_3_2 = internal global i32 0, align 1 +@g_317_3_3 = internal global i32 0, align 1 +@g_317_3_4 = internal global i16 0, align 1 +@g_317_3_5 = internal global i16 0, align 1 +@g_317_3_6 = internal global i16 0, align 1 +@g_317_4_0 = internal global i16 0, align 1 +@g_317_4_1 = internal global i32 0, align 1 +@g_317_4_2 = internal global i32 0, align 1 +@g_317_4_3 = internal global i32 0, align 1 +@g_317_4_4 = internal global i16 0, align 1 +@g_317_4_5 = internal global i16 0, align 1 +@g_317_4_6 = internal global i16 0, align 1 +@g_317_5_0 = internal global i32 0, align 1 +@g_317_5_1 = internal global i16 0, align 1 +@g_317_6 = internal global i16 0, align 1 +@g_317_7 = internal global i32 0, align 1 +@g_318 = internal global %struct.S3 zeroinitializer, align 1 +@g_318_1_0 = internal global i16 0, align 1 +@g_318_1_1 = internal global i32 0, align 1 +@g_318_1_2 = internal global i16 0, align 1 +@g_318_1_3 = internal global i32 0, align 1 +@g_318_1_4 = internal global i32 0, align 1 +@g_318_1_5 = internal global i16 0, align 1 +@g_318_3_0 = internal global i16 0, align 1 +@g_318_3_1 = internal global i32 0, align 1 +@g_318_3_2 = internal global i32 0, align 1 +@g_318_3_3 = internal global i32 0, align 1 +@g_318_3_4 = internal global i16 0, align 1 +@g_318_3_5 = internal global i16 0, align 1 +@g_318_3_6 = internal global i16 0, align 1 +@g_318_4_0 = internal global i16 0, align 1 +@g_318_4_1 = internal global i32 0, align 1 +@g_318_4_2 = internal global i32 0, align 1 +@g_318_4_3 = internal global i32 0, align 1 +@g_318_4_4 = internal global i16 0, align 1 +@g_318_4_5 = internal global i16 0, align 1 + +define i16 @main() { +; CHECK-LABEL: @main( +; CHECK-NEXT: entry: +; CHECK-NEXT: store i64 0, i64* @csmith_sink_, align 8 +; CHECK-NEXT: ret i16 0 +; +entry: + store i64 0, i64* @csmith_sink_, align 1 + %0 = load i16, i16* @g_313_0, align 1 + %conv2 = sext i16 %0 to i64 + store i64 %conv2, i64* @csmith_sink_, align 1 + %1 = load i32, i32* @g_313_1, align 1 + %conv3 = zext i32 %1 to i64 + store i64 %conv3, i64* @csmith_sink_, align 1 + %2 = load i32, i32* @g_313_2, align 1 + %conv4 = sext i32 %2 to i64 + store i64 %conv4, i64* @csmith_sink_, align 1 + %3 = load i32, i32* @g_313_3, align 1 + %conv5 = zext i32 %3 to i64 + store i64 %conv5, i64* @csmith_sink_, align 1 + %4 = load i16, i16* @g_313_4, align 1 + %conv6 = sext i16 %4 to i64 + store i64 %conv6, i64* @csmith_sink_, align 1 + %5 = load i16, i16* @g_313_5, align 1 + %conv7 = sext i16 %5 to i64 + store i64 %conv7, i64* @csmith_sink_, align 1 + %6 = load i16, i16* @g_313_6, align 1 + %conv8 = sext i16 %6 to i64 + store i64 %conv8, i64* @csmith_sink_, align 1 + %7 = load i64, i64* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 0), align 1 + store i64 %7, i64* @csmith_sink_, align 1 + %8 = load i16, i16* @g_316_1_0, align 1 + %conv9 = sext i16 %8 to i64 + store i64 %conv9, i64* @csmith_sink_, align 1 + %9 = load i32, i32* @g_316_1_1, align 1 + %conv10 = zext i32 %9 to i64 + store i64 %conv10, i64* @csmith_sink_, align 1 + %10 = load i16, i16* @g_316_1_2, align 1 + %conv11 = zext i16 %10 to i64 + store i64 %conv11, i64* @csmith_sink_, align 1 + %11 = load i32, i32* @g_316_1_3, align 1 + %conv12 = sext i32 %11 to i64 + store i64 %conv12, i64* @csmith_sink_, align 1 + %12 = load i32, i32* @g_316_1_4, align 1 + %conv13 = sext i32 %12 to i64 + store i64 %conv13, i64* @csmith_sink_, align 1 + %13 = load i16, i16* @g_316_1_5, align 1 + %conv14 = zext i16 %13 to i64 + store i64 %conv14, i64* @csmith_sink_, align 1 + %14 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 2, i32 0), align 1 + %conv15 = sext i16 %14 to i64 + store i64 %conv15, i64* @csmith_sink_, align 1 + %15 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 2, i32 1), align 1 + %conv16 = zext i32 %15 to i64 + store i64 %conv16, i64* @csmith_sink_, align 1 + %16 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 2, i32 2), align 1 + %conv17 = sext i32 %16 to i64 + store i64 %conv17, i64* @csmith_sink_, align 1 + %17 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 2, i32 3), align 1 + %conv18 = zext i32 %17 to i64 + store i64 %conv18, i64* @csmith_sink_, align 1 + %18 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 2, i32 4), align 1 + %conv19 = sext i16 %18 to i64 + store i64 %conv19, i64* @csmith_sink_, align 1 + %19 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 2, i32 5), align 1 + %conv20 = sext i16 %19 to i64 + store i64 %conv20, i64* @csmith_sink_, align 1 + %20 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_316, i32 0, i32 2, i32 6), align 1 + %conv21 = sext i16 %20 to i64 + store i64 %conv21, i64* @csmith_sink_, align 1 + %21 = load i16, i16* @g_316_3_0, align 1 + %conv22 = sext i16 %21 to i64 + store i64 %conv22, i64* @csmith_sink_, align 1 + %22 = load i32, i32* @g_316_3_1, align 1 + %conv23 = zext i32 %22 to i64 + store i64 %conv23, i64* @csmith_sink_, align 1 + %23 = load i32, i32* @g_316_3_2, align 1 + %conv24 = sext i32 %23 to i64 + store i64 %conv24, i64* @csmith_sink_, align 1 + %24 = load i32, i32* @g_316_3_3, align 1 + %conv25 = zext i32 %24 to i64 + store i64 %conv25, i64* @csmith_sink_, align 1 + %25 = load i16, i16* @g_316_3_4, align 1 + %conv26 = sext i16 %25 to i64 + store i64 %conv26, i64* @csmith_sink_, align 1 + %26 = load i16, i16* @g_316_3_5, align 1 + %conv27 = sext i16 %26 to i64 + store i64 %conv27, i64* @csmith_sink_, align 1 + %27 = load i16, i16* @g_316_3_6, align 1 + %conv28 = sext i16 %27 to i64 + store i64 %conv28, i64* @csmith_sink_, align 1 + %28 = load i16, i16* @g_316_4_0, align 1 + %conv29 = sext i16 %28 to i64 + store i64 %conv29, i64* @csmith_sink_, align 1 + %29 = load i32, i32* @g_316_4_1, align 1 + %conv30 = zext i32 %29 to i64 + store i64 %conv30, i64* @csmith_sink_, align 1 + %30 = load i32, i32* @g_316_4_2, align 1 + %conv31 = sext i32 %30 to i64 + store i64 %conv31, i64* @csmith_sink_, align 1 + %31 = load i32, i32* @g_316_4_3, align 1 + %conv32 = zext i32 %31 to i64 + store i64 %conv32, i64* @csmith_sink_, align 1 + %32 = load i16, i16* @g_316_4_4, align 1 + %conv33 = sext i16 %32 to i64 + store i64 %conv33, i64* @csmith_sink_, align 1 + %33 = load i16, i16* @g_316_4_5, align 1 + %conv34 = sext i16 %33 to i64 + store i64 %conv34, i64* @csmith_sink_, align 1 + %34 = load i16, i16* @g_316_4_6, align 1 + %conv35 = sext i16 %34 to i64 + store i64 %conv35, i64* @csmith_sink_, align 1 + %35 = load i32, i32* @g_316_5_0, align 1 + %conv36 = sext i32 %35 to i64 + store i64 %conv36, i64* @csmith_sink_, align 1 + %36 = load i16, i16* @g_316_5_1, align 1 + %conv37 = zext i16 %36 to i64 + store i64 %conv37, i64* @csmith_sink_, align 1 + %37 = load i16, i16* @g_316_6, align 1 + %conv38 = zext i16 %37 to i64 + store i64 %conv38, i64* @csmith_sink_, align 1 + %38 = load i32, i32* @g_316_7, align 1 + %conv39 = sext i32 %38 to i64 + store i64 %conv39, i64* @csmith_sink_, align 1 + %39 = load i64, i64* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 0), align 1 + store i64 %39, i64* @csmith_sink_, align 1 + %40 = load i16, i16* @g_317_1_0, align 1 + %conv40 = sext i16 %40 to i64 + store i64 %conv40, i64* @csmith_sink_, align 1 + %41 = load i32, i32* @g_317_1_1, align 1 + %conv41 = zext i32 %41 to i64 + store i64 %conv41, i64* @csmith_sink_, align 1 + %42 = load i16, i16* @g_317_1_2, align 1 + %conv42 = zext i16 %42 to i64 + store i64 %conv42, i64* @csmith_sink_, align 1 + %43 = load i32, i32* @g_317_1_3, align 1 + %conv43 = sext i32 %43 to i64 + store i64 %conv43, i64* @csmith_sink_, align 1 + %44 = load i32, i32* @g_317_1_4, align 1 + %conv44 = sext i32 %44 to i64 + store i64 %conv44, i64* @csmith_sink_, align 1 + %45 = load i16, i16* @g_317_1_5, align 1 + %conv45 = zext i16 %45 to i64 + store i64 %conv45, i64* @csmith_sink_, align 1 + %46 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 2, i32 0), align 1 + %conv46 = sext i16 %46 to i64 + store i64 %conv46, i64* @csmith_sink_, align 1 + %47 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 2, i32 1), align 1 + %conv47 = zext i32 %47 to i64 + store i64 %conv47, i64* @csmith_sink_, align 1 + %48 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 2, i32 2), align 1 + %conv48 = sext i32 %48 to i64 + store i64 %conv48, i64* @csmith_sink_, align 1 + %49 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 2, i32 3), align 1 + %conv49 = zext i32 %49 to i64 + store i64 %conv49, i64* @csmith_sink_, align 1 + %50 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 2, i32 4), align 1 + %conv50 = sext i16 %50 to i64 + store i64 %conv50, i64* @csmith_sink_, align 1 + %51 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 2, i32 5), align 1 + %conv51 = sext i16 %51 to i64 + store i64 %conv51, i64* @csmith_sink_, align 1 + %52 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_317, i32 0, i32 2, i32 6), align 1 + %conv52 = sext i16 %52 to i64 + store i64 %conv52, i64* @csmith_sink_, align 1 + %53 = load i16, i16* @g_317_3_0, align 1 + %conv53 = sext i16 %53 to i64 + store i64 %conv53, i64* @csmith_sink_, align 1 + %54 = load i32, i32* @g_317_3_1, align 1 + %conv54 = zext i32 %54 to i64 + store i64 %conv54, i64* @csmith_sink_, align 1 + %55 = load i32, i32* @g_317_3_2, align 1 + %conv55 = sext i32 %55 to i64 + store i64 %conv55, i64* @csmith_sink_, align 1 + %56 = load i32, i32* @g_317_3_3, align 1 + %conv56 = zext i32 %56 to i64 + store i64 %conv56, i64* @csmith_sink_, align 1 + %57 = load i16, i16* @g_317_3_4, align 1 + %conv57 = sext i16 %57 to i64 + store i64 %conv57, i64* @csmith_sink_, align 1 + %58 = load i16, i16* @g_317_3_5, align 1 + %conv58 = sext i16 %58 to i64 + store i64 %conv58, i64* @csmith_sink_, align 1 + %59 = load i16, i16* @g_317_3_6, align 1 + %conv59 = sext i16 %59 to i64 + store i64 %conv59, i64* @csmith_sink_, align 1 + %60 = load i16, i16* @g_317_4_0, align 1 + %conv60 = sext i16 %60 to i64 + store i64 %conv60, i64* @csmith_sink_, align 1 + %61 = load i32, i32* @g_317_4_1, align 1 + %conv61 = zext i32 %61 to i64 + store i64 %conv61, i64* @csmith_sink_, align 1 + %62 = load i32, i32* @g_317_4_2, align 1 + %conv62 = sext i32 %62 to i64 + store i64 %conv62, i64* @csmith_sink_, align 1 + %63 = load i32, i32* @g_317_4_3, align 1 + %conv63 = zext i32 %63 to i64 + store i64 %conv63, i64* @csmith_sink_, align 1 + %64 = load i16, i16* @g_317_4_4, align 1 + %conv64 = sext i16 %64 to i64 + store i64 %conv64, i64* @csmith_sink_, align 1 + %65 = load i16, i16* @g_317_4_5, align 1 + %conv65 = sext i16 %65 to i64 + store i64 %conv65, i64* @csmith_sink_, align 1 + %66 = load i16, i16* @g_317_4_6, align 1 + %conv66 = sext i16 %66 to i64 + store i64 %conv66, i64* @csmith_sink_, align 1 + %67 = load i32, i32* @g_317_5_0, align 1 + %conv67 = sext i32 %67 to i64 + store i64 %conv67, i64* @csmith_sink_, align 1 + %68 = load i16, i16* @g_317_5_1, align 1 + %conv68 = zext i16 %68 to i64 + store i64 %conv68, i64* @csmith_sink_, align 1 + %69 = load i16, i16* @g_317_6, align 1 + %conv69 = zext i16 %69 to i64 + store i64 %conv69, i64* @csmith_sink_, align 1 + %70 = load i32, i32* @g_317_7, align 1 + %conv70 = sext i32 %70 to i64 + store i64 %conv70, i64* @csmith_sink_, align 1 + %71 = load i64, i64* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 0), align 1 + store i64 %71, i64* @csmith_sink_, align 1 + %72 = load i16, i16* @g_318_1_0, align 1 + %conv71 = sext i16 %72 to i64 + store i64 %conv71, i64* @csmith_sink_, align 1 + %73 = load i32, i32* @g_318_1_1, align 1 + %conv72 = zext i32 %73 to i64 + store i64 %conv72, i64* @csmith_sink_, align 1 + %74 = load i16, i16* @g_318_1_2, align 1 + %conv73 = zext i16 %74 to i64 + store i64 %conv73, i64* @csmith_sink_, align 1 + %75 = load i32, i32* @g_318_1_3, align 1 + %conv74 = sext i32 %75 to i64 + store i64 %conv74, i64* @csmith_sink_, align 1 + %76 = load i32, i32* @g_318_1_4, align 1 + %conv75 = sext i32 %76 to i64 + store i64 %conv75, i64* @csmith_sink_, align 1 + %77 = load i16, i16* @g_318_1_5, align 1 + %conv76 = zext i16 %77 to i64 + store i64 %conv76, i64* @csmith_sink_, align 1 + %78 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 2, i32 0), align 1 + %conv77 = sext i16 %78 to i64 + store i64 %conv77, i64* @csmith_sink_, align 1 + %79 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 2, i32 1), align 1 + %conv78 = zext i32 %79 to i64 + store i64 %conv78, i64* @csmith_sink_, align 1 + %80 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 2, i32 2), align 1 + %conv79 = sext i32 %80 to i64 + store i64 %conv79, i64* @csmith_sink_, align 1 + %81 = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 2, i32 3), align 1 + %conv80 = zext i32 %81 to i64 + store i64 %conv80, i64* @csmith_sink_, align 1 + %82 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 2, i32 4), align 1 + %conv81 = sext i16 %82 to i64 + store i64 %conv81, i64* @csmith_sink_, align 1 + %83 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 2, i32 5), align 1 + %conv82 = sext i16 %83 to i64 + store i64 %conv82, i64* @csmith_sink_, align 1 + %84 = load i16, i16* getelementptr inbounds (%struct.S3, %struct.S3* @g_318, i32 0, i32 2, i32 6), align 1 + %conv83 = sext i16 %84 to i64 + store i64 %conv83, i64* @csmith_sink_, align 1 + %85 = load i16, i16* @g_318_3_0, align 1 + %conv84 = sext i16 %85 to i64 + store i64 %conv84, i64* @csmith_sink_, align 1 + %86 = load i32, i32* @g_318_3_1, align 1 + %conv85 = zext i32 %86 to i64 + store i64 %conv85, i64* @csmith_sink_, align 1 + %87 = load i32, i32* @g_318_3_2, align 1 + %conv86 = sext i32 %87 to i64 + store i64 %conv86, i64* @csmith_sink_, align 1 + %88 = load i32, i32* @g_318_3_3, align 1 + %conv87 = zext i32 %88 to i64 + store i64 %conv87, i64* @csmith_sink_, align 1 + %89 = load i16, i16* @g_318_3_4, align 1 + %conv88 = sext i16 %89 to i64 + store i64 %conv88, i64* @csmith_sink_, align 1 + %90 = load i16, i16* @g_318_3_5, align 1 + %conv89 = sext i16 %90 to i64 + store i64 %conv89, i64* @csmith_sink_, align 1 + %91 = load i16, i16* @g_318_3_6, align 1 + %conv90 = sext i16 %91 to i64 + store i64 %conv90, i64* @csmith_sink_, align 1 + %92 = load i16, i16* @g_318_4_0, align 1 + %conv91 = sext i16 %92 to i64 + store i64 %conv91, i64* @csmith_sink_, align 1 + %93 = load i32, i32* @g_318_4_1, align 1 + %conv92 = zext i32 %93 to i64 + store i64 %conv92, i64* @csmith_sink_, align 1 + %94 = load i32, i32* @g_318_4_2, align 1 + %conv93 = sext i32 %94 to i64 + store i64 %conv93, i64* @csmith_sink_, align 1 + %95 = load i32, i32* @g_318_4_3, align 1 + %conv94 = zext i32 %95 to i64 + store i64 %conv94, i64* @csmith_sink_, align 1 + %96 = load i16, i16* @g_318_4_4, align 1 + %conv95 = sext i16 %96 to i64 + store i64 %conv95, i64* @csmith_sink_, align 1 + %97 = load i16, i16* @g_318_4_5, align 1 + %conv96 = sext i16 %97 to i64 + store i64 %conv96, i64* @csmith_sink_, align 1 + store i64 0, i64* @csmith_sink_, align 1 + ret i16 0 +} +