@@ -70,66 +70,42 @@ __INT32_TYPE__ test4(__SIZE_TYPE__ a) {
70
70
71
71
struct Empty {};
72
72
struct 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 .
74
74
// Truncation to i64 is permissible, since alignments of greater than 2^64 are insane.
75
75
__INT32_TYPE__ * m3 (struct Empty s , __int128_t i ) __attribute__((alloc_align (2 )));
76
76
// CHECK-LABEL: @test5(
77
77
// CHECK-NEXT: entry:
78
- // CHECK-NEXT: [[A:%.*]] = alloca i128, align 16
79
78
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i128, align 16
80
79
// 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
96
84
// 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 ]]
99
87
//
100
88
__INT32_TYPE__ test5 (__int128_t a ) {
101
89
struct Empty e ;
102
90
return * m3 (e , a );
103
91
}
104
- // Struct parameter takes up 2 parameters, 'i' takes up 2 .
92
+ // Struct parameter takes up 2 parameters, 'i' takes up 1 .
105
93
__INT32_TYPE__ * m4 (struct MultiArgs s , __int128_t i ) __attribute__((alloc_align (2 )));
106
94
// CHECK-LABEL: @test6(
107
95
// CHECK-NEXT: entry:
108
- // CHECK-NEXT: [[A:%.*]] = alloca i128, align 16
109
96
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i128, align 16
110
97
// 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
120
103
// 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
130
106
// 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 ]]
133
109
//
134
110
__INT32_TYPE__ test6 (__int128_t a ) {
135
111
struct MultiArgs e ;
0 commit comments