@@ -2085,6 +2085,76 @@ TEST_F(ValueTrackingTest, KnownNonZeroFromDomCond2) {
2085
2085
EXPECT_EQ (isKnownNonZero (A, DL, 0 , &AC, CxtI2, &DT), false );
2086
2086
}
2087
2087
2088
+ TEST_F (ValueTrackingTest, KnownNonZeroFromRangeAttributeArgument) {
2089
+ parseAssembly (R"(
2090
+ define i8 @test(i8 range(i8 1, 5) %q) {
2091
+ %A = bitcast i8 %q to i8
2092
+ ret i8 %A
2093
+ }
2094
+ )" );
2095
+ const DataLayout &DL = M->getDataLayout ();
2096
+ EXPECT_TRUE (isKnownNonZero (A, DL, 0 ));
2097
+ }
2098
+
2099
+ TEST_F (ValueTrackingTest, PossibleZeroFromRangeAttributeArgument) {
2100
+ parseAssembly (R"(
2101
+ define i8 @test(i8 range(i8 0, 5) %q) {
2102
+ %A = bitcast i8 %q to i8
2103
+ ret i8 %A
2104
+ }
2105
+ )" );
2106
+ const DataLayout &DL = M->getDataLayout ();
2107
+ EXPECT_FALSE (isKnownNonZero (A, DL, 0 ));
2108
+ }
2109
+
2110
+ TEST_F (ValueTrackingTest, KnownNonZeroFromCallRangeAttribute) {
2111
+ parseAssembly (R"(
2112
+ declare i8 @f()
2113
+ define i8 @test() {
2114
+ %A = call range(i8 1, 5) i8 @f()
2115
+ ret i8 %A
2116
+ }
2117
+ )" );
2118
+ const DataLayout &DL = M->getDataLayout ();
2119
+ EXPECT_TRUE (isKnownNonZero (A, DL, 0 ));
2120
+ }
2121
+
2122
+ TEST_F (ValueTrackingTest, PossibleZeroFromCallRangeAttribute) {
2123
+ parseAssembly (R"(
2124
+ declare i8 @f()
2125
+ define i8 @test() {
2126
+ %A = call range(i8 0, 5) i8 @f()
2127
+ ret i8 %A
2128
+ }
2129
+ )" );
2130
+ const DataLayout &DL = M->getDataLayout ();
2131
+ EXPECT_FALSE (isKnownNonZero (A, DL, 0 ));
2132
+ }
2133
+
2134
+ TEST_F (ValueTrackingTest, KnownNonZeroFromRangeAttributeResult) {
2135
+ parseAssembly (R"(
2136
+ declare range(i8 1, 5) i8 @f()
2137
+ define i8 @test() {
2138
+ %A = call i8 @f()
2139
+ ret i8 %A
2140
+ }
2141
+ )" );
2142
+ const DataLayout &DL = M->getDataLayout ();
2143
+ EXPECT_TRUE (isKnownNonZero (A, DL, 0 ));
2144
+ }
2145
+
2146
+ TEST_F (ValueTrackingTest, PossibleZeroFromRangeAttributeResult) {
2147
+ parseAssembly (R"(
2148
+ declare range(i8 0, 5) i8 @f()
2149
+ define i8 @test() {
2150
+ %A = call i8 @f()
2151
+ ret i8 %A
2152
+ }
2153
+ )" );
2154
+ const DataLayout &DL = M->getDataLayout ();
2155
+ EXPECT_FALSE (isKnownNonZero (A, DL, 0 ));
2156
+ }
2157
+
2088
2158
TEST_F (ValueTrackingTest, IsImpliedConditionAnd) {
2089
2159
parseAssembly (R"(
2090
2160
define void @test(i32 %x, i32 %y) {
@@ -2601,6 +2671,38 @@ TEST_F(ComputeKnownBitsTest, ComputeKnownBitsAbsoluteSymbol) {
2601
2671
EXPECT_EQ (0u , Known_0_256_Align8.countMinTrailingOnes ());
2602
2672
}
2603
2673
2674
+ TEST_F (ComputeKnownBitsTest, KnownBitsFromRangeAttributeArgument) {
2675
+ parseAssembly (R"(
2676
+ define i8 @test(i8 range(i8 80, 84) %q) {
2677
+ %A = bitcast i8 %q to i8
2678
+ ret i8 %A
2679
+ }
2680
+ )" );
2681
+ expectKnownBits (/* zero*/ 172u , /* one*/ 80u );
2682
+ }
2683
+
2684
+ TEST_F (ComputeKnownBitsTest, KnownBitsFromCallRangeAttribute) {
2685
+ parseAssembly (R"(
2686
+ declare i8 @f()
2687
+ define i8 @test() {
2688
+ %A = call range(i8 80, 84) i8 @f()
2689
+ ret i8 %A
2690
+ }
2691
+ )" );
2692
+ expectKnownBits (/* zero*/ 172u , /* one*/ 80u );
2693
+ }
2694
+
2695
+ TEST_F (ComputeKnownBitsTest, KnownBitsFromRangeAttributeResult) {
2696
+ parseAssembly (R"(
2697
+ declare range(i8 80, 84) i8 @f()
2698
+ define i8 @test() {
2699
+ %A = call i8 @f()
2700
+ ret i8 %A
2701
+ }
2702
+ )" );
2703
+ expectKnownBits (/* zero*/ 172u , /* one*/ 80u );
2704
+ }
2705
+
2604
2706
TEST_F (ValueTrackingTest, HaveNoCommonBitsSet) {
2605
2707
{
2606
2708
// Check for an inverted mask: (X & ~M) op (Y & M).
@@ -3125,6 +3227,41 @@ TEST_F(ValueTrackingTest, ComputeConstantRange) {
3125
3227
}
3126
3228
}
3127
3229
3230
+ TEST_F (ValueTrackingTest, ComputeConstantRangeFromRangeAttributeArgument) {
3231
+ parseAssembly (R"(
3232
+ define i8 @test(i8 range(i8 32, 36) %q) {
3233
+ %A = bitcast i8 %q to i8
3234
+ ret i8 %A
3235
+ }
3236
+ )" );
3237
+ EXPECT_EQ (computeConstantRange (F->arg_begin (), false ),
3238
+ ConstantRange (APInt (8 , 32 ), APInt (8 , 36 )));
3239
+ }
3240
+
3241
+ TEST_F (ValueTrackingTest, ComputeConstantRangeFromCallRangeAttribute) {
3242
+ parseAssembly (R"(
3243
+ declare i8 @f()
3244
+ define i8 @test() {
3245
+ %A = call range(i8 32, 36) i8 @f()
3246
+ ret i8 %A
3247
+ }
3248
+ )" );
3249
+ EXPECT_EQ (computeConstantRange (A, false ),
3250
+ ConstantRange (APInt (8 , 32 ), APInt (8 , 36 )));
3251
+ }
3252
+
3253
+ TEST_F (ValueTrackingTest, ComputeConstantRangeFromRangeAttributeResult) {
3254
+ parseAssembly (R"(
3255
+ declare range(i8 32, 36) i8 @f()
3256
+ define i8 @test() {
3257
+ %A = call i8 @f()
3258
+ ret i8 %A
3259
+ }
3260
+ )" );
3261
+ EXPECT_EQ (computeConstantRange (A, false ),
3262
+ ConstantRange (APInt (8 , 32 ), APInt (8 , 36 )));
3263
+ }
3264
+
3128
3265
struct FindAllocaForValueTestParams {
3129
3266
const char *IR;
3130
3267
bool AnyOffsetResult;
0 commit comments