@@ -70,66 +70,42 @@ __INT32_TYPE__ test4(__SIZE_TYPE__ a) {
7070
7171struct Empty {};
7272struct MultiArgs { __INT64_TYPE__ a , b ;};
73- // Struct parameter doesn't take up an IR parameter, 'i' takes up 2 .
73+ // Struct parameter doesn't take up an IR parameter, 'i' takes up 1 .
7474// Truncation to i64 is permissible, since alignments of greater than 2^64 are insane.
7575__INT32_TYPE__ * m3 (struct Empty s , __int128_t i ) __attribute__((alloc_align (2 )));
7676// CHECK-LABEL: @test5(
7777// CHECK-NEXT: entry:
78- // CHECK-NEXT: [[A:%.*]] = alloca i128, align 16
7978// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i128, align 16
8079// CHECK-NEXT: [[E:%.*]] = alloca [[STRUCT_EMPTY:%.*]], align 1
81- // CHECK-NEXT: [[COERCE:%.*]] = alloca i128, align 16
82- // CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[A]], i32 0, i32 0
83- // CHECK-NEXT: store i64 [[A_COERCE0:%.*]], ptr [[TMP0]], align 16
84- // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[A]], i32 0, i32 1
85- // CHECK-NEXT: store i64 [[A_COERCE1:%.*]], ptr [[TMP1]], align 8
86- // CHECK-NEXT: [[A1:%.*]] = load i128, ptr [[A]], align 16
87- // CHECK-NEXT: store i128 [[A1]], ptr [[A_ADDR]], align 16
88- // CHECK-NEXT: [[TMP2:%.*]] = load i128, ptr [[A_ADDR]], align 16
89- // CHECK-NEXT: store i128 [[TMP2]], ptr [[COERCE]], align 16
90- // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[COERCE]], i32 0, i32 0
91- // CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 16
92- // CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[COERCE]], i32 0, i32 1
93- // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
94- // CHECK-NEXT: [[CALL:%.*]] = call ptr @m3(i64 noundef [[TMP4]], i64 noundef [[TMP6]])
95- // CHECK-NEXT: [[CASTED_ALIGN:%.*]] = trunc i128 [[TMP2]] to i64
80+ // CHECK-NEXT: store i128 [[A:%.*]], ptr [[A_ADDR]], align 16
81+ // CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A_ADDR]], align 16
82+ // CHECK-NEXT: [[CALL:%.*]] = call ptr @m3(i128 noundef [[TMP0]])
83+ // CHECK-NEXT: [[CASTED_ALIGN:%.*]] = trunc i128 [[TMP0]] to i64
9684// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[CALL]], i64 [[CASTED_ALIGN]]) ]
97- // CHECK-NEXT: [[TMP7 :%.*]] = load i32, ptr [[CALL]], align 4
98- // CHECK-NEXT: ret i32 [[TMP7 ]]
85+ // CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[CALL]], align 4
86+ // CHECK-NEXT: ret i32 [[TMP1 ]]
9987//
10088__INT32_TYPE__ test5 (__int128_t a ) {
10189 struct Empty e ;
10290 return * m3 (e , a );
10391}
104- // Struct parameter takes up 2 parameters, 'i' takes up 2 .
92+ // Struct parameter takes up 2 parameters, 'i' takes up 1 .
10593__INT32_TYPE__ * m4 (struct MultiArgs s , __int128_t i ) __attribute__((alloc_align (2 )));
10694// CHECK-LABEL: @test6(
10795// CHECK-NEXT: entry:
108- // CHECK-NEXT: [[A:%.*]] = alloca i128, align 16
10996// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i128, align 16
11097// CHECK-NEXT: [[E:%.*]] = alloca [[STRUCT_MULTIARGS:%.*]], align 8
111- // CHECK-NEXT: [[COERCE:%.*]] = alloca i128, align 16
112- // CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[A]], i32 0, i32 0
113- // CHECK-NEXT: store i64 [[A_COERCE0:%.*]], ptr [[TMP0]], align 16
114- // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[A]], i32 0, i32 1
115- // CHECK-NEXT: store i64 [[A_COERCE1:%.*]], ptr [[TMP1]], align 8
116- // CHECK-NEXT: [[A1:%.*]] = load i128, ptr [[A]], align 16
117- // CHECK-NEXT: store i128 [[A1]], ptr [[A_ADDR]], align 16
118- // CHECK-NEXT: [[TMP2:%.*]] = load i128, ptr [[A_ADDR]], align 16
119- // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[E]], i32 0, i32 0
98+ // CHECK-NEXT: store i128 [[A:%.*]], ptr [[A_ADDR]], align 16
99+ // CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A_ADDR]], align 16
100+ // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[E]], i32 0, i32 0
101+ // CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[TMP1]], align 8
102+ // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[E]], i32 0, i32 1
120103// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 8
121- // CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[E]], i32 0, i32 1
122- // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
123- // CHECK-NEXT: store i128 [[TMP2]], ptr [[COERCE]], align 16
124- // CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[COERCE]], i32 0, i32 0
125- // CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr [[TMP7]], align 16
126- // CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[COERCE]], i32 0, i32 1
127- // CHECK-NEXT: [[TMP10:%.*]] = load i64, ptr [[TMP9]], align 8
128- // CHECK-NEXT: [[CALL:%.*]] = call ptr @m4(i64 [[TMP4]], i64 [[TMP6]], i64 noundef [[TMP8]], i64 noundef [[TMP10]])
129- // CHECK-NEXT: [[CASTED_ALIGN:%.*]] = trunc i128 [[TMP2]] to i64
104+ // CHECK-NEXT: [[CALL:%.*]] = call ptr @m4(i64 [[TMP2]], i64 [[TMP4]], i128 noundef [[TMP0]])
105+ // CHECK-NEXT: [[CASTED_ALIGN:%.*]] = trunc i128 [[TMP0]] to i64
130106// CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[CALL]], i64 [[CASTED_ALIGN]]) ]
131- // CHECK-NEXT: [[TMP11 :%.*]] = load i32, ptr [[CALL]], align 4
132- // CHECK-NEXT: ret i32 [[TMP11 ]]
107+ // CHECK-NEXT: [[TMP5 :%.*]] = load i32, ptr [[CALL]], align 4
108+ // CHECK-NEXT: ret i32 [[TMP5 ]]
133109//
134110__INT32_TYPE__ test6 (__int128_t a ) {
135111 struct MultiArgs e ;
0 commit comments