blob: 7f0c66f47ed17da94d2cc3723c85cdbdbc957314 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -O3 -S | FileCheck %s
target triple = "x86_64-unknown-linux-gnu"
%struct.data_t = type { [16 x i8] }
declare void @process6data_t(i64, i64)
declare void @process36data_tS_S_(i64, i64, i64, i64, i64, i64)
; See https://llvm.org/PR47023 for source examples.
; In all tests, we expect the i8 constant stores to get merged optimally
; (through SROA, combining, etc.) so that there are no store insts left.
define void @bad1() #0 {
; CHECK-LABEL: @bad1(
; CHECK-NEXT: call void @process6data_t(i64 21542142465, i64 0)
; CHECK-NEXT: ret void
;
%1 = alloca %struct.data_t, align 1
%2 = getelementptr inbounds %struct.data_t, %struct.data_t* %1, i32 0, i32 0
%3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0
store i8 1, i8* %3, align 1
%4 = getelementptr inbounds i8, i8* %3, i64 1
store i8 2, i8* %4, align 1
%5 = getelementptr inbounds i8, i8* %4, i64 1
store i8 3, i8* %5, align 1
%6 = getelementptr inbounds i8, i8* %5, i64 1
store i8 4, i8* %6, align 1
%7 = getelementptr inbounds i8, i8* %6, i64 1
store i8 5, i8* %7, align 1
%8 = getelementptr inbounds i8, i8* %7, i64 1
%9 = getelementptr inbounds i8, i8* %3, i64 16
br label %10
10: ; preds = %10, %0
%11 = phi i8* [ %8, %0 ], [ %12, %10 ]
store i8 0, i8* %11, align 1
%12 = getelementptr inbounds i8, i8* %11, i64 1
%13 = icmp eq i8* %12, %9
br i1 %13, label %14, label %10
14: ; preds = %10
%15 = bitcast %struct.data_t* %1 to { i64, i64 }*
%16 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %15, i32 0, i32 0
%17 = load i64, i64* %16, align 1
%18 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %15, i32 0, i32 1
%19 = load i64, i64* %18, align 1
call void @process6data_t(i64 %17, i64 %19)
ret void
}
define void @bad2() #0 {
; CHECK-LABEL: @bad2(
; CHECK-NEXT: call void @process6data_t(i64 216736853120975361, i64 1411785848587524)
; CHECK-NEXT: ret void
;
%1 = alloca %struct.data_t, align 1
%2 = getelementptr inbounds %struct.data_t, %struct.data_t* %1, i32 0, i32 0
%3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0
store i8 1, i8* %3, align 1
%4 = getelementptr inbounds i8, i8* %3, i64 1
store i8 2, i8* %4, align 1
%5 = getelementptr inbounds i8, i8* %4, i64 1
store i8 3, i8* %5, align 1
%6 = getelementptr inbounds i8, i8* %5, i64 1
store i8 4, i8* %6, align 1
%7 = getelementptr inbounds i8, i8* %6, i64 1
store i8 5, i8* %7, align 1
%8 = getelementptr inbounds i8, i8* %7, i64 1
store i8 1, i8* %8, align 1
%9 = getelementptr inbounds i8, i8* %8, i64 1
store i8 2, i8* %9, align 1
%10 = getelementptr inbounds i8, i8* %9, i64 1
store i8 3, i8* %10, align 1
%11 = getelementptr inbounds i8, i8* %10, i64 1
store i8 4, i8* %11, align 1
%12 = getelementptr inbounds i8, i8* %11, i64 1
store i8 5, i8* %12, align 1
%13 = getelementptr inbounds i8, i8* %12, i64 1
store i8 1, i8* %13, align 1
%14 = getelementptr inbounds i8, i8* %13, i64 1
store i8 2, i8* %14, align 1
%15 = getelementptr inbounds i8, i8* %14, i64 1
store i8 3, i8* %15, align 1
%16 = getelementptr inbounds i8, i8* %15, i64 1
store i8 4, i8* %16, align 1
%17 = getelementptr inbounds i8, i8* %16, i64 1
store i8 5, i8* %17, align 1
%18 = getelementptr inbounds i8, i8* %17, i64 1
%19 = getelementptr inbounds i8, i8* %3, i64 16
br label %20
20: ; preds = %20, %0
%21 = phi i8* [ %18, %0 ], [ %22, %20 ]
store i8 0, i8* %21, align 1
%22 = getelementptr inbounds i8, i8* %21, i64 1
%23 = icmp eq i8* %22, %19
br i1 %23, label %24, label %20
24: ; preds = %20
%25 = bitcast %struct.data_t* %1 to { i64, i64 }*
%26 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %25, i32 0, i32 0
%27 = load i64, i64* %26, align 1
%28 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %25, i32 0, i32 1
%29 = load i64, i64* %28, align 1
call void @process6data_t(i64 %27, i64 %29)
ret void
}
define void @bad3() {
; CHECK-LABEL: @bad3(
; CHECK-NEXT: call void @process36data_tS_S_(i64 21542142465, i64 0, i64 723401749922909195, i64 723401728380766730, i64 1446803478303675925, i64 5651576002974730)
; CHECK-NEXT: ret void
;
%1 = alloca %struct.data_t, align 1
%2 = alloca %struct.data_t, align 1
%3 = alloca %struct.data_t, align 1
%4 = getelementptr inbounds %struct.data_t, %struct.data_t* %1, i32 0, i32 0
%5 = getelementptr inbounds [16 x i8], [16 x i8]* %4, i64 0, i64 0
store i8 1, i8* %5, align 1
%6 = getelementptr inbounds i8, i8* %5, i64 1
store i8 2, i8* %6, align 1
%7 = getelementptr inbounds i8, i8* %6, i64 1
store i8 3, i8* %7, align 1
%8 = getelementptr inbounds i8, i8* %7, i64 1
store i8 4, i8* %8, align 1
%9 = getelementptr inbounds i8, i8* %8, i64 1
store i8 5, i8* %9, align 1
%10 = getelementptr inbounds i8, i8* %9, i64 1
store i8 0, i8* %10, align 1
%11 = getelementptr inbounds i8, i8* %10, i64 1
store i8 0, i8* %11, align 1
%12 = getelementptr inbounds i8, i8* %11, i64 1
store i8 0, i8* %12, align 1
%13 = getelementptr inbounds i8, i8* %12, i64 1
store i8 0, i8* %13, align 1
%14 = getelementptr inbounds i8, i8* %13, i64 1
store i8 0, i8* %14, align 1
%15 = getelementptr inbounds i8, i8* %14, i64 1
store i8 0, i8* %15, align 1
%16 = getelementptr inbounds i8, i8* %15, i64 1
store i8 0, i8* %16, align 1
%17 = getelementptr inbounds i8, i8* %16, i64 1
store i8 0, i8* %17, align 1
%18 = getelementptr inbounds i8, i8* %17, i64 1
store i8 0, i8* %18, align 1
%19 = getelementptr inbounds i8, i8* %18, i64 1
store i8 0, i8* %19, align 1
%20 = getelementptr inbounds i8, i8* %19, i64 1
store i8 0, i8* %20, align 1
%21 = getelementptr inbounds %struct.data_t, %struct.data_t* %2, i32 0, i32 0
%22 = getelementptr inbounds [16 x i8], [16 x i8]* %21, i64 0, i64 0
store i8 11, i8* %22, align 1
%23 = getelementptr inbounds i8, i8* %22, i64 1
store i8 12, i8* %23, align 1
%24 = getelementptr inbounds i8, i8* %23, i64 1
store i8 13, i8* %24, align 1
%25 = getelementptr inbounds i8, i8* %24, i64 1
store i8 14, i8* %25, align 1
%26 = getelementptr inbounds i8, i8* %25, i64 1
store i8 15, i8* %26, align 1
%27 = getelementptr inbounds i8, i8* %26, i64 1
store i8 10, i8* %27, align 1
%28 = getelementptr inbounds i8, i8* %27, i64 1
store i8 10, i8* %28, align 1
%29 = getelementptr inbounds i8, i8* %28, i64 1
store i8 10, i8* %29, align 1
%30 = getelementptr inbounds i8, i8* %29, i64 1
store i8 10, i8* %30, align 1
%31 = getelementptr inbounds i8, i8* %30, i64 1
store i8 10, i8* %31, align 1
%32 = getelementptr inbounds i8, i8* %31, i64 1
store i8 10, i8* %32, align 1
%33 = getelementptr inbounds i8, i8* %32, i64 1
store i8 10, i8* %33, align 1
%34 = getelementptr inbounds i8, i8* %33, i64 1
store i8 10, i8* %34, align 1
%35 = getelementptr inbounds i8, i8* %34, i64 1
store i8 10, i8* %35, align 1
%36 = getelementptr inbounds i8, i8* %35, i64 1
store i8 10, i8* %36, align 1
%37 = getelementptr inbounds i8, i8* %36, i64 1
store i8 10, i8* %37, align 1
%38 = getelementptr inbounds %struct.data_t, %struct.data_t* %3, i32 0, i32 0
%39 = getelementptr inbounds [16 x i8], [16 x i8]* %38, i64 0, i64 0
store i8 21, i8* %39, align 1
%40 = getelementptr inbounds i8, i8* %39, i64 1
store i8 22, i8* %40, align 1
%41 = getelementptr inbounds i8, i8* %40, i64 1
store i8 23, i8* %41, align 1
%42 = getelementptr inbounds i8, i8* %41, i64 1
store i8 24, i8* %42, align 1
%43 = getelementptr inbounds i8, i8* %42, i64 1
store i8 25, i8* %43, align 1
%44 = getelementptr inbounds i8, i8* %43, i64 1
store i8 20, i8* %44, align 1
%45 = getelementptr inbounds i8, i8* %44, i64 1
store i8 20, i8* %45, align 1
%46 = getelementptr inbounds i8, i8* %45, i64 1
store i8 20, i8* %46, align 1
%47 = getelementptr inbounds i8, i8* %46, i64 1
store i8 10, i8* %47, align 1
%48 = getelementptr inbounds i8, i8* %47, i64 1
store i8 20, i8* %48, align 1
%49 = getelementptr inbounds i8, i8* %48, i64 1
store i8 20, i8* %49, align 1
%50 = getelementptr inbounds i8, i8* %49, i64 1
store i8 20, i8* %50, align 1
%51 = getelementptr inbounds i8, i8* %50, i64 1
store i8 20, i8* %51, align 1
%52 = getelementptr inbounds i8, i8* %51, i64 1
store i8 20, i8* %52, align 1
%53 = getelementptr inbounds i8, i8* %52, i64 1
store i8 20, i8* %53, align 1
%54 = getelementptr inbounds i8, i8* %53, i64 1
%55 = getelementptr inbounds i8, i8* %39, i64 16
br label %56
56: ; preds = %56, %0
%57 = phi i8* [ %54, %0 ], [ %58, %56 ]
store i8 0, i8* %57, align 1
%58 = getelementptr inbounds i8, i8* %57, i64 1
%59 = icmp eq i8* %58, %55
br i1 %59, label %60, label %56
60: ; preds = %56
%61 = bitcast %struct.data_t* %1 to { i64, i64 }*
%62 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %61, i32 0, i32 0
%63 = load i64, i64* %62, align 1
%64 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %61, i32 0, i32 1
%65 = load i64, i64* %64, align 1
%66 = bitcast %struct.data_t* %2 to { i64, i64 }*
%67 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %66, i32 0, i32 0
%68 = load i64, i64* %67, align 1
%69 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %66, i32 0, i32 1
%70 = load i64, i64* %69, align 1
%71 = bitcast %struct.data_t* %3 to { i64, i64 }*
%72 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %71, i32 0, i32 0
%73 = load i64, i64* %72, align 1
%74 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %71, i32 0, i32 1
%75 = load i64, i64* %74, align 1
call void @process36data_tS_S_(i64 %63, i64 %65, i64 %68, i64 %70, i64 %73, i64 %75)
ret void
}
define void @bad4() #0 {
; CHECK-LABEL: @bad4(
; CHECK-NEXT: tail call void @process36data_tS_S_(i64 21542142465, i64 0, i64 723401749922909195, i64 723401728380766730, i64 1446803478303675925, i64 798285110420182026)
; CHECK-NEXT: ret void
;
%1 = alloca %struct.data_t, align 1
%2 = alloca %struct.data_t, align 1
%3 = alloca %struct.data_t, align 1
%4 = getelementptr inbounds %struct.data_t, %struct.data_t* %1, i32 0, i32 0
%5 = getelementptr inbounds [16 x i8], [16 x i8]* %4, i64 0, i64 0
store i8 1, i8* %5, align 1
%6 = getelementptr inbounds i8, i8* %5, i64 1
store i8 2, i8* %6, align 1
%7 = getelementptr inbounds i8, i8* %6, i64 1
store i8 3, i8* %7, align 1
%8 = getelementptr inbounds i8, i8* %7, i64 1
store i8 4, i8* %8, align 1
%9 = getelementptr inbounds i8, i8* %8, i64 1
store i8 5, i8* %9, align 1
%10 = getelementptr inbounds i8, i8* %9, i64 1
store i8 0, i8* %10, align 1
%11 = getelementptr inbounds i8, i8* %10, i64 1
store i8 0, i8* %11, align 1
%12 = getelementptr inbounds i8, i8* %11, i64 1
store i8 0, i8* %12, align 1
%13 = getelementptr inbounds i8, i8* %12, i64 1
store i8 0, i8* %13, align 1
%14 = getelementptr inbounds i8, i8* %13, i64 1
store i8 0, i8* %14, align 1
%15 = getelementptr inbounds i8, i8* %14, i64 1
store i8 0, i8* %15, align 1
%16 = getelementptr inbounds i8, i8* %15, i64 1
store i8 0, i8* %16, align 1
%17 = getelementptr inbounds i8, i8* %16, i64 1
store i8 0, i8* %17, align 1
%18 = getelementptr inbounds i8, i8* %17, i64 1
store i8 0, i8* %18, align 1
%19 = getelementptr inbounds i8, i8* %18, i64 1
store i8 0, i8* %19, align 1
%20 = getelementptr inbounds i8, i8* %19, i64 1
store i8 0, i8* %20, align 1
%21 = getelementptr inbounds %struct.data_t, %struct.data_t* %2, i32 0, i32 0
%22 = getelementptr inbounds [16 x i8], [16 x i8]* %21, i64 0, i64 0
store i8 11, i8* %22, align 1
%23 = getelementptr inbounds i8, i8* %22, i64 1
store i8 12, i8* %23, align 1
%24 = getelementptr inbounds i8, i8* %23, i64 1
store i8 13, i8* %24, align 1
%25 = getelementptr inbounds i8, i8* %24, i64 1
store i8 14, i8* %25, align 1
%26 = getelementptr inbounds i8, i8* %25, i64 1
store i8 15, i8* %26, align 1
%27 = getelementptr inbounds i8, i8* %26, i64 1
store i8 10, i8* %27, align 1
%28 = getelementptr inbounds i8, i8* %27, i64 1
store i8 10, i8* %28, align 1
%29 = getelementptr inbounds i8, i8* %28, i64 1
store i8 10, i8* %29, align 1
%30 = getelementptr inbounds i8, i8* %29, i64 1
store i8 10, i8* %30, align 1
%31 = getelementptr inbounds i8, i8* %30, i64 1
store i8 10, i8* %31, align 1
%32 = getelementptr inbounds i8, i8* %31, i64 1
store i8 10, i8* %32, align 1
%33 = getelementptr inbounds i8, i8* %32, i64 1
store i8 10, i8* %33, align 1
%34 = getelementptr inbounds i8, i8* %33, i64 1
store i8 10, i8* %34, align 1
%35 = getelementptr inbounds i8, i8* %34, i64 1
store i8 10, i8* %35, align 1
%36 = getelementptr inbounds i8, i8* %35, i64 1
store i8 10, i8* %36, align 1
%37 = getelementptr inbounds i8, i8* %36, i64 1
store i8 10, i8* %37, align 1
%38 = getelementptr inbounds %struct.data_t, %struct.data_t* %3, i32 0, i32 0
%39 = getelementptr inbounds [16 x i8], [16 x i8]* %38, i64 0, i64 0
store i8 21, i8* %39, align 1
%40 = getelementptr inbounds i8, i8* %39, i64 1
store i8 22, i8* %40, align 1
%41 = getelementptr inbounds i8, i8* %40, i64 1
store i8 23, i8* %41, align 1
%42 = getelementptr inbounds i8, i8* %41, i64 1
store i8 24, i8* %42, align 1
%43 = getelementptr inbounds i8, i8* %42, i64 1
store i8 25, i8* %43, align 1
%44 = getelementptr inbounds i8, i8* %43, i64 1
store i8 20, i8* %44, align 1
%45 = getelementptr inbounds i8, i8* %44, i64 1
store i8 20, i8* %45, align 1
%46 = getelementptr inbounds i8, i8* %45, i64 1
store i8 20, i8* %46, align 1
%47 = getelementptr inbounds i8, i8* %46, i64 1
store i8 10, i8* %47, align 1
%48 = getelementptr inbounds i8, i8* %47, i64 1
store i8 20, i8* %48, align 1
%49 = getelementptr inbounds i8, i8* %48, i64 1
store i8 20, i8* %49, align 1
%50 = getelementptr inbounds i8, i8* %49, i64 1
store i8 20, i8* %50, align 1
%51 = getelementptr inbounds i8, i8* %50, i64 1
store i8 20, i8* %51, align 1
%52 = getelementptr inbounds i8, i8* %51, i64 1
store i8 20, i8* %52, align 1
%53 = getelementptr inbounds i8, i8* %52, i64 1
store i8 20, i8* %53, align 1
%54 = getelementptr inbounds i8, i8* %53, i64 1
store i8 11, i8* %54, align 1
%55 = bitcast %struct.data_t* %1 to { i64, i64 }*
%56 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %55, i32 0, i32 0
%57 = load i64, i64* %56, align 1
%58 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %55, i32 0, i32 1
%59 = load i64, i64* %58, align 1
%60 = bitcast %struct.data_t* %2 to { i64, i64 }*
%61 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %60, i32 0, i32 0
%62 = load i64, i64* %61, align 1
%63 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %60, i32 0, i32 1
%64 = load i64, i64* %63, align 1
%65 = bitcast %struct.data_t* %3 to { i64, i64 }*
%66 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %65, i32 0, i32 0
%67 = load i64, i64* %66, align 1
%68 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %65, i32 0, i32 1
%69 = load i64, i64* %68, align 1
call void @process36data_tS_S_(i64 %57, i64 %59, i64 %62, i64 %64, i64 %67, i64 %69)
ret void
}