@@ -56,6 +56,110 @@ TEST_F(GISelMITest, TestKnownBitsCstWithClass) {
56
56
EXPECT_EQ (Res.Zero .getZExtValue (), Res2.Zero .getZExtValue ());
57
57
}
58
58
59
+ // Check that we are able to track bits through PHIs
60
+ // and get the intersections of everything we know on each operand.
61
+ TEST_F (GISelMITest, TestKnownBitsCstPHI) {
62
+ StringRef MIRString = " bb.10:\n "
63
+ " %10:_(s8) = G_CONSTANT i8 3\n "
64
+ " %11:_(s1) = G_IMPLICIT_DEF\n "
65
+ " G_BRCOND %11(s1), %bb.11\n "
66
+ " G_BR %bb.12\n "
67
+ " \n "
68
+ " bb.11:\n "
69
+ " %12:_(s8) = G_CONSTANT i8 2\n "
70
+ " G_BR %bb.12\n "
71
+ " \n "
72
+ " bb.12:\n "
73
+ " %13:_(s8) = PHI %10(s8), %bb.10, %12(s8), %bb.11\n "
74
+ " %14:_(s8) = COPY %13\n " ;
75
+ setUp (MIRString);
76
+ if (!TM)
77
+ return ;
78
+ Register CopyReg = Copies[Copies.size () - 1 ];
79
+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
80
+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
81
+ Register DstReg = FinalCopy->getOperand (0 ).getReg ();
82
+ GISelKnownBits Info (*MF);
83
+ KnownBits Res = Info.getKnownBits (SrcReg);
84
+ EXPECT_EQ ((uint64_t )2 , Res.One .getZExtValue ());
85
+ EXPECT_EQ ((uint64_t )0xfc , Res.Zero .getZExtValue ());
86
+
87
+ KnownBits Res2 = Info.getKnownBits (DstReg);
88
+ EXPECT_EQ (Res.One .getZExtValue (), Res2.One .getZExtValue ());
89
+ EXPECT_EQ (Res.Zero .getZExtValue (), Res2.Zero .getZExtValue ());
90
+ }
91
+
92
+ // Check that we report we know nothing when we hit a
93
+ // non-generic register.
94
+ // Note: this could be improved though!
95
+ TEST_F (GISelMITest, TestKnownBitsCstPHIToNonGenericReg) {
96
+ StringRef MIRString = " bb.10:\n "
97
+ " %10:gpr32 = MOVi32imm 3\n "
98
+ " %11:_(s1) = G_IMPLICIT_DEF\n "
99
+ " G_BRCOND %11(s1), %bb.11\n "
100
+ " G_BR %bb.12\n "
101
+ " \n "
102
+ " bb.11:\n "
103
+ " %12:_(s8) = G_CONSTANT i8 2\n "
104
+ " G_BR %bb.12\n "
105
+ " \n "
106
+ " bb.12:\n "
107
+ " %13:_(s8) = PHI %10, %bb.10, %12(s8), %bb.11\n "
108
+ " %14:_(s8) = COPY %13\n " ;
109
+ setUp (MIRString);
110
+ if (!TM)
111
+ return ;
112
+ Register CopyReg = Copies[Copies.size () - 1 ];
113
+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
114
+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
115
+ Register DstReg = FinalCopy->getOperand (0 ).getReg ();
116
+ GISelKnownBits Info (*MF);
117
+ KnownBits Res = Info.getKnownBits (SrcReg);
118
+ EXPECT_EQ ((uint64_t )0 , Res.One .getZExtValue ());
119
+ EXPECT_EQ ((uint64_t )0 , Res.Zero .getZExtValue ());
120
+
121
+ KnownBits Res2 = Info.getKnownBits (DstReg);
122
+ EXPECT_EQ (Res.One .getZExtValue (), Res2.One .getZExtValue ());
123
+ EXPECT_EQ (Res.Zero .getZExtValue (), Res2.Zero .getZExtValue ());
124
+ }
125
+
126
+ // Check that we manage to process PHIs that loop on themselves.
127
+ // For now, the analysis just stops and assumes it knows nothing,
128
+ // eventually we could teach it how to properly track phis that
129
+ // loop back.
130
+ TEST_F (GISelMITest, TestKnownBitsCstPHIWithLoop) {
131
+ StringRef MIRString =
132
+ " bb.10:\n "
133
+ " %10:_(s8) = G_CONSTANT i8 3\n "
134
+ " %11:_(s1) = G_IMPLICIT_DEF\n "
135
+ " G_BRCOND %11(s1), %bb.11\n "
136
+ " G_BR %bb.12\n "
137
+ " \n "
138
+ " bb.11:\n "
139
+ " %12:_(s8) = G_CONSTANT i8 2\n "
140
+ " G_BR %bb.12\n "
141
+ " \n "
142
+ " bb.12:\n "
143
+ " %13:_(s8) = PHI %10(s8), %bb.10, %12(s8), %bb.11, %14(s8), %bb.12\n "
144
+ " %14:_(s8) = COPY %13\n "
145
+ " G_BR %bb.12\n " ;
146
+ setUp (MIRString);
147
+ if (!TM)
148
+ return ;
149
+ Register CopyReg = Copies[Copies.size () - 1 ];
150
+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
151
+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
152
+ Register DstReg = FinalCopy->getOperand (0 ).getReg ();
153
+ GISelKnownBits Info (*MF);
154
+ KnownBits Res = Info.getKnownBits (SrcReg);
155
+ EXPECT_EQ ((uint64_t )0 , Res.One .getZExtValue ());
156
+ EXPECT_EQ ((uint64_t )0 , Res.Zero .getZExtValue ());
157
+
158
+ KnownBits Res2 = Info.getKnownBits (DstReg);
159
+ EXPECT_EQ (Res.One .getZExtValue (), Res2.One .getZExtValue ());
160
+ EXPECT_EQ (Res.Zero .getZExtValue (), Res2.Zero .getZExtValue ());
161
+ }
162
+
59
163
TEST_F (GISelMITest, TestKnownBitsPtrToIntViceVersa) {
60
164
StringRef MIRString = " %3:_(s16) = G_CONSTANT i16 256\n "
61
165
" %4:_(p0) = G_INTTOPTR %3\n "
0 commit comments