[llvm] 8eccf2b - [X86] Set Uses = [EFLAGS] for ADCX/ADOX
Shengchen Kan via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 21 07:01:20 PST 2023
Author: Shengchen Kan
Date: 2023-12-21T23:01:00+08:00
New Revision: 8eccf2b872cc1a88a1e5d4e5af0bfdabfb66c7bb
URL: https://github.com/llvm/llvm-project/commit/8eccf2b872cc1a88a1e5d4e5af0bfdabfb66c7bb
DIFF: https://github.com/llvm/llvm-project/commit/8eccf2b872cc1a88a1e5d4e5af0bfdabfb66c7bb.diff
LOG: [X86] Set Uses = [EFLAGS] for ADCX/ADOX
According to Intel SDE, ADCX reads CF and ADOX reads OF. `Uses` was
set to empty by accident, the bug was not exposed b/c compiler never
emits these instructions.
Added:
Modified:
llvm/lib/Target/X86/X86InstrArithmetic.td
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86InstrArithmetic.td b/llvm/lib/Target/X86/X86InstrArithmetic.td
index dad8818b1c3b7d..87feb7dc3b4eef 100644
--- a/llvm/lib/Target/X86/X86InstrArithmetic.td
+++ b/llvm/lib/Target/X86/X86InstrArithmetic.td
@@ -102,7 +102,7 @@ class BinOpRM_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node>
(t.LoadNode addr:$src2)))]>, DefEFLAGS;
// BinOpRMF_RF - Instructions that read "reg, [mem]", write "reg" and read/write
// EFLAGS.
-class BinOpRMF_RF<bits<8> o, string m, X86TypeInfo t, SDNode node>
+class BinOpRMF_RF<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node>
: BinOpRM<o, m, t, (outs t.RegClass:$dst),
[(set t.RegClass:$dst, EFLAGS,
(node t.RegClass:$src1, (t.LoadNode addr:$src2), EFLAGS))]>,
@@ -1189,34 +1189,24 @@ let Uses = [RDX] in
// We don't have patterns for these as there is no advantage over ADC for
// most code.
class ADCOXOpRR <string m, X86TypeInfo t>
- : BinOpRR_RF<0xF6, m, t, null_frag> {
- let OpSize = OpSizeFixed;
+ : BinOpRRF_RF<0xF6, m, t, null_frag> {
let Form = MRMSrcReg;
let isCommutable = 1;
}
class ADCOXOpRM <string m, X86TypeInfo t>
- : BinOpRM_RF<0xF6, m, t, null_frag> {
- let OpSize = OpSizeFixed;
+ : BinOpRMF_RF<0xF6, m, t, null_frag> {
let Form = MRMSrcMem;
}
-let Predicates = [HasADX], Constraints = "$src1 = $dst" in {
- let SchedRW = [WriteADC] in {
- def ADCX32rr : ADCOXOpRR<"adcx", Xi32>, T8PD;
- def ADCX64rr : ADCOXOpRR<"adcx", Xi64>, T8PD;
- def ADOX32rr : ADCOXOpRR<"adox", Xi32>, T8XS;
- def ADOX64rr : ADCOXOpRR<"adox", Xi64>, T8XS;
- }
-
- let SchedRW = [WriteADC.Folded, WriteADC.ReadAfterFold,
- // Memory operand.
- ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault,
- // Implicit read of EFLAGS
- WriteADC.ReadAfterFold] in {
- def ADCX32rm : ADCOXOpRM<"adcx", Xi32>, T8PD;
- def ADCX64rm : ADCOXOpRM<"adcx", Xi64>, T8PD;
- def ADOX32rm : ADCOXOpRM<"adox", Xi32>, T8XS;
- def ADOX64rm : ADCOXOpRM<"adox", Xi64>, T8XS;
- }
+let OpSize = OpSizeFixed, Constraints = "$src1 = $dst",
+ Predicates = [HasADX] in {
+def ADCX32rr : ADCOXOpRR<"adcx", Xi32>, T8PD;
+def ADCX64rr : ADCOXOpRR<"adcx", Xi64>, T8PD;
+def ADOX32rr : ADCOXOpRR<"adox", Xi32>, T8XS;
+def ADOX64rr : ADCOXOpRR<"adox", Xi64>, T8XS;
+def ADCX32rm : ADCOXOpRM<"adcx", Xi32>, T8PD;
+def ADCX64rm : ADCOXOpRM<"adcx", Xi64>, T8PD;
+def ADOX32rm : ADCOXOpRM<"adox", Xi32>, T8XS;
+def ADOX64rm : ADCOXOpRM<"adox", Xi64>, T8XS;
}
More information about the llvm-commits
mailing list