372 lines
15 KiB
LLVM
372 lines
15 KiB
LLVM
; 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
|
|
}
|