1f658c1bfSPiyou Chen // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --include-generated-funcs --version 4 2f658c1bfSPiyou Chen // RUN: %clang_cc1 -triple riscv64-linux-gnu -target-feature +i -emit-llvm -o - %s | FileCheck %s 3f658c1bfSPiyou Chen 4f658c1bfSPiyou Chen __attribute__((target_version("arch=+v"))) int foo1(void) { return 1; } 5f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo1(void) { return 1; } 6f658c1bfSPiyou Chen 7f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo2(void) { return 1; } 8f658c1bfSPiyou Chen __attribute__((target_version("arch=+m"))) int foo2(void) { return 1; } 9f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo2(void) { return 1; } 10f658c1bfSPiyou Chen 11f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+c"))) int foo3(void) { return 1; } 12f658c1bfSPiyou Chen __attribute__((target_version("arch=+m"))) int foo3(void) { return 1; } 13f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo3(void) { return 1; } 14f658c1bfSPiyou Chen 15f658c1bfSPiyou Chen __attribute__((target_version("arch=+zba"))) int foo4(void) { return 1; } 16f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo4(void) { return 1; } 17f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba"))) int foo4(void) { return 1; } 18f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo4(void) { return 1; } 19f658c1bfSPiyou Chen 20f658c1bfSPiyou Chen __attribute__((target_version("arch=+zba"))) int foo5(void) { return 1; } 21f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba"))) int foo5(void) { return 1; } 22f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo5(void) { return 1; } 23f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo5(void) { return 1; } 24f658c1bfSPiyou Chen 25f658c1bfSPiyou Chen __attribute__((target_version("arch=+zba"))) int foo6(void) { return 1; } 26f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb"))) int foo6(void) { return 1; } 27f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba;priority=10"))) int foo6(void) { return 1; } 28f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo6(void) { return 1; } 29f658c1bfSPiyou Chen 30f658c1bfSPiyou Chen __attribute__((target_version("priority=8;arch=+zba"))) int foo7(void) { return 1; } 31f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb;priority=9"))) int foo7(void) { return 1; } 32f658c1bfSPiyou Chen __attribute__((target_version("arch=+zbb,+zba;priority=10"))) int foo7(void) { return 1; } 33f658c1bfSPiyou Chen __attribute__((target_version("default"))) int foo7(void) { return 1; } 34f658c1bfSPiyou Chen 35*c77e8361SPiyou Chen int bar() { return foo1() + foo2() + foo3() + foo4() + foo5() + foo6() + foo7(); } 36f658c1bfSPiyou Chen //. 37f658c1bfSPiyou Chen // CHECK: @__riscv_feature_bits = external dso_local global { i32, [2 x i64] } 38f658c1bfSPiyou Chen // CHECK: @foo1 = weak_odr ifunc i32 (), ptr @foo1.resolver 39f658c1bfSPiyou Chen // CHECK: @foo2 = weak_odr ifunc i32 (), ptr @foo2.resolver 40f658c1bfSPiyou Chen // CHECK: @foo3 = weak_odr ifunc i32 (), ptr @foo3.resolver 41f658c1bfSPiyou Chen // CHECK: @foo4 = weak_odr ifunc i32 (), ptr @foo4.resolver 42f658c1bfSPiyou Chen // CHECK: @foo5 = weak_odr ifunc i32 (), ptr @foo5.resolver 43f658c1bfSPiyou Chen // CHECK: @foo6 = weak_odr ifunc i32 (), ptr @foo6.resolver 44f658c1bfSPiyou Chen // CHECK: @foo7 = weak_odr ifunc i32 (), ptr @foo7.resolver 45f658c1bfSPiyou Chen //. 46f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo1._v( 47f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR0:[0-9]+]] { 48f658c1bfSPiyou Chen // CHECK-NEXT: entry: 49f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 50f658c1bfSPiyou Chen // 51f658c1bfSPiyou Chen // 52f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo1.default( 53f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1:[0-9]+]] { 54f658c1bfSPiyou Chen // CHECK-NEXT: entry: 55f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 56f658c1bfSPiyou Chen // 57f658c1bfSPiyou Chen // 58f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo2._zbb( 59f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2:[0-9]+]] { 60f658c1bfSPiyou Chen // CHECK-NEXT: entry: 61f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 62f658c1bfSPiyou Chen // 63f658c1bfSPiyou Chen // 64f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo2._m( 65f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR3:[0-9]+]] { 66f658c1bfSPiyou Chen // CHECK-NEXT: entry: 67f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 68f658c1bfSPiyou Chen // 69f658c1bfSPiyou Chen // 70f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo2.default( 71f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] { 72f658c1bfSPiyou Chen // CHECK-NEXT: entry: 73f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 74f658c1bfSPiyou Chen // 75f658c1bfSPiyou Chen // 76f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo3._c_zbb( 77f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR4:[0-9]+]] { 78f658c1bfSPiyou Chen // CHECK-NEXT: entry: 79f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 80f658c1bfSPiyou Chen // 81f658c1bfSPiyou Chen // 82f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo3._m( 83f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR3]] { 84f658c1bfSPiyou Chen // CHECK-NEXT: entry: 85f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 86f658c1bfSPiyou Chen // 87f658c1bfSPiyou Chen // 88f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo3.default( 89f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] { 90f658c1bfSPiyou Chen // CHECK-NEXT: entry: 91f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 92f658c1bfSPiyou Chen // 93f658c1bfSPiyou Chen // 94f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo4._zba( 95f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5:[0-9]+]] { 96f658c1bfSPiyou Chen // CHECK-NEXT: entry: 97f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 98f658c1bfSPiyou Chen // 99f658c1bfSPiyou Chen // 100f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo4._zbb( 101f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] { 102f658c1bfSPiyou Chen // CHECK-NEXT: entry: 103f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 104f658c1bfSPiyou Chen // 105f658c1bfSPiyou Chen // 106f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo4._zba_zbb( 107f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR6:[0-9]+]] { 108f658c1bfSPiyou Chen // CHECK-NEXT: entry: 109f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 110f658c1bfSPiyou Chen // 111f658c1bfSPiyou Chen // 112f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo4.default( 113f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] { 114f658c1bfSPiyou Chen // CHECK-NEXT: entry: 115f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 116f658c1bfSPiyou Chen // 117f658c1bfSPiyou Chen // 118f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo5._zba( 119f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5]] { 120f658c1bfSPiyou Chen // CHECK-NEXT: entry: 121f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 122f658c1bfSPiyou Chen // 123f658c1bfSPiyou Chen // 124f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo5._zba_zbb( 125f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR6]] { 126f658c1bfSPiyou Chen // CHECK-NEXT: entry: 127f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 128f658c1bfSPiyou Chen // 129f658c1bfSPiyou Chen // 130f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo5._zbb( 131f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] { 132f658c1bfSPiyou Chen // CHECK-NEXT: entry: 133f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 134f658c1bfSPiyou Chen // 135f658c1bfSPiyou Chen // 136f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo5.default( 137f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] { 138f658c1bfSPiyou Chen // CHECK-NEXT: entry: 139f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 140f658c1bfSPiyou Chen // 141f658c1bfSPiyou Chen // 142f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo6._zba( 143f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5]] { 144f658c1bfSPiyou Chen // CHECK-NEXT: entry: 145f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 146f658c1bfSPiyou Chen // 147f658c1bfSPiyou Chen // 148f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo6._zbb( 149f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] { 150f658c1bfSPiyou Chen // CHECK-NEXT: entry: 151f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 152f658c1bfSPiyou Chen // 153f658c1bfSPiyou Chen // 154f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo6._zba_zbb( 155f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR6]] { 156f658c1bfSPiyou Chen // CHECK-NEXT: entry: 157f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 158f658c1bfSPiyou Chen // 159f658c1bfSPiyou Chen // 160f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo6.default( 161f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] { 162f658c1bfSPiyou Chen // CHECK-NEXT: entry: 163f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 164f658c1bfSPiyou Chen // 165f658c1bfSPiyou Chen // 166f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo7._zba( 167f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR5]] { 168f658c1bfSPiyou Chen // CHECK-NEXT: entry: 169f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 170f658c1bfSPiyou Chen // 171f658c1bfSPiyou Chen // 172f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo7._zbb( 173f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR2]] { 174f658c1bfSPiyou Chen // CHECK-NEXT: entry: 175f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 176f658c1bfSPiyou Chen // 177f658c1bfSPiyou Chen // 178f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo7._zba_zbb( 179f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR6]] { 180f658c1bfSPiyou Chen // CHECK-NEXT: entry: 181f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 182f658c1bfSPiyou Chen // 183f658c1bfSPiyou Chen // 184f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @foo7.default( 185f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] { 186f658c1bfSPiyou Chen // CHECK-NEXT: entry: 187f658c1bfSPiyou Chen // CHECK-NEXT: ret i32 1 188f658c1bfSPiyou Chen // 189f658c1bfSPiyou Chen // 190f658c1bfSPiyou Chen // CHECK-LABEL: define dso_local signext i32 @bar( 191f658c1bfSPiyou Chen // CHECK-SAME: ) #[[ATTR1]] { 192f658c1bfSPiyou Chen // CHECK-NEXT: entry: 193f658c1bfSPiyou Chen // CHECK-NEXT: [[CALL:%.*]] = call signext i32 @foo1() 194f658c1bfSPiyou Chen // CHECK-NEXT: [[CALL1:%.*]] = call signext i32 @foo2() 195f658c1bfSPiyou Chen // CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]] 196f658c1bfSPiyou Chen // CHECK-NEXT: [[CALL2:%.*]] = call signext i32 @foo3() 197f658c1bfSPiyou Chen // CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[ADD]], [[CALL2]] 198f658c1bfSPiyou Chen // CHECK-NEXT: [[CALL4:%.*]] = call signext i32 @foo4() 199f658c1bfSPiyou Chen // CHECK-NEXT: [[ADD5:%.*]] = add nsw i32 [[ADD3]], [[CALL4]] 200f658c1bfSPiyou Chen // CHECK-NEXT: [[CALL6:%.*]] = call signext i32 @foo5() 201f658c1bfSPiyou Chen // CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[ADD5]], [[CALL6]] 202f658c1bfSPiyou Chen // CHECK-NEXT: [[CALL8:%.*]] = call signext i32 @foo6() 203f658c1bfSPiyou Chen // CHECK-NEXT: [[ADD9:%.*]] = add nsw i32 [[ADD7]], [[CALL8]] 204f658c1bfSPiyou Chen // CHECK-NEXT: [[CALL10:%.*]] = call signext i32 @foo7() 205f658c1bfSPiyou Chen // CHECK-NEXT: [[ADD11:%.*]] = add nsw i32 [[ADD9]], [[CALL10]] 206*c77e8361SPiyou Chen // CHECK-NEXT: ret i32 [[ADD11]] 207f658c1bfSPiyou Chen // 208f658c1bfSPiyou Chen // 209f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @foo1.resolver() comdat { 210f658c1bfSPiyou Chen // CHECK-NEXT: resolver_entry: 211f658c1bfSPiyou Chen // CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null) 212f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 213f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 2097152 214f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 2097152 215f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]] 216f658c1bfSPiyou Chen // CHECK: resolver_return: 217f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo1._v 218f658c1bfSPiyou Chen // CHECK: resolver_else: 219f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo1.default 220f658c1bfSPiyou Chen // 221f658c1bfSPiyou Chen // 222f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @foo2.resolver() comdat { 223f658c1bfSPiyou Chen // CHECK-NEXT: resolver_entry: 224f658c1bfSPiyou Chen // CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null) 225f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 226f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435456 227f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435456 228f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]] 229f658c1bfSPiyou Chen // CHECK: resolver_return: 230f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo2._zbb 231f658c1bfSPiyou Chen // CHECK: resolver_else: 232f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 233f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096 234f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096 235f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] 236f658c1bfSPiyou Chen // CHECK: resolver_return1: 237f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo2._m 238f658c1bfSPiyou Chen // CHECK: resolver_else2: 239f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo2.default 240f658c1bfSPiyou Chen // 241f658c1bfSPiyou Chen // 242f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @foo3.resolver() comdat { 243f658c1bfSPiyou Chen // CHECK-NEXT: resolver_entry: 244f658c1bfSPiyou Chen // CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null) 245f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 246f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 268435460 247f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 268435460 248f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]] 249f658c1bfSPiyou Chen // CHECK: resolver_return: 250f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo3._c_zbb 251f658c1bfSPiyou Chen // CHECK: resolver_else: 252f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 253f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 4096 254f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 4096 255f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] 256f658c1bfSPiyou Chen // CHECK: resolver_return1: 257f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo3._m 258f658c1bfSPiyou Chen // CHECK: resolver_else2: 259f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo3.default 260f658c1bfSPiyou Chen // 261f658c1bfSPiyou Chen // 262f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @foo4.resolver() comdat { 263f658c1bfSPiyou Chen // CHECK-NEXT: resolver_entry: 264f658c1bfSPiyou Chen // CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null) 265f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 266f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728 267f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728 268f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]] 269f658c1bfSPiyou Chen // CHECK: resolver_return: 270f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo4._zba 271f658c1bfSPiyou Chen // CHECK: resolver_else: 272f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 273f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456 274f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456 275f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] 276f658c1bfSPiyou Chen // CHECK: resolver_return1: 277f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo4._zbb 278f658c1bfSPiyou Chen // CHECK: resolver_else2: 279f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 280f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 402653184 281f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 402653184 282f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]] 283f658c1bfSPiyou Chen // CHECK: resolver_return3: 284f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo4._zba_zbb 285f658c1bfSPiyou Chen // CHECK: resolver_else4: 286f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo4.default 287f658c1bfSPiyou Chen // 288f658c1bfSPiyou Chen // 289f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @foo5.resolver() comdat { 290f658c1bfSPiyou Chen // CHECK-NEXT: resolver_entry: 291f658c1bfSPiyou Chen // CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null) 292f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 293f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 134217728 294f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 134217728 295f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]] 296f658c1bfSPiyou Chen // CHECK: resolver_return: 297f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo5._zba 298f658c1bfSPiyou Chen // CHECK: resolver_else: 299f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 300f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 402653184 301f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 402653184 302f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] 303f658c1bfSPiyou Chen // CHECK: resolver_return1: 304f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo5._zba_zbb 305f658c1bfSPiyou Chen // CHECK: resolver_else2: 306f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 307f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456 308f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456 309f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]] 310f658c1bfSPiyou Chen // CHECK: resolver_return3: 311f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo5._zbb 312f658c1bfSPiyou Chen // CHECK: resolver_else4: 313f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo5.default 314f658c1bfSPiyou Chen // 315f658c1bfSPiyou Chen // 316f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @foo6.resolver() comdat { 317f658c1bfSPiyou Chen // CHECK-NEXT: resolver_entry: 318f658c1bfSPiyou Chen // CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null) 319f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 320f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184 321f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184 322f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]] 323f658c1bfSPiyou Chen // CHECK: resolver_return: 324f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo6._zba_zbb 325f658c1bfSPiyou Chen // CHECK: resolver_else: 326f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 327f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 134217728 328f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 134217728 329f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] 330f658c1bfSPiyou Chen // CHECK: resolver_return1: 331f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo6._zba 332f658c1bfSPiyou Chen // CHECK: resolver_else2: 333f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 334f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 268435456 335f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 268435456 336f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]] 337f658c1bfSPiyou Chen // CHECK: resolver_return3: 338f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo6._zbb 339f658c1bfSPiyou Chen // CHECK: resolver_else4: 340f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo6.default 341f658c1bfSPiyou Chen // 342f658c1bfSPiyou Chen // 343f658c1bfSPiyou Chen // CHECK-LABEL: define weak_odr ptr @foo7.resolver() comdat { 344f658c1bfSPiyou Chen // CHECK-NEXT: resolver_entry: 345f658c1bfSPiyou Chen // CHECK-NEXT: call void @__init_riscv_feature_bits(ptr null) 346f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 347f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 402653184 348f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 402653184 349f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP2]], label [[RESOLVER_RETURN:%.*]], label [[RESOLVER_ELSE:%.*]] 350f658c1bfSPiyou Chen // CHECK: resolver_return: 351f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo7._zba_zbb 352f658c1bfSPiyou Chen // CHECK: resolver_else: 353f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 354f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 268435456 355f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], 268435456 356f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP5]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] 357f658c1bfSPiyou Chen // CHECK: resolver_return1: 358f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo7._zbb 359f658c1bfSPiyou Chen // CHECK: resolver_else2: 360f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr getelementptr inbounds ({ i32, [2 x i64] }, ptr @__riscv_feature_bits, i32 0, i32 1, i32 0), align 8 361f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP6]], 134217728 362f658c1bfSPiyou Chen // CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[TMP7]], 134217728 363f658c1bfSPiyou Chen // CHECK-NEXT: br i1 [[TMP8]], label [[RESOLVER_RETURN3:%.*]], label [[RESOLVER_ELSE4:%.*]] 364f658c1bfSPiyou Chen // CHECK: resolver_return3: 365f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo7._zba 366f658c1bfSPiyou Chen // CHECK: resolver_else4: 367f658c1bfSPiyou Chen // CHECK-NEXT: ret ptr @foo7.default 368f658c1bfSPiyou Chen // 369f658c1bfSPiyou Chen //. 370f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+d,+f,+i,+v,+zicsr,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b" } 371f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i" } 372f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+zbb" } 373f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+m,+zmmul" } 374f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+c,+i,+zbb" } 375f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR5]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+zba" } 376f658c1bfSPiyou Chen // CHECK: attributes #[[ATTR6]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+i,+zba,+zbb" } 377f658c1bfSPiyou Chen //. 378f658c1bfSPiyou Chen // CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} 379f658c1bfSPiyou Chen // CHECK: [[META1:![0-9]+]] = !{i32 1, !"target-abi", !"lp64"} 380f658c1bfSPiyou Chen // CHECK: [[META2:![0-9]+]] = !{i32 6, !"riscv-isa", [[META3:![0-9]+]]} 381f658c1bfSPiyou Chen // CHECK: [[META3]] = !{!"rv64i2p1"} 382f658c1bfSPiyou Chen // CHECK: [[META4:![0-9]+]] = !{i32 8, !"SmallDataLimit", i32 0} 383f658c1bfSPiyou Chen // CHECK: [[META5:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"} 384f658c1bfSPiyou Chen //. 385